ForcePilot/backend/server/utils/trace_middleware.py
Kris 12ec5af0de feat: 新增全链路追踪、优雅关停支持与统一异常处理,优化渠道查询接口
1. 新增TraceId中间件实现全链路请求追踪
2. 新增在途请求计数器与中间件支持优雅关停
3. 重构全局异常处理器,统一三模块异常响应格式
4. 优化渠道查询接口,新增多维度过滤与模糊匹配
5. 重构channels模块数据库会话管理,避免事务冲突
6. 新增目录搜索建议与目录导出功能
2026-07-07 16:25:47 +08:00

38 lines
1.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""TraceId 中间件:为每个请求生成/注入 trace_id。
优先从 X-Request-Id header 读取(支持上游链路传递),
否则生成 uuid4。写入 ContextVar 供下游使用。
"""
from __future__ import annotations
from starlette.middleware.base import BaseHTTPMiddleware
from starlette.requests import Request
from starlette.responses import Response
from yuxi.utils.trace_context import (
generate_trace_id,
reset_trace_id,
set_trace_id,
)
_TRACE_ID_HEADER = "X-Request-Id"
class TraceIdMiddleware(BaseHTTPMiddleware):
"""为每个请求注入 trace_id 的中间件。
注册时应最后注册LIFO 顺序中最先执行),确保所有后续中间件、
异常处理器都能从 ContextVar 读取 trace_id。
"""
async def dispatch(self, request: Request, call_next):
trace_id = request.headers.get(_TRACE_ID_HEADER) or generate_trace_id()
set_trace_id(trace_id)
try:
response: Response = await call_next(request)
# 回写 trace_id 到响应头,前端可关联
response.headers[_TRACE_ID_HEADER] = trace_id
return response
finally:
reset_trace_id()