Метрики (Prometheus)¶
Инструментируем каждый запрос¶
# Middleware/__init__.py
from endocore.middleware import metrics_middleware
middlewares = [metrics_middleware()]
Это считает каждый запрос (endocore_http_requests_total, с метками
method/route/status) и замеряет его время
(endocore_http_request_duration_seconds, с метками method/route).
Метка route — это сырой путь
/v1/user/42 и /v1/user/43 — два разных значения метки, а не один
шаблонный /v1/user/{id} — роутер сегодня не отдаёт наружу
сматченный паттерн. На пути с большим числом разных id под нагрузкой
это много временных рядов; следите за кардинальностью перед тем, как
навешивать это на высоконагруженный динамический маршрут.
Регистрируем реестр (опционально)¶
По умолчанию middleware использует свой собственный реестр на весь процесс.
Зарегистрируйте его через MetricsExtension, если хотите ещё и внедрять его
в хендлер (например, чтобы самому отдать /metrics):
# 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())]
Отдаём /metrics¶
Здесь нет специального маршрута — как и всё остальное в EndoCore, это просто файл:
# 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)
Поставьте перед ним ip_allowlist_middleware (или
вообще не выводите его в публичный роутер) — эндпоинты метрик обычно
скрейпятся изнутри кластера, а не из интернета.