22Request context middleware for automatic trace_id injection.
33"""
44
5+ import time
6+
57from collections .abc import Callable
68
79from starlette .middleware .base import BaseHTTPMiddleware
@@ -38,8 +40,19 @@ async def dispatch(self, request: Request, call_next: Callable) -> Response:
3840 # Extract or generate trace_id
3941 trace_id = extract_trace_id_from_headers (request ) or generate_trace_id ()
4042
43+ env = request .headers .get ("x-env" )
44+ user_type = request .headers .get ("x-user-type" )
45+ user_name = request .headers .get ("x-user-name" )
46+ start_time = time .time ()
47+
4148 # Create and set request context
42- context = RequestContext (trace_id = trace_id , api_path = request .url .path )
49+ context = RequestContext (
50+ trace_id = trace_id ,
51+ api_path = request .url .path ,
52+ env = env ,
53+ user_type = user_type ,
54+ user_name = user_name ,
55+ )
4356 set_request_context (context )
4457
4558 # Log request start with parameters
@@ -49,15 +62,25 @@ async def dispatch(self, request: Request, call_next: Callable) -> Response:
4962 if request .query_params :
5063 params_log ["query_params" ] = dict (request .query_params )
5164
52- logger .info (f"Request started: { request . method } { request .url . path } , { params_log } " )
65+ logger .info (f"Request started, params : { params_log } , headers: { request .headers } " )
5366
5467 # Process the request
55- response = await call_next (request )
56-
57- # Log request completion with output
58- logger .info (f"Request completed: { request .url .path } , status: { response .status_code } " )
59-
60- # Add trace_id to response headers for debugging
61- response .headers ["x-trace-id" ] = trace_id
68+ try :
69+ response = await call_next (request )
70+ end_time = time .time ()
71+ if response .status_code == 200 :
72+ logger .info (
73+ f"Request completed: { request .url .path } , status: { response .status_code } , cost: { (end_time - start_time ) * 1000 :.2f} ms"
74+ )
75+ else :
76+ logger .error (
77+ f"Request Failed: { request .url .path } , status: { response .status_code } , cost: { (end_time - start_time ) * 1000 :.2f} ms"
78+ )
79+ except Exception as e :
80+ end_time = time .time ()
81+ logger .error (
82+ f"Request Exception Error: { e } , cost: { (end_time - start_time ) * 1000 :.2f} ms"
83+ )
84+ raise e
6285
6386 return response
0 commit comments