Ответ
Трассировка (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.