Jaeger

Тема дорожной карты · Observability

Jaeger — открытая сквозная платформа распределённой трассировки, изначально разработанная в Uber Technologies и теперь являющаяся завершённым проектом CNCF. Она собирает распределённые трассировки из приложений, инструментированных с помощью OpenTelemetry (или собственных клиентских библиотек Jaeger), и хранит их в масштабируемом бэкенде — Cassandra или Elasticsearch — для долгосрочной наблюдаемости. UI Jaeger предоставляет представление временно́й шкалы трассировки и граф зависимостей, позволяя инженерам визуализировать поток запросов между сервисами, выявлять горячие точки задержки и точно определять первопричины ошибок. Jaeger принимает трассировки по протоколам OTLP gRPC/HTTP, Jaeger Thrift и эндпоинтам, совместимым с Zipkin, что упрощает интеграцию в существующие конвейеры наблюдаемости. Для продакшен-развёртываний Jaeger настраивается через переменные окружения или YAML-файл конфигурации, а его компоненты jaeger-collector, jaeger-query и jaeger-agent могут масштабироваться независимо для обработки высокопроизводительного приёма трассировок.

Как это работает

Jaeger захватывает пути запросов через сервисы. Trace = дерево spans; у каждого span — имя, длительность, атрибуты, parent span. Trace context (traceparent-заголовок по W3C) пробрасывается между сервисами — spans из разных сервисов соединяются в один trace. Storage: Jaeger, Tempo (Grafana-стек, масштабируется через object storage), Zipkin, SigNoz. Sampling at the head (решение per-request) или tail (решение после полного trace).

Когда применять

Tracing — когда сервисов > 2 или нужно дебажить latency. OpenTelemetry SDK + auto-instrumentation для популярных фреймворков (Spring, FastAPI, Express, Gin). Sampling 1-10% в production (head sampling); поднимайте до 100% на короткие debug-сессии. Tempo — если уже на Grafana-стеке; иначе Jaeger / SigNoz оба нормальны.

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

Ловушки Jaeger: 100% sampling на высоком трафике (storage взрывается + perf-хит); сломанная context propagation (HTTP middleware, стрипающий W3C traceparent — каждый вызов = новый trace); spans без релевантного контекста (service, version, user-segment) — traces сложно фильтровать.

Связанные понятия

Полезные ресурсы