ymt-python / middleware /trace.py
hsailorj's picture
Add application file
551658a
Raw
History Blame Contribute Delete
925 Bytes
from fastapi import Request, Response
from starlette.middleware.base import BaseHTTPMiddleware
import uuid
from contextvars import ContextVar
# 创建一个上下文变量来存储 trace_id
trace_id_var = ContextVar('trace_id', default=None)
class TraceMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request: Request, call_next) -> Response:
# 生成唯一的 trace_id
trace_id = str(uuid.uuid4())
# 设置上下文变量
token = trace_id_var.set(trace_id)
try:
# 处理请求
response = await call_next(request)
# 将 trace_id 添加到响应头中
response.headers['X-Trace-ID'] = trace_id
return response
finally:
# 清理上下文变量
trace_id_var.reset(token)
def get_trace_id():
"""获取当前请求的 trace_id"""
return trace_id_var.get()