Что такое трассировка (tracing) в разработке ПО?

«Что такое трассировка (tracing) в разработке ПО?» — вопрос из категории DevOps, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Трассировка (Tracing) — это метод observability, позволяющий отслеживать выполнение запроса (транзакции) по всей распределенной системе, проходящей через множество сервисов, процессов и сетевых границ.

Для чего она нужна:

  • Диагностика проблем: Понимание, где и почему произошла ошибка или высокая задержка в цепочке вызовов.
  • Анализ производительности: Выявление узких мест (bottlenecks) и измерение времени выполнения каждого этапа.
  • Мониторинг: Наблюдение за поведением системы в реальном времени.
  • Визуализация потоков данных: Построение графа вызовов между микросервисами.

Ключевые концепции (модель OpenTelemetry):

  • Trace (Трассировка): Целостный путь запроса через систему. Содержит дерево Spans.
  • Span (Пролет): Отдельная именованная операция внутри трассировки (например, вызов HTTP-метода, запрос к БД). Содержит временные метки, теги, логи.
  • Context Propagation: Механизм передачи идентификатора трассировки (traceId) и других контекстных данных между сервисами (обычно через HTTP-заголовки).

Пример кода с OpenTelemetry (Java):

import io.opentelemetry.api.trace.*;

Tracer tracer = OpenTelemetry.getTracer("my.service.name");

// Создание корневого Span
Span parentSpan = tracer.spanBuilder("handleRequest").startSpan();
try (Scope scope = parentSpan.makeCurrent()) {
    // Код бизнес-логики...
    processOrder();

    // Создание дочернего Span
    Span childSpan = tracer.spanBuilder("callExternalService").startSpan();
    try (Scope childScope = childSpan.makeCurrent()) {
        // Вызов другого сервиса...
        httpClient.sendRequest();
    } finally {
        childSpan.end();
    }
} finally {
    parentSpan.end(); // Важно: завершить Span
}

Популярные инструменты: Jaeger, Zipkin, AWS X-Ray, Grafana Tempo. Стандарт де-факто — OpenTelemetry.