awesome-everything EN
↑ Обратно к восхождению

Наблюдаемость

Что такое OpenTelemetry: API, SDK, Collector, OTLP

Суть OTel — четыре части, сложенные в стек: API, к которому обращается код, SDK, собирающий телеметрию, Collector, маршрутизирующий её, и OTLP как wire-формат — вместе они позволяют инструментировать однажды и менять backend без переписывания кода.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на junior-высоте — поверхность
◷ 10 min

Компания переходит на другой observability-backend ради экономии. При vendor-SDK, зашитом в каждый сервис, оценка миграции — четыре инженер-недели. С OTel — один день: меняешь exporter-блок в конфиге Collector’а, перезапускаешь его. Всё.

Четыре части

До OTel каждый observability-вендор поставлял проприетарный агент — dd-trace Datadog, агент New Relic, Java-agent AppDynamics — и смена вендора означала переписывание инструментации во всех сервисах. Ответ CNCF — OpenTelemetry: четыре части, наслоенные так, что каждая заменима и каждая говорит стабильный контракт.

API — per-language публичные интерфейсы (Java io.opentelemetry.api, Python opentelemetry.trace, Go go.opentelemetry.io/otel). Это то, к чему обращается код приложения и third-party-библиотеки. Намеренно лёгкий: дефолтная реализация — no-op. Код приложения никогда не импортирует vendor-библиотеку — он импортирует OTel API.

SDK — runtime-кусок, превращающий вызовы API в записи телеметрии. SDK владеет sampling-решениями (какие трейсы оставлять), батчингом (когда флашить в exporter) и сериализацией (OTLP wire-формат). Устанавливает application owner, не library author.

Collector — standalone-процесс (бинарь или контейнер), принимающий OTLP, прогоняющий конфигурируемые processor’ы и экспортящий в один или несколько backend’ов. Это policy-слой: tail sampling, redaction, multi-backend routing — всё в YAML, вне приложения.

OTLP — wire-формат. Protobuf-кодированные сообщения по gRPC или HTTP, определены в OTel-спеке и стабильны через версии. Любая пара OTel-aware компонентов общается по OTLP.

ЧастьГде живётРольЗаменима?
APIКод приложенияСтабильный публичный интерфейс; no-op по умолчаниюСтабилен — не меняется
SDKRuntime приложенияСтроит записи, семплирует, батчит, сериализуетДа — заменяешь SDK, не трогая код
CollectorSidecar / gatewayОбрабатывает, маршрутизирует, экспортит телеметриюДа — меняешь конфиг, не код
OTLPWire-форматПереносит span’ы/метрики/логи между частямиСтабилен — все части говорят его

Почтовая метафора

Представь национальную почтовую систему. API — это почтовый ящик у дома: бросаешь письмо, не знаешь, как оно сортируется. SDK — персонал местного отделения, забирающий письмо, взвешивающий, штампующий, кладущий в нужный исходящий мешок. Collector — региональный сортировочный депо, где письма со множества домов встречаются, батчатся, фильтруются и маршрутизируются по адресу. OTLP — стандартный конверт и адресный формат, понятный каждому депо. Меняешь страну назначения (vendor backend)? Тот же конверт, другая таблица маршрутизации.

История с портабельностью

Антон · Браузер platform-инженер слышит: компания переезжает с Datadog на Honeycomb ради экономии. Паникует: «Нам что, переписывать каждый сервис?» Дима · Origin-сервер backend-разработчик успокаивает: «Мы на OTel — код приложения вызывает только OTel API, SDK эмитит OTLP в Collector, Collector экспортит туда, куда указывает конфиг. Меняем один блок в Collector YAML — exporter, endpoint, API-ключ — и редеплоим. Никаких code-changes». Через два дня миграция готова.

Почему это работает

Разделение API/SDK решает проблему third-party-библиотек. До OTel библиотека, желавшая эмитить телеметрию, имела два плохих варианта: выбрать конкретного вендора (залочив пользователей) или построить собственную абстракцию. С OTel библиотека зависит только от пакета OTel API — маленький набор интерфейсов с no-op-дефолтом — и может эмитить span’ы без навязывания пользователям конкретного SDK. Application owner устанавливает тот SDK, который выбирает сам, заменяемый. Именно это делает «инструментируй однажды, маршрутизируй куда угодно» архитектурно обоснованным.

Викторина

Какие четыре части составляют архитектуру OTel?

Викторина

У команды 50 микросервисов на OTel, и они хотят добавить новый tracing-backend. Где они вносят изменение?

Расставь шаги по порядку

Расставь путь одного span'а от кода приложения до backend'а:

  1. 1 Код приложения вызывает tracer.start_span() (OTel API)
  2. 2 OTel SDK собирает span-record (start_time, attributes, trace-context)
  3. 3 Когда span заканчивается, SDK передаёт его batch span processor'у
  4. 4 Processor батчит span'ы и отдаёт exporter'у
  5. 5 Exporter отправляет OTLP-данные по gRPC или HTTP в Collector
  6. 6 Collector принимает, применяет processor'ы (tail sampling, redaction), батчит
  7. 7 Collector экспортит в один или несколько backend'ов (Datadog, Honeycomb, Tempo, ...)
Закончи аналогию

Заполни пропуск: _______ — стандартный конверт и адресный формат, понятный любому OTel-aware куску. Меняешь получателя — конверт остаётся.

Вспомните перед уходом
  1. 01
    В двух предложениях — в чём разница между OTel API и OTel SDK?
  2. 02
    Зачем OTel разделяет API и SDK, и какую конкретную проблему это решает?
  3. 03
    В одном предложении — какой контракт обеспечивает vendor-нейтральность?
Итог

OpenTelemetry — четыре части в стеке: API (что импортирует код — стабильный, vendor-free интерфейс), SDK (runtime, превращающий вызовы API в записи телеметрии, батчащий их и экспортящий OTLP), Collector (standalone-процесс, принимающий OTLP, прогоняющий конфигурируемые processor’ы — tail sampling, redaction — и экспортящий в любой backend), и OTLP (protobuf wire-формат, который говорят все части). В 2026 каждый крупный вендор принимает OTLP — Datadog, Honeycomb, Grafana Cloud, Elastic, Splunk, New Relic. Контракт портабельности: эмитируй OTLP на edge, меняй backend’ы в YAML Collector’а, никогда не переписывай инструментацию.

Связанные уроки
встречается в40
Продолжить восхождение ↑Сигналы OTel, Semantic Conventions и проводной формат OTLP
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.