Путь трейса от вашего кода до экрана Jaeger: SDK → (опционально Collector) → приём → хранилище → query/UI. Понимание этой цепочки нужно, чтобы осознанно выбирать варианты деплоя и знать, где что ломается.
Путь трейса
приложение (OTel SDK) ──OTLP──► [ OTel Collector ] ──► [ Jaeger backend ] ──► хранилище
│ ▲
│ пайплайны: батчинг, │
│ сэмплирование, │
│ PII-фильтры │
▼ │
Kafka ◄────────────────────┘ (опционально: буферизация)
- OTel SDK в приложении создаёт спаны, буферизует и экспортирует их по OTLP (gRPC 4317 / HTTP 4318);
- OpenTelemetry Collector (опционален, но почти всегда есть в проде) — общий шлюз: принимает OTLP от всех сервисов, делает батчинг, сэмплирование, маскирование данных, маршрутизацию в один или несколько бэкендов;
- Jaeger backend — компоненты приёма (receiver), нормализации и записи в хранилище;
- Jaeger query + UI — поиск по хранилищу и визуализация (порт 16686).
Варианты деплоя
| Вариант | Что внутри | Когда |
|---|---|---|
all-in-one | приём + хранилище в памяти (или Badger) + query одним контейнером | разработка, демо, малые команды |
| Отдельные компоненты (v1-классика) | collector + query + Cassandra/ES отдельно | прод классической схемы |
| Jaeger v2 | единый бинарник на базе OTel Collector + Jaeger-компоненты как плагины | современный стандарт (2024+) |
| Managed (Grafana Cloud, у облачных провайдеров) | весь бэкенд как сервис | не хотите эксплуатировать сами |
Ключевые порты (all-in-one)
| Порт | Протокол | Зачем |
|---|---|---|
| 16686 | HTTP | веб-UI и query API |
| 4317 | OTLP/gRPC | основной приём от OTel SDK/Collector |
| 4318 | OTLP/HTTP | то же поверх HTTP (проще проксировать) |
| 14268 | HTTP (jaeger.thrift) | legacy-приём (старые клиенты Jaeger SDK) |
| 9411 | HTTP (Zipkin) | совместимость с Zipkin-клиентами |
💡 UDP-порты 6831/6832 вы встретите в старых гайдах — это jaeger-agent из архитектуры v1. Агент устарел: его роль (client-side буфер и декорация) теперь делает OTel SDK + Collector sidecar/daemonset.
Jaeger v1 vs v2 — что важно знать
- v1 — историческая архитектура: jaeger-collector, jaeger-query, jaeger-agent, jaeger-ingester (чтение из Kafka). Каждая часть — отдельный процесс и конфиг;
- v2 (с 2024) — Jaeger переписан как дистрибуция OpenTelemetry Collector:
один бинарник
jaeger, конфигурация в OTel-стиле (receivers/processors/exporters/pipelines), плюс компоненты Jaeger (хранилище, query). Приём — OTLP как основной; jaeger.thrift — по остаточному принципу; - Практический вывод курса: учим OTLP + OTel Collector, потому что это и есть современный
Jaeger. Пример конфига v2:
# config.yaml Jaeger v2 (сокращённо) receivers: otlp: protocols: grpc: {} http: {} exporters: otlp/jaeger-storage: endpoint: jaeger-storage:4317 tls: insecure: true service: pipelines: traces: receivers: [otlp] exporters: [otlp/jaeger-storage]
Кто за что отвечает (и кто виноват при проблеме)
| Симптом | Где искать |
|---|---|
| Спаны есть в логах приложения, нет в Jaeger | путь доставки: endpoint, TLS, Collector, сеть, сэмплирование |
| Трейсы есть, но неполные (нет части сервисов) | распространение контекста (заголовки), сэмплирование сторон |
| UI медленно ищет | хранилище и объёмы (модуль 5) |
| Спаны теряются при пиках | батчинг/очереди Collector, лимиты приёма |
Практика
- Запустите all-in-one и найдите в его логах, какие receivers подняты
(
docker logs jaeger | grep -i receiver). - Занесите в шпаргалку карту портов из этого урока — она понадобится в каждом практикуме.
- Прочитайте страницу архитектуры на jaegertracing.io (Architecture) и сверьте со схемой урока: что совпало, что изменилось в свежих версиях.
Мини-квиз
1. Обязателен ли OTel Collector между SDK и Jaeger? — Нет: SDK может слать OTLP прямо в Jaeger. Collector нужен для батчинга, сэмплирования, маршрутизации и развязки.
2. Что такое Jaeger v2? — Дистрибуция OTel Collector с компонентами Jaeger: один бинарник, конфиг в OTel-стиле.
3. Порт 6831 UDP — жив ли он? — Это legacy jaeger-agent; в новых схемах не используется.