Прямой ответ
Distributed tracing — метод отслеживания запросов через несколько сервисов (tracing — «путь запроса через сервисы» — tracing — incident — «визуализация потока» — tracing), зачем: отладка микросервисов (tracing — «где тормозит запрос» — tracing — incident — «какой сервис виноват» — tracing — mikroservisy — «отладка» — tracing); основные понятия (tracing): (1) Trace (tracing — «путь запроса» — tracing — incident — «от начала до конца» — tracing — mikroservisy — «полный путь» — tracing — «один запрос» — tracing); (2) Span (tracing — «операция в рамках trace» — tracing — incident — «шаг обработки» — tracing — mikroservisy — «вызов сервиса» — tracing — «длительность/метаданные» — tracing); (3) Span Context (tracing — «идентификаторы span'а» — tracing — incident — «передаётся между сервисами» — tracing — mikroservisy — «контекст» — tracing — «trace ID, span ID» — tracing); (4) Parent-Child (tracing — «иерархия span'ов» — tracing — incident — «родительский/дочерний» — tracing — mikroservisy — «структура» — tracing — «дерево вызовов» — tracing); инструменты (tracing): (1) OpenTelemetry (tracing — «стандарт трассировки» — tracing — incident — «единый API» — tracing — mikroservisy — «инструментация» — tracing — OpenTelemetry — «CNCF» — tracing); (2) Jaeger (tracing — «система трассировки» — tracing — incident — «визуализация» — tracing — mikroservisy — «веб-интерфейс» — tracing — Jaeger — «Uber» — tracing); (3) Zipkin (tracing — «система трассировки» — tracing — incident — «визуализация» — tracing — mikroservisy — «веб-интерфейс» — tracing — Zipkin — «Twitter» — tracing); как работает (tracing — «поток» — tracing): (1) Создание span (tracing — «сервис создаёт span» — tracing — incident — «начало операции» — tracing — mikroservisy — «span» — tracing); (2) Передача контекста (tracing — «span context в заголовках» — tracing — incident — «HTTP headers» — tracing — mikroservisy — «передача» — tracing — traceparent — tracing); (3) Создание дочернего span (tracing — «следующий сервис создаёт span» — tracing — incident — «с parent ID» — tracing — mikroservisy — «дочерний span» — tracing); (4) Сбор в системе (tracing — «Jaeger/Zipkin собирают span'ы» — tracing — incident — «визуализация» — tracing — mikroservisy — «trace» — tracing); когда использовать (tracing): микросервисы (tracing — «много сервисов» — tracing — incident — «отладка» — tracing — mikroservisy), латентность (tracing — «где тормозит» — tracing — incident — «какой сервис» — tracing — mikroservisy), ошибки (tracing — «где ошибка» — tracing — incident — «какой сервис» — tracing — mikroservisy); антипаттерны: не передавать контекст (tracing — «span context не передаётся» — tracing — incident — «trace рвётся» — tracing — mikroservisy — «передавать обязательно» — tracing), слишком много span'ов (tracing — «span на каждую операцию» — tracing — incident — «накладные расходы» — tracing — mikroservisy — «только значимые» — tracing).
Практика: настройка distributed tracing
OpenTelemetry SDK (tracing — установка (tracing — pip install opentelemetry-api opentelemetry-sdk opentelemetry-exporter-otlp (tracing — «SDK Python» — tracing — mikroservisy — «инструментация» — tracing — OpenTelemetry); Создание span (tracing — from opentelemetry import trace tracer = trace.get_tracer(__name__) with tracer.start_as_current_span("my-operation"): # операция (tracing — «span» — tracing — mikroservisy — «операция» — tracing — incident); Jaeger (tracing — kubectl apply -f kubectl apply -f jaeger-instance.yaml (tracing — «Jaeger в Kubernetes» — tracing — mikroservisy — «система трассировки» — tracing — Jaeger); Веб-интерфейс (tracing — kubectl port-forward svc/jaeger-query 16686:16686 (tracing — «веб-интерфейс Jaeger» — tracing — mikroservisy — «визуализация» — tracing — Jaeger); Zipkin (tracing — `kubectl apply -f (tracing — «Zipkin в Kubernetes» — tracing — mikroservisy — «система трассировки» — tracing — Zipkin).
Практический сценарий: отладка медленного запроса
Контекст: микросервисы (mikroservisy — много сервисов (incident — tracing), боль: запрос тормозит (tracing — «p99 вырос» — tracing — incident — «где тормозит» — tracing — mikroservisy); решение — distributed tracing: (1) OpenTelemetry (tracing — инструментация (tracing — tracer.start_as_current_span("operation") (tracing — mikroservisy — «span'ы» — tracing — incident); (2) передача контекста (tracing — span context (tracing — «HTTP headers» — tracing — mikroservisy — traceparent — tracing — incident); (3) Jaeger (tracing — сбор span'ов (tracing — «Jaeger собирает» — tracing — mikroservisy — «визуализация» — tracing — Jaeger); (4) веб-интерфейс (tracing — kubectl port-forward svc/jaeger-query 16686:16686 (tracing — «веб» — tracing — mikroservisy — «trace» — tracing — Jaeger); (5) анализ (tracing — визуализация (tracing — «где тормозит» — tracing — incident — «какой сервис» — tracing — mikroservisy); (6) узкое место (tracing — service-b (tracing — «80% времени» — tracing — incident — «широкий span» — tracing — mikroservisy); результат: узкое место найдено (tracing — service-b 80% (tracing — «широкий span» — tracing — incident — оптимизация (tracing — «service-b оптимизирован» — tracing — mikroservisy — p99 упал (tracing — «p99 500 → 200 мс» — tracing — incident); вывод: distributed tracing решили задачу (узкое место визуально — tracing — ADR — «не передавать контекст» — антипаттерн — tracing — передавать обязательно — tracing — техдолг).
FAQ
Что такое distributed tracing и какие основные понятия? Distributed tracing (tracing — метод отслеживания запросов (tracing — «путь запроса через сервисы» — tracing — incident — «визуализация» — tracing — mikroservisy); понятия (tracing): Trace (tracing — «путь запроса» — tracing — incident — «от начала до конца» — tracing), Span (tracing — «операция» — tracing — incident — «шаг обработки» — tracing), Span Context (tracing — «идентификаторы» — tracing — incident — «передаётся» — tracing), Parent-Child (tracing — «иерархия» — tracing — incident — «дерево вызовов» — tracing); «distributed tracing без контекста» — антипаттерн (trace рвётся — incident — передавать обязательно — tracing — ADR — техдолг).
Какие инструменты distributed tracing существуют и чем они отличаются? OpenTelemetry (tracing — «стандарт трассировки» — tracing — incident — «единый API» — tracing — mikroservisy — OpenTelemetry — «CNCF» — tracing); Jaeger (tracing — «система трассировки» — tracing — incident — «визуализация» — tracing — mikroservisy — Jaeger — «Uber» — tracing); Zipkin (tracing — «система трассировки» — tracing — incident — «визуализация» — tracing — mikroservisy — Zipkin — «Twitter» — tracing); отличие: OpenTelemetry — стандарт (tracing — OpenTelemetry), Jaeger — от Uber (tracing — Jaeger), Zipkin — от Twitter (tracing — Zipkin — «выбор по задаче» — tracing — incident — ADR — техдолг).
Как передать trace context между сервисами?
Передача (tracing — span context (tracing — «идентификаторы span'а» — tracing — incident — «передаётся» — tracing — mikroservisy — «между сервисами» — tracing); как: HTTP headers (tracing — traceparent (tracing — «заголовок» — tracing — incident — «передача» — tracing — mikroservisy — traceparent: 00-<trace-id>-<span-id>-01 (tracing — incident), OpenTelemetry SDK (tracing — автоматически (tracing — «SDK передаёт» — tracing — mikroservisy — «автоматически» — tracing — OpenTelemetry); «не передавать контекст» — антипаттерн (trace рвётся — incident — передавать обязательно — tracing — ADR — техдолг).
Как найти узкое место в запросе через distributed tracing? Поиск (tracing — визуализация (tracing — «trace в Jaeger/Zipkin» — tracing — incident — «где тормозит» — tracing — mikroservisy); как: веб-интерфейс (tracing — Jaeger/Zipkin (tracing — «визуализация trace» — tracing — incident — «веб» — tracing — Jaeger), анализ span'ов (tracing — «широкие span'ы» — tracing — incident — «где много времени» — tracing — mikroservisy — «длительность» — tracing), иерархия (tracing — «parent-child» — tracing — incident — «какой сервис вызывает» — tracing — mikroservisy — «структура» — tracing); «tracing без анализа» — мало (визуализация обязательна — incident — анализ span'ов — tracing — ADR — техдолг).
Источники: OpenTelemetry docs (traces), Jaeger docs, Zipkin docs — ссылки в шапке.