Спостережуваність
OpenTelemetry
Єдиний відкритий стандарт і набір SDK для трейсів, метрик і логів, незалежний від постачальника.
Що це
OpenTelemetry (OTel) виник у 2019 році після злиття проєктів OpenTracing і OpenCensus. Це проєкт CNCF зі статусом incubating і одна з найактивніших спільнот екосистеми.
Він визначає формат телеметрії (OTLP), API та SDK для основних мов, а також Collector: процес, який приймає, обробляє й надсилає дані в будь-який бекенд (Jaeger, Prometheus, Grafana, Datadog, Elastic).
Головна ідея: інструментуєте код один раз за стандартом, а бекенд можна змінювати без переписування. Є автоінструментація для популярних фреймворків і HTTP-клієнтів.
Коли брати
- Розподілені системи, де потрібне наскрізне трасування запитів.
- Хочете уникнути прив'язки до постачальника спостережуваності.
- Потрібні трейси, метрики й логи з єдиною кореляцією.
- Мікросервіси різними мовами з єдиним форматом даних.
Коли не варто
- Один простий моноліт, де вистачить логів і кількох метрик.
- Потрібна готова система з дашбордами: OTel лише збирає та передає дані, але не зберігає й не візуалізує їх.
- Немає ресурсів на налаштування Collector і бекенду.
Ключові поняття
- Trace / Span
- Трейс це шлях одного запиту через систему, спан це одна операція всередині нього з часом і атрибутами.
- OTLP
- Власний протокол OpenTelemetry для передачі трейсів, метрик і логів по gRPC чи HTTP.
- Collector
- Проміжний процес із receivers, processors і exporters, що розв'язує додаток і бекенд.
- Context propagation
- Передача ідентифікатора трейсу між сервісами через заголовок
traceparent(W3C Trace Context). - Auto-instrumentation
- Агенти й бібліотеки, що додають спани для HTTP, баз даних і черг без змін у коді.
Приклад
Питання на співбесіді
1. Що таке трейс і спан?
Трейс це повний шлях одного запиту через усі сервіси, а спан це окрема операція в ньому, наприклад SQL-запит чи виклик іншого сервісу. Спани утворюють дерево з батьківськими зв'язками.
2. Навіщо потрібен Collector?
Він приймає дані від застосунків, обробляє їх (семплінг, фільтрація, збагачення) і надсилає в один чи кілька бекендів. Завдяки цьому код застосунку не залежить від конкретного постачальника.
3. Як трейс передається між сервісами?
Через контекст у HTTP-заголовку
traceparentстандарту W3C Trace Context. Кожен сервіс читає його й додає свої спани до того самого трейсу.
Питання з банку співбесід
- Користувачі пишуть, що оформлення замовлення інколи триває 10 секунд. У тебе є логи, метрики Prometheus і трейси OpenTelemetry. З чого почнеш і що тобі скаже кожен із цих сигналів?JuniorDevOps
- Як налаштувати логування, щоб за одним
requestIdчиtrace_idзнайти всі рядки запиту в усіх сервісах?MiddleDevOps - Сервіс платежів почав відповідати за 30 секунд, і весь API ліг. Чому повільна залежність гірша за мертву і що допомагає?MiddleDevOps
Схожі технології
- JaegerСистема розподіленого трасування: збирає й показує шлях запиту через мікросервіси.
- PrometheusСистема моніторингу з базою часових рядів: збирає метрики pull-моделлю і дає мову запитів PromQL.
- GrafanaПлатформа візуалізації: дашборди та алерти поверх Prometheus, Loki, SQL-баз і десятків інших джерел.
- SentryПлатформа відстеження помилок і продуктивності: збирає винятки зі стек-трейсами, релізами та контекстом.
- DatadogКомерційна SaaS-платформа спостережуваності: метрики, логи, трейси, APM і безпека в одному місці.
Логотипи належать їхнім власникам і використані лише для ідентифікації. Іконки: Simple Icons (CC0), Devicon (MIT).