File size: 1,055 Bytes
cd0c7a9 | 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 | """Middleware that injects a request ID into every request and log context."""
from __future__ import annotations
import time
import uuid
from fastapi import Request
from starlette.middleware.base import BaseHTTPMiddleware
from app.logging_config import request_id_var, user_id_var
class RequestIDMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request: Request, call_next):
rid = request.headers.get("X-Request-ID") or uuid.uuid4().hex[:16]
request_id_var.set(rid)
start = time.perf_counter()
response = await call_next(request)
elapsed_ms = round((time.perf_counter() - start) * 1000)
response.headers["X-Request-ID"] = rid
response.headers["X-Response-Time"] = f"{elapsed_ms}ms"
# Log the request
import logging
logger = logging.getLogger("access")
logger.info(
"%s %s %d %dms",
request.method,
request.url.path,
response.status_code,
elapsed_ms,
)
return response
|