11"""Request tracking middleware for correlation IDs and request logging."""
22
3+ from collections .abc import Awaitable , Callable
34import time
45import uuid
5- from typing import Callable
66
77from fastapi import Request , Response
88from loguru import logger
@@ -21,15 +21,19 @@ class RequestTrackingMiddleware(BaseHTTPMiddleware):
2121 - Logs request start/end with timing information
2222 """
2323
24- async def dispatch (self , request : Request , call_next : Callable ) -> Response :
24+ async def dispatch (
25+ self , request : Request , call_next : Callable [[Request ], Awaitable [Response ]]
26+ ) -> Response :
2527 """
2628 Process each request with correlation ID tracking.
2729
28- Args:
30+ Args
31+ ----
2932 request: Incoming FastAPI request
3033 call_next: Next middleware/handler in chain
3134
32- Returns:
35+ Returns
36+ -------
3337 Response with X-Request-ID header added
3438 """
3539 # Get or generate request ID
@@ -43,13 +47,12 @@ async def dispatch(self, request: Request, call_next: Callable) -> Response:
4347 # Log request start
4448 start_time = time .time ()
4549 logger .info (
46- f"Request started: { request .method } { request .url .path } "
47- f"[request_id={ request_id } ]"
50+ f"Request started: { request .method } { request .url .path } [request_id={ request_id } ]"
4851 )
4952
5053 try :
5154 # Process request
52- response = await call_next (request )
55+ response : Response = await call_next (request )
5356
5457 # Calculate duration
5558 duration = time .time () - start_time
@@ -64,15 +67,12 @@ async def dispatch(self, request: Request, call_next: Callable) -> Response:
6467 f"[request_id={ request_id } ]"
6568 )
6669
67- return response
68-
69- except Exception as e :
70+ except Exception :
7071 # Log error with request ID
7172 duration = time .time () - start_time
72- logger .error (
73+ logger .exception (
7374 f"Request failed: { request .method } { request .url .path } "
74- f"error={ str (e )} duration={ duration :.3f} s "
75- f"[request_id={ request_id } ]" ,
76- exc_info = True
75+ f"duration={ duration :.3f} s [request_id={ request_id } ]"
7776 )
7877 raise
78+ return response
0 commit comments