Skip to content

Metrics (Prometheus)

pip install "endocore[metrics]"

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.