007 add telemetry

This commit is contained in:
Раис Юсупалиев
2026-03-08 11:43:15 +03:00
parent 150675cc75
commit 8d47917ba2
15 changed files with 952 additions and 62 deletions
+48 -3
View File
@@ -1,10 +1,55 @@
"""HTTP middleware registration."""
from fastapi import FastAPI
from uuid import uuid4
from time import perf_counter
from fastapi import FastAPI, Request
from starlette.middleware.base import BaseHTTPMiddleware
from starlette.responses import Response
from structlog.contextvars import bind_contextvars, clear_contextvars
from app.observability.metrics import get_metrics
class RequestCorrelationMiddleware(BaseHTTPMiddleware):
"""Assign and propagate request correlation identifiers."""
def __init__(self, app: FastAPI, *, request_id_header: str) -> None:
super().__init__(app)
self._request_id_header = request_id_header
async def dispatch(self, request: Request, call_next) -> Response:
request_id = str(uuid4())
request.state.request_id = request_id
bind_contextvars(request_id=request_id)
started_at = perf_counter()
status_code = 500
is_error = True
try:
response = await call_next(request)
status_code = response.status_code
is_error = status_code >= 500
response.headers[self._request_id_header] = request_id
return response
finally:
duration_ms = (perf_counter() - started_at) * 1000
get_metrics().record_http_request(
method=request.method,
route=request.url.path,
status_code=status_code,
duration_ms=duration_ms,
is_error=is_error,
)
clear_contextvars()
def install_middleware(app: FastAPI) -> None:
"""Register middleware components for the API."""
# Middleware stack is introduced in later tasks.
_ = app
settings = app.state.settings
app.add_middleware(
RequestCorrelationMiddleware,
request_id_header=settings.controller.request_id_header,
)