open atlas
↑ К треку
Наблюдаемость OBS · 03 · 01

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

OTel — четыре части, сложенные в стек: API, к которому обращается код, SDK, собирающий телеметрию, Collector, маршрутизирующий её, и OTLP как wire-формат — вместе они позволяют инструментировать однажды и менять backend без переписывания кода.

OBS Junior ◷ 10 min
Уровень
ОсновыJuniorMiddleSenior

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

Четыре части

Через десять минут ты будешь знать, какая из четырёх частей OTel живёт в твоём коде, какая — снаружи, и где именно потянуть рычаг при смене вендора.

До 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 (OpenTelemetry Protocol — открытый проводной формат, двоичный protobuf поверх gRPC или HTTP) — wire-формат. Protobuf-кодированные сообщения по gRPC или HTTP, определены в OTel-спеке и стабильны через версии. Любая пара OTel-aware компонентов общается по OTLP.

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

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

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

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

Антон · Браузер 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’а, никогда не переписывай инструментацию. Теперь, когда видишь задачу по смене вендора, первый вопрос — не «сколько кода менять», а «наш edge уже говорит OTLP?» — всё остальное следует из этого ответа.

Практика

Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.

вспомнитьприменитьуглубить0 из 5 завершено
Связанные уроки
встречается в40

Что-то непонятно?

Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.

хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.