diff --git a/frigate/http.py b/frigate/http.py index a5f9834eb..9cbe23434 100644 --- a/frigate/http.py +++ b/frigate/http.py @@ -6,6 +6,7 @@ import logging import json import os import subprocess as sp +from prometheus_client import REGISTRY, generate_latest import pytz import time import traceback @@ -35,6 +36,7 @@ from frigate.config import FrigateConfig from frigate.const import CLIPS_DIR, MAX_SEGMENT_DURATION, RECORD_DIR from frigate.models import Event, Recordings from frigate.object_processing import TrackedObject +from frigate.prometheus_exporter import FrigateCollector from frigate.stats import stats_snapshot from frigate.util import ( clean_camera_user_pass, @@ -81,6 +83,8 @@ def create_app( app.register_blueprint(bp) + + return app @@ -820,6 +824,12 @@ def stats(): return jsonify(stats) +@bp.route("/metrics") +def metrics(): + + return generate_latest() + + @bp.route("/") def mjpeg_feed(camera_name): fps = int(request.args.get("fps", "3")) diff --git a/frigate/prometheus_exporter.py b/frigate/prometheus_exporter.py new file mode 100644 index 000000000..66765ca79 --- /dev/null +++ b/frigate/prometheus_exporter.py @@ -0,0 +1,40 @@ +from typing import Dict +import json +import re +import time +import random +from os import path +from urllib.request import urlopen +import yaml +from prometheus_client.core import GaugeMetricFamily, REGISTRY, CounterMetricFamily + + +def add_metric(metric, label, data, key, multiplier=1.0): + try: + string = str(data[key]) + value = float(re.findall(r'\d+', string)[0]) + metric.add_metric([label], value * multiplier) + except (KeyError, TypeError, IndexError): + pass + +class FrigateCollector(object): + + def __init__ (self, metricsobject, dataobject): + self.metricsobject = metricsobject + self.dataobject = dataobject + + + + def collect(self): + + +class PromMetricsClass: + + def __init__(self): + self.metrics = dict() + +class PromDataClass: + + def __init__(self): + self.values_in = dict() + self.values_out = dict()