Prometheus exporter for Starlette and FastAPI.
The middleware collects basic metrics:
- Counter: starlette_requests_total
- Histogram: starlette_request_duration_seconds
Metrics include labels for the HTTP method, the path, and the response status code.
starlette_requests_total{method="GET",path="/",status_code="200"} 1.0
starlette_request_duration_seconds_bucket{le="0.01",method="GET",path="/",status_code="200"} 1.0
Use the HTTP handler handle_metrics
at path /metrics
to expose a metrics endpoint to Prometheus.
pip install starlette_exporter
from starlette.applications import Starlette
from starlette_exporter import PrometheusMiddleware, handle_metrics
app = Starlette()
app.add_middleware(PrometheusMiddleware)
app.add_route("/metrics", handle_metrics)
...
from fastapi import FastAPI
from starlette_exporter import PrometheusMiddleware, handle_metrics
app = FastAPI()
app.add_middleware(PrometheusMiddleware)
app.add_route("/metrics", handle_metrics)
...
app_name
: Sets the value of the app_name
label for exported metrics (default: starlette
).
group_paths
: setting this to True
will populate the path label using named parameters (if any) in the router path, e.g. /api/v1/items/{item_id}
. This will group requests together by endpoint (regardless of the value of item_id
). This option may come with a performance hit for larger routers. Default is False
, which will result in separate metrics for different URLs (e.g., /api/v1/items/42
, /api/v1/items/43
, etc.).
prefix
: Sets the prefix of the exported metric names (default: starlette
).
Example:
app.add_middleware(PrometheusMiddleware, app_name="hello_world", group_paths=True, prefix='myapp')
starlette_exporter will export all the prometheus metrics from the process, so custom metrics can be created by using the prometheus_client API.
from prometheus_client import Counter
from starlette.responses import RedirectResponse
REDIRECT_COUNT = Counter("redirect_total", "Count of redirects", ("from",))
async def some_view(request):
REDIRECT_COUNT.labels(from="some_view").inc()
return RedirectResponse(url="https://example.com", status_code=302)
The new metric will now be included in the the /metrics
endpoint output:
...
redirect_total{from="some_view"} 2.0
...
git clone https://github.com/stephenhillier/starlette_exporter
cd starlette_exporter
pytest tests
Code released under the Apache License, Version 2.0.
https://github.com/prometheus/client_python
https://github.com/encode/starlette
Starlette - https://github.com/encode/starlette
FastAPI - https://github.com/tiangolo/fastapi
Flask exporter - https://github.com/rycus86/prometheus_flask_exporter
Alternate Starlette exporter - https://github.com/perdy/starlette-prometheus