Skip to content

Commit 6b0d14b

Browse files
fix(medcat-service): Fix Prometheus metrics and add unit tests for it (#221)
1 parent 0089599 commit 6b0d14b

File tree

4 files changed

+52
-4
lines changed

4 files changed

+52
-4
lines changed

medcat-service/medcat_service/main.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from fastapi import FastAPI, Request
66
from fastapi.responses import JSONResponse
77

8+
from medcat_service.config import Settings
89
from medcat_service.demo.gradio_demo import io
910
from medcat_service.dependencies import get_settings
1011
from medcat_service.log_config import log_config
@@ -36,10 +37,17 @@
3637

3738
gr.mount_gradio_app(app, io, path="/demo")
3839

39-
if settings.observability.enable_metrics:
40-
from prometheus_fastapi_instrumentator import Instrumentator
4140

42-
Instrumentator(excluded_handlers=["/api/health.*", "/metrics"],).instrument(app).expose(app, tags=["admin"])
41+
def configure_observability(settings: Settings, app: FastAPI):
42+
if settings.observability.enable_metrics:
43+
from prometheus_fastapi_instrumentator import Instrumentator
44+
45+
Instrumentator(
46+
excluded_handlers=["/api/health.*", "/metrics"],
47+
).instrument(app).expose(app, tags=["admin"])
48+
49+
50+
configure_observability(settings, app)
4351

4452

4553
@app.exception_handler(HealthCheckFailedException)

medcat-service/medcat_service/test/test_admin.py

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,30 @@
1+
import sys
12
import unittest
23

34
from fastapi.testclient import TestClient
45

5-
from medcat_service.main import app
6+
from medcat_service.config import ObservabilitySettings, Settings
7+
from medcat_service.main import app, configure_observability
68
from medcat_service.test.common import setup_medcat_processor
79

810

911
class TestAdminApi(unittest.TestCase):
1012
ENDPOINT_INFO_ENDPOINT = "/api/info"
13+
METRICS_ENDPOINT = "/metrics"
14+
15+
def _reload_app(self):
16+
"""
17+
Reload the FastAPI app after env changes
18+
Used to fix this error when trying to change the observability
19+
"Cannot add middleware after an application has started"
20+
"""
21+
# Clear cached imports so settings are re-evaluated
22+
for mod in list(sys.modules):
23+
if mod.startswith("medcat_service"):
24+
sys.modules.pop(mod)
25+
from medcat_service.main import app
26+
27+
return app
1128

1229
def setUp(self):
1330
setup_medcat_processor()
@@ -17,6 +34,26 @@ def testGetInfo(self):
1734
response = self.client.get(self.ENDPOINT_INFO_ENDPOINT)
1835
self.assertEqual(response.status_code, 200)
1936

37+
def test_get_metrics_enabled(self):
38+
settings = Settings(observability=ObservabilitySettings(enable_metrics=True))
39+
app = self._reload_app()
40+
configure_observability(settings, app)
41+
client = TestClient(app)
42+
43+
response = client.get(self.METRICS_ENDPOINT)
44+
self.assertEqual(response.status_code, 200)
45+
self.maxDiff = None
46+
self.assertTrue("http_requests_total" in response.text)
47+
48+
def test_get_metrics_disabled(self):
49+
app = self._reload_app()
50+
settings = Settings(observability=ObservabilitySettings(enable_metrics=False))
51+
configure_observability(settings, app)
52+
self.client = TestClient(app)
53+
54+
response = self.client.get(self.METRICS_ENDPOINT)
55+
self.assertEqual(response.status_code, 404)
56+
2057

2158
if __name__ == "__main__":
2259
unittest.main()

medcat-service/requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,4 @@ fastapi[standard]==0.115.2
1010
pydantic==2.9.2
1111
pydantic-settings==2.10.1
1212
gradio==5.38.0
13+
prometheus-fastapi-instrumentator==7.1.0

medcat-service/start_service_debug.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,6 @@ if [ -z "${APP_MODEL_CDB_PATH}" ] && [ -z "${APP_MODEL_VOCAB_PATH}" ] && [ -z "$
1111
echo "Using default model pack in $APP_MEDCAT_MODEL_PACK"
1212
fi
1313

14+
export APP_ENABLE_METRICS=${APP_ENABLE_METRICS:-True}
15+
1416
fastapi dev medcat_service/main.py

0 commit comments

Comments
 (0)