Metrics (Prometheus)¶
Instrument every request¶
# Middleware/__init__.py
from endocore.middleware import metrics_middleware
middlewares = [metrics_middleware()]
This counts every request (endocore_http_requests_total, labeled by
method/route/status) and times it
(endocore_http_request_duration_seconds, labeled by method/route).
The route label is the raw path
/v1/user/42 and /v1/user/43 are two different label values, not one
templated /v1/user/{id} — the router doesn't expose the matched
pattern today. On a path with a lot of distinct ids under load, that's a
lot of time series; keep an eye on cardinality before shipping this to a
high-traffic dynamic route.
Register the registry (optional)¶
By default the middleware uses its own process-wide registry. Register it
via MetricsExtension if you also want it injectable in a handler (e.g. to
expose /metrics yourself):
# extensions.py
from endocore.extensions.metrics import MetricsExtension
extensions = [MetricsExtension()]
# Middleware/__init__.py
from endocore.extensions.metrics import default_registry
from endocore.middleware import metrics_middleware
middlewares = [metrics_middleware(registry=default_registry())]
Expose /metrics¶
There's no special-cased route for this — like everything else in EndoCore, it's just a file:
# Api/Metrics/Get.py
from endocore import Response
from endocore.extensions.metrics import default_registry
from prometheus_client import generate_latest, CONTENT_TYPE_LATEST
async def handler(request):
return Response(generate_latest(default_registry()), media_type=CONTENT_TYPE_LATEST)
Put an ip_allowlist_middleware in front of it (or
keep it off the public router entirely) — metrics endpoints are usually
scraped from inside the cluster, not the internet.