middleware.py 943 B

1234567891011121314151617181920212223242526272829303132
  1. from __future__ import annotations
  2. import logging
  3. import time
  4. from uuid import uuid4
  5. from starlette.middleware.base import BaseHTTPMiddleware
  6. from starlette.requests import Request
  7. from app.core.config import settings
  8. logger = logging.getLogger("vent_platform.http")
  9. class RequestContextMiddleware(BaseHTTPMiddleware):
  10. async def dispatch(self, request: Request, call_next):
  11. trace_id = request.headers.get(settings.request_trace_header) or uuid4().hex
  12. request.state.trace_id = trace_id
  13. started = time.perf_counter()
  14. response = await call_next(request)
  15. response.headers[settings.request_trace_header] = trace_id
  16. logger.info(
  17. "%s %s status=%s duration_ms=%.1f trace_id=%s",
  18. request.method,
  19. request.url.path,
  20. response.status_code,
  21. (time.perf_counter() - started) * 1000,
  22. trace_id,
  23. )
  24. return response