File size: 1,099 Bytes
d1f3f31 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | from __future__ import annotations
import logging
import time
import uuid
from collections.abc import Awaitable, Callable
from fastapi import Request, Response
logger = logging.getLogger("nexus.request")
async def request_context_middleware(
request: Request,
call_next: Callable[[Request], Awaitable[Response]],
) -> Response:
request_id = request.headers.get("x-request-id") or str(uuid.uuid4())
started = time.perf_counter()
response: Response | None = None
try:
response = await call_next(request)
return response
finally:
duration_ms = int((time.perf_counter() - started) * 1000)
status_code = response.status_code if response else 500
if response:
response.headers["x-request-id"] = request_id
logger.info(
"request completed",
extra={
"request_id": request_id,
"method": request.method,
"path": request.url.path,
"status_code": status_code,
"duration_ms": duration_ms,
},
)
|