diff --git a/frigate/api/app.py b/frigate/api/app.py index 721a2edc5..1c52238be 100644 --- a/frigate/api/app.py +++ b/frigate/api/app.py @@ -132,8 +132,12 @@ def metrics(request: Request): # Retrieve the latest statistics and update the Prometheus metrics stats = request.app.stats_emitter.get_latest_stats() # query DB for count of events by camera, label - event_counts: List[Dict[str, Any]] = Event.select(Event.camera, Event.label, fn.Count()).group_by(Event.camera, Event.label).dicts() - + event_counts: List[Dict[str, Any]] = ( + Event.select(Event.camera, Event.label, fn.Count()) + .group_by(Event.camera, Event.label) + .dicts() + ) + update_metrics(stats=stats, event_counts=event_counts) content, content_type = get_metrics() return Response(content=content, media_type=content_type) diff --git a/frigate/stats/prometheus.py b/frigate/stats/prometheus.py index 51ef78483..3fb83f436 100644 --- a/frigate/stats/prometheus.py +++ b/frigate/stats/prometheus.py @@ -459,8 +459,10 @@ class CustomCollector(object): if len(self.all_events) > 0: for event_count in self.all_events: - camera_events.add_metric([event_count['camera'], event_count['label']], event_count['Count']) - + camera_events.add_metric( + [event_count["camera"], event_count["label"]], event_count["Count"] + ) + yield camera_events diff --git a/frigate/test/http_api/test_http_event.py b/frigate/test/http_api/test_http_event.py index 1b75a3276..e35e856f0 100644 --- a/frigate/test/http_api/test_http_event.py +++ b/frigate/test/http_api/test_http_event.py @@ -304,29 +304,99 @@ class TestHttpApp(BaseTestHttp): with TestClient(self.app) as client: ts_start = datetime.now().timestamp() ts_end = ts_start + 30 - _insert_mock_event(id="abcde.random", start=ts_start, end=ts_end, retain=True) - _insert_mock_event(id="01234.random", start=ts_start, end=ts_end, retain=True) - _insert_mock_event(id="56789.random", start=ts_start, end=ts_end, retain=True) - _insert_mock_event(id="101112.random", label="outside", start=ts_start, end=ts_end, retain=True) - _insert_mock_event(id="131415.random", label="outside", start=ts_start, end=ts_end, retain=True) - _insert_mock_event(id="161718.random", camera="porch", start=ts_start, end=ts_end, retain=True) - _insert_mock_event(id="192021.random", camera="porch", start=ts_start, end=ts_end, retain=True) - _insert_mock_event(id="222324.random", camera="porch", label="inside", start=ts_start, end=ts_end, retain=True) - _insert_mock_event(id="252627.random", camera="porch", label="inside", start=ts_start, end=ts_end, retain=True) - _insert_mock_event(id="282930.random", label="inside", start=ts_start, end=ts_end, retain=True) - _insert_mock_event(id="313233.random", label="inside", start=ts_start, end=ts_end, retain=True) - + _insert_mock_event( + id="abcde.random", start=ts_start, end=ts_end, retain=True + ) + _insert_mock_event( + id="01234.random", start=ts_start, end=ts_end, retain=True + ) + _insert_mock_event( + id="56789.random", start=ts_start, end=ts_end, retain=True + ) + _insert_mock_event( + id="101112.random", + label="outside", + start=ts_start, + end=ts_end, + retain=True, + ) + _insert_mock_event( + id="131415.random", + label="outside", + start=ts_start, + end=ts_end, + retain=True, + ) + _insert_mock_event( + id="161718.random", + camera="porch", + start=ts_start, + end=ts_end, + retain=True, + ) + _insert_mock_event( + id="192021.random", + camera="porch", + start=ts_start, + end=ts_end, + retain=True, + ) + _insert_mock_event( + id="222324.random", + camera="porch", + label="inside", + start=ts_start, + end=ts_end, + retain=True, + ) + _insert_mock_event( + id="252627.random", + camera="porch", + label="inside", + start=ts_start, + end=ts_end, + retain=True, + ) + _insert_mock_event( + id="282930.random", + label="inside", + start=ts_start, + end=ts_end, + retain=True, + ) + _insert_mock_event( + id="313233.random", + label="inside", + start=ts_start, + end=ts_end, + retain=True, + ) + stats_emitter = Mock(spec=StatsEmitter) stats_emitter.get_latest_stats.return_value = self.test_stats self.app.stats_emitter = stats_emitter event = client.get(f"/metrics") - + assert "# TYPE frigate_detection_total_fps gauge" in event.text - assert "frigate_detection_total_fps 13.7" in event.text - assert "# HELP frigate_camera_events_total Count of camera events since exporter started" in event.text - assert "# TYPE frigate_camera_events_total counter" in event.text - assert 'frigate_camera_events_total{camera="front_door",label="Mock"} 3.0' in event.text - assert 'frigate_camera_events_total{camera="front_door",label="inside"} 2.0' in event.text - assert 'frigate_camera_events_total{camera="front_door",label="outside"} 2.0' in event.text - assert 'frigate_camera_events_total{camera="porch",label="Mock"} 2.0' in event.text - assert 'frigate_camera_events_total{camera="porch",label="inside"} 2.0' \ No newline at end of file + assert "frigate_detection_total_fps 13.7" in event.text + assert ( + "# HELP frigate_camera_events_total Count of camera events since exporter started" + in event.text + ) + assert "# TYPE frigate_camera_events_total counter" in event.text + assert ( + 'frigate_camera_events_total{camera="front_door",label="Mock"} 3.0' + in event.text + ) + assert ( + 'frigate_camera_events_total{camera="front_door",label="inside"} 2.0' + in event.text + ) + assert ( + 'frigate_camera_events_total{camera="front_door",label="outside"} 2.0' + in event.text + ) + assert ( + 'frigate_camera_events_total{camera="porch",label="Mock"} 2.0' in event.text + ) + assert 'frigate_camera_events_total{camera="porch",label="inside"} 2.0' diff --git a/frigate/test/test_storage.py b/frigate/test/test_storage.py index e5c2eb9b2..4ae5715ca 100644 --- a/frigate/test/test_storage.py +++ b/frigate/test/test_storage.py @@ -261,8 +261,14 @@ class TestHttp(unittest.TestCase): assert Recordings.get(Recordings.id == rec_k3_id) -def _insert_mock_event(id: str, start: int, end: int, retain: bool, camera: str = "front_door", - label: str = "Mock") -> Event: +def _insert_mock_event( + id: str, + start: int, + end: int, + retain: bool, + camera: str = "front_door", + label: str = "Mock", +) -> Event: """Inserts a basic event model with a given id.""" return Event.insert( id=id,