File size: 925 Bytes
551658a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
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()