feat(core): TraceMiddleware для проброса X-Trace-Id

- читает X-Trace-Id из запроса или генерит новый ULID
- кладёт trace_id в ContextVar на время запроса
- возвращает X-Trace-Id в заголовке ответа
This commit is contained in:
Returner_org 2026-06-28 15:13:33 +03:00
parent 8b243355aa
commit a26ec5e268

View File

@ -0,0 +1,24 @@
from starlette.middleware.base import BaseHTTPMiddleware, RequestResponseEndpoint
from starlette.requests import Request
from starlette.responses import Response
from ulid import ULID
from elexam_core.context import trace_id_context
TRACE_HEADER: str = "X-Trace-Id"
class TraceMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request: Request, call_next: RequestResponseEndpoint) -> Response:
header_trace_id = request.headers.get(TRACE_HEADER, default=None)
trace_id = header_trace_id or str(ULID())
token = trace_id_context.set(trace_id)
try:
response = await call_next(request)
finally:
trace_id_context.reset(token)
response.headers[TRACE_HEADER] = trace_id
return response