Как trace ID попадает в лог
Python
Middle
Без компании
Как trace ID попадает в лог
Ответы
В распределённых системах trace ID передаётся через контекст запроса и автоматически добавляется в логи с помощью инструментов логирования. Вот основные способы:
- **Middleware/Interceptor**
В веб-фреймворках (Django, FastAPI, Flask) middleware добавляет trace ID в контекст запроса и логи:
```
# FastAPI middleware example
from uuid import uuid4
from fastapi import Request
async def add_trace_id(request: Request, call_next):
trace_id = request.headers.get("X-Trace-ID", str(uuid4()))
request.state.trace_id = trace_id
# Логирование с trace_id
logger.info(f"Request started", extra={"trace_id": trace_id})
response = await call_next(request)
return response
```
- **Логгеры с контекстом**
Библиотеки типа `structlog` или `logging` с фильтрами:
```
import logging
from contextvars import ContextVar
trace_id = ContextVar("trace_id")
class TraceFilter(logging.Filter):
def filter(self, record):
record.trace_id = trace_id.get()
return True
logger.addFilter(TraceFilter())
```
- **Инструменты observability**
OpenTelemetry автоматически инжектит trace_id в логи через интеграцию с логгерами.
Ключевое: trace ID должен передаваться через весь контекст выполнения (async/thread-local/contextvars) и подхватываться логгером.