Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Генерация Trace ID в распределённых системах
Trace ID генерируется инструментарием наблюдаемости (Observability) — специальными системами распределённой трассировки.
Основные системы
Jaeger — самая популярная в микросервисной архитектуре:
from jaeger_client import Config
config = Config(
config={
sampler: {type: const, param: 1},
logging: True,
local_agent: {reporting_host: localhost, reporting_port: 6831}
},
service_name=my-service
)
jaeger_tracer = config.initialize_tracer()
OpenTelemetry — современный стандарт:
from opentelemetry import trace, SpanAttributes
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.exporter.jaeger.thrift import JaegerExporter
jaeger_exporter = JaegerExporter(agent_host_name=localhost)
trace.set_tracer_provider(TracerProvider(resource=Resource()))
tracer = trace.get_tracer(__name__)
with tracer.start_as_current_span("request") as span:
span.set_attribute("user_id", 123)
Как генерируется Trace ID?
UUID/Correlation ID:
- Генерируется при первом запросе к системе
- Передаётся в заголовках
X-Trace-IDилиtraceparent - Может быть UUID, большое число или специальный формат
W3C Trace Context стандарт:
traceparent: 00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01
↓ ↓ ↓ ↓
version trace-id span-id flags
Практическая реализация
В FastAPI:
from fastapi import FastAPI, Request
import uuid
app = FastAPI()
@app.middleware("http")
async def trace_middleware(request: Request, call_next):
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
В Django:
import uuid
from django.utils.deprecation import MiddlewareMixin
class TraceIDMiddleware(MiddlewareMixin):
def process_request(self, request):
request.trace_id = request.META.get(HTTP_X_TRACE_ID) or str(uuid.uuid4())
def process_response(self, request, response):
response[X-Trace-ID] = request.trace_id
return response
Использование в логировании
Структурированное логирование:
import logging
import structlog
logger = structlog.get_logger()
logger.info("user_registered", trace_id=trace_id, user_id=user.id)
# Вывод:
# {"event": "user_registered", "trace_id": "abc123", "user_id": 456}
Цель Trace ID
- Отслеживание запроса через все микросервисы
- Корреляция логов разных сервисов
- Debug в production
- Performance анализ (от входа до выхода)
- Ошибки — быстро найти в каких сервисах они произошли