Что такое distributed tracing
Trace ID propagates через HTTP-заголовки (W3C Trace Context: traceparent) или через message headers (Kafka headers). Каждый сервис добавляет свой span ID.
🟢 Junior Level
Distributed tracing — это отслеживание одного запроса через все микросервисы, через которые он проходит.
Запрос: GET /orders/123
Trace ID: abc-123
Span 1: API Gateway (10ms)
Span 2: Order Service (50ms)
Span 3: User Service (20ms)
Span 4: Payment Service (30ms)
Зачем: Понять где возникает проблема (латентность, ошибка) в цепочке сервисов.
Trace ID propagates через HTTP-заголовки (W3C Trace Context: traceparent) или через message headers (Kafka headers). Каждый сервис добавляет свой span ID.
🟡 Middle Level
Trace, Span, TraceId
Trace — весь путь запроса (traceId: abc-123)
Span — один вызов в цепочке (spanId: span-1, span-2...)
TraceId — идентификатор всего трейса
ParentSpanId — ссылка на предыдущий span
Jaeger / Zipkin
// Spring Cloud Sleuth + Zipkin
// ⚠️ Spring Cloud Sleuth deprecated в Spring Boot 3.0+.
// Используйте Micrometer Tracing с backend (Zipkin, Jaeger).
// Автоматически добавляет traceId в логи и заголовки
@RestController
public class OrderController {
private final RestTemplate restTemplate;
@GetMapping("/orders/{id}")
public Order getOrder(@PathVariable Long id) {
// Trace ID автоматически добавлен в HTTP-заголовок `traceparent` (W3C Trace Context).
return restTemplate.getForObject(
"http://order-service/orders/" + id, Order.class);
}
}
Типичные ошибки
- Потеря traceId:
Async call → traceId не передаётся Решение: использовать trace context propagation
Когда distributed tracing НЕ нужен
- 2-3 сервиса — достаточно логов с correlation ID
- 100% sampling допустим при малом трафике — нет необходимости в sampling
🔴 Senior Level
OpenTelemetry
// OpenTelemetry — стандарт для tracing
Tracer tracer = GlobalOpenTelemetry.getTracer("my-service");
Span span = tracer.spanBuilder("processOrder")
.setSpanKind(SpanKind.SERVER)
.startSpan();
try (Scope scope = span.makeCurrent()) {
span.setAttribute("order.id", orderId);
processOrder(orderId);
span.setStatus(StatusCode.OK);
} catch (Exception e) {
span.setStatus(StatusCode.ERROR);
span.recordException(e);
throw e;
} finally {
span.end();
}
Production Experience
Log correlation:
Логи с traceId:
[traceId=abc-123] [spanId=span-1] OrderService - Processing order 123
[traceId=abc-123] [spanId=span-2] UserService - Fetching user 456
[traceId=abc-123] [spanId=span-3] PaymentService - Charging payment
Best Practices
✅ TraceId во всех логах
✅ Sampling для high-traffic
✅ Span для всех внешних вызовов
✅ Tags для бизнес-метрик
❌ Без tracing в production
❌ 100% sampling для high-traffic
❌ Без traceId в логах
🎯 Шпаргалка для интервью
Обязательно знать:
- Distributed tracing — отслеживание одного запроса через все микросервисы
- Trace = весь путь запроса (traceId), Span = один вызов в цепочке (spanId)
- TraceId propagates через HTTP-заголовки (W3C Trace Context: traceparent) или message headers
- Jaeger / Zipkin — backend для хранения и визуализации трейсов
- OpenTelemetry — стандарт для tracing, заменил OpenTracing/OpenCensus
- Sampling для high-traffic (не 100%!) — экономит storage
- Log correlation: traceId в каждом логе — связывает логи с трейсами
- НЕ нужен для 2-3 сервисов — достаточно логов с correlation ID
Частые уточняющие вопросы:
- Trace vs Span? Trace = весь путь запроса через все сервисы, Span = один вызов (один сервис) внутри трейса.
- Зачем sampling? 100% sampling для high-traffic = терабайты данных. 1-10% достаточно для анализа.
- Spring Cloud Sleuth status? Deprecated в Spring Boot 3.0+ — используйте Micrometer Tracing.
- Что такое trace context propagation? Передача traceId/spanId через HTTP-заголовки или message headers между сервисами.
Красные флаги (НЕ говорить):
- “100% sampling для production” — нет, терабайты данных при high-traffic
- “Tracing = логирование” — нет, tracing = структура запроса, логи = детали
- “TraceId не нужен в логах” — без него невозможно связать логи с трейсами
- “Distributed tracing нужен всегда” — нет, для 2-3 сервисов хватит correlation ID
Связанные темы:
- [[21. Как мониторить распределённую систему микросервисов]]
- [[15. Как организовать коммуникацию между микросервисами]]
- [[1. Что такое паттерн Saga и когда его использовать]]
- [[3. Как реализовать распределённые транзакции в микросервисах]]
- [[7. Что такое Service Discovery и зачем он нужен]]