Вопрос 22 · Раздел 17

Что такое distributed tracing

Trace ID propagates через HTTP-заголовки (W3C Trace Context: traceparent) или через message headers (Kafka headers). Каждый сервис добавляет свой span ID.

Версии по языкам: English Russian Ukrainian

🟢 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);
    }
}

Типичные ошибки

  1. Потеря 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 и зачем он нужен]]