"""全链路 trace_id 中间件。""" from __future__ import annotations import uuid from starlette.middleware.base import BaseHTTPMiddleware from starlette.requests import Request from starlette.responses import Response class TraceMiddleware(BaseHTTPMiddleware): async def dispatch(self, request: Request, call_next) -> Response: trace_id = request.headers.get("X-Trace-Id") or str(uuid.uuid4()) request.state.trace_id = trace_id response = await call_next(request) response.headers["X-Trace-Id"] = trace_id return response