diff --git a/inventory-app/main.py b/inventory-app/main.py index d709595..f4211f4 100755 --- a/inventory-app/main.py +++ b/inventory-app/main.py @@ -2,6 +2,7 @@ import hashlib import json import secrets +import threading import unicodedata import urllib from collections import Counter @@ -10,6 +11,7 @@ from datetime import datetime, timedelta from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from functools import wraps +from http.server import BaseHTTPRequestHandler, HTTPServer from time import sleep import bleach @@ -17,6 +19,7 @@ import flask import jinja2 import ldap import markdown +import prometheus_client import pymongo import requests import safe @@ -26,6 +29,7 @@ from flask_wtf import FlaskForm, RecaptchaField from jinja2 import Environment, FileSystemLoader from ldap import modlist from markupsafe import Markup +from prometheus_client import start_http_server, Gauge, CollectorRegistry, generate_latest from prometheus_flask_exporter import PrometheusMetrics from pymongo import MongoClient from werkzeug import exceptions @@ -224,9 +228,44 @@ def view_profile(): def view_hello(): return "Hello!" +def get_mac_metrics(): + registry = CollectorRegistry() + inventory_item = Gauge('inventory_item_info', 'Information about inventory item', ['mac', 'slug', 'owner', 'user', 'name'], registry=registry) + items = mongodb.inventory.find( + filter = { "mac": { "$exists": True } }, + projection = { + "mac": 1, + "name": 1, + "shortener.slug": 1, + "inventory.owner": 1, + "inventory.user": 1, + } + ) + for item in items: + inventory_item.labels(mac=item.mac, owner=item.get("owner", {}).get("username"), user=item.get("user", {}).get("username"), slug=item.slug, name=item.name).set(1) + return generate_latest(registry) + +class MetricsHandler(BaseHTTPRequestHandler): + def do_GET(self): + if self.path == '/metrics': + self.send_response(200) + self.send_header('Content-Type', 'text/plain') + self.end_headers() + self.wfile.write(get_mac_metrics()) + else: + self.send_response(404) + self.end_headers() + class MultiCheckboxField(SelectMultipleField): widget = widgets.ListWidget(prefix_label=False) option_widget = widgets.CheckboxInput() if __name__ == '__main__': + if not devenv: + metrics_address = ('', 8000) + httpd = HTTPServer(metrics_address, MetricsHandler) + metrics_thread = threading.Thread(target=httpd.serve_forever) + metrics_thread.daemon = True + metrics_thread.start() + app.run(debug=devenv, host='::') diff --git a/requirements.txt b/requirements.txt index 24057ed..32adada 100644 --- a/requirements.txt +++ b/requirements.txt @@ -13,6 +13,7 @@ safe segno sepa Flask-WTF +prometheus-client prometheus-flask-exporter pymongo python-dateutil