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

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

Collector OTel: receivers, processors, exporters и паттерны развёртывания

Суть Collector — это настраиваемый через YAML пайплайн: receivers принимают телеметрию, processors преобразуют её на лету, exporters отправляют в бэкенды. Три паттерна развёртывания доминируют: agent, gateway и agent-to-gateway.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на middle-высоте — в небе
◷ 13 min

Поступает новое требование от бэкенда: маршрутизировать трассировки в vendor-A, логи — в vendor-B, и редактировать PII из обоих, начиная с понедельника. Без Collector — это три отдельных деплоя приложений в 50 командах. С Collector — одно изменение YAML и один перезапуск Collector.

Receivers, processors, exporters

Collector — это настраиваемый через YAML пайплайн с тремя стадиями:

Receivers принимают входящую телеметрию:

  • otlp — gRPC (порт 4317) и HTTP (порт 4318), основной receiver для сервисов с OTel-инструментированием
  • filelog — читает лог-файлы из файловой системы (полезен для legacy-приложений, пишущих в stdout/файлы)
  • prometheus — скрейпит эндпоинты /metrics (соединяет Prometheus-экспортёры с OTel)
  • kafka — читает телеметрию из Kafka-топиков
  • Vendor-специфичные receivers для данных не в формате OTel

Processors преобразуют записи на лету:

  • memory_limiter — сбрасывает новые записи, когда Collector превышает порог RAM; предотвращает OOM по замыслу
  • batch — группирует записи в эффективные батчи (меньше сетевых round trips к экспортёрам)
  • resource — добавляет service.name и другие Resource-атрибуты (например, инжектирует deployment.environment=production)
  • attributes — редактирует, переименовывает, добавляет поля; используется для удаления PII и соблюдения Semantic Conventions
  • tail_sampling — сохраняет/сбрасывает трассировки на основе полного контекста трассировки (ошибки, задержка, бизнес-критерии) — рассматривается в следующем уроке
  • transform — универсальные преобразования через OTTL (OpenTelemetry Transformation Language)
  • k8sattributes — обогащает спаны/логи метаданными Kubernetes: pod, namespace, node, deployment

Exporters отправляют записи в бэкенды:

  • otlp — в другой OTel-совместимый бэкенд (другой Collector, Grafana Tempo, Jaeger и др.)
  • datadog — vendor-специфичный
  • prometheusremotewrite — в Prometheus или Grafana Mimir
  • loki — в Grafana Loki для логов
  • Vendor-специфичные экспортёры для New Relic, Honeycomb, Splunk, Elastic и др.

Минимальный production-ready YAML Collector — один пайплайн для трассировок:

receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
      http:
        endpoint: 0.0.0.0:4318

processors:
  memory_limiter:
    check_interval: 1s
    limit_percentage: 80
    spike_limit_percentage: 25
  batch:
    timeout: 10s
    send_batch_size: 512
  attributes:
    actions:
      - key: user.email
        action: delete

exporters:
  otlp/tempo:
    endpoint: tempo:4317
    tls:
      insecure: true

service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [memory_limiter, batch, attributes]
      exporters: [otlp/tempo]

Конфигурация принимает OTLP на 4317/4318, ограничивает RAM Collector до 80% (сбрасывает новые записи перед OOM), группирует спаны в батчи (максимум 10 с ожидания, 512 в батче), удаляет user.email из каждого спана, и экспортирует OTLP в бэкенд Tempo.

Три паттерна развёртывания

Agent — Collector работает как sidecar (один на pod) или DaemonSet (один на node). Принимает телеметрию от локального приложения, выполняет минимальную обработку (обогащение resource, батчинг), экспортирует напрямую в бэкенд. Минимальное количество сетевых хопов, но tail sampling сложно реализовать (каждый агент видит трафик только одной ноды).

Gateway — приложения экспортируют напрямую в центральный пул реплик Collector, который выполняет тяжёлую обработку (tail sampling, редактирование, маршрутизация в несколько бэкендов). Масштабировать обработку централизованно проще, но каждый спан пересекает сеть от приложения до шлюза.

Agent-to-gateway (production-canonical паттерн) — DaemonSet-агент на каждой ноде выполняет минимальную локальную обработку и пересылает через OTLP в централизованный пул шлюзов, который обрабатывает tail sampling, редактирование и маршрутизацию. Агент добавляет Kubernetes-метаданные (pod, namespace, node) через процессор k8sattributes перед пересылкой.

ПаттернРасположение агентаTail sampling возможен?Лучше всего для
Только agentDaemonSet на нодеНет — каждый агент видит только одну нодуПростые конфигурации, только head sampling
Только gatewayЦентральный пулДа — видит весь трафикНебольшие флоты, простые топологии
Agent-to-gatewayDaemonSet + центральный шлюзДа — шлюз видит полные трассировки через sticky-маршрутизациюProduction Kubernetes, любые размеры

В паттерне agent-to-gateway loadbalancing exporter агента маршрутизирует по хэшу trace_id, гарантируя, что все спаны трассировки попадают на одну реплику шлюза — необходимо для tail sampling, рассматриваемого в следующем уроке.

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

Почему Collector заслуживает быть отдельным процессом от приложения, даже если SDK мог бы экспортировать напрямую в бэкенды? Три причины. (1) Буферизация: когда бэкенд замедляется или падает, Collector буферизует (в памяти и на диске), чтобы приложение не блокировалось. Прямой экспорт из SDK либо теряет телеметрию (потеря данных), либо создаёт обратное давление на обработчик запросов приложения (регрессия задержки). (2) Политика: tail sampling, редактирование, маршрутизация в несколько бэкендов должны находиться вне кода приложения — платформенные инженеры обновляют YAML без координации передеплоя 50 команд. (3) Гетерогенный флот: разные сервисы работают на разных языках и версиях SDK. Collector нормализует всё в OTLP и применяет единую политику вне зависимости от upstream.

Викторина

Collector команды сбрасывает спаны во время всплеска трафика (otelcol_processor_dropped_spans ненулевой). Какой процессор скорее всего это вызывает?

Викторина

Почему паттерн agent-to-gateway является production-canonical развёртыванием для Kubernetes?

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

Упорядочите стадии пайплайна Collector, через которые проходит спан в стандартном пайплайне трассировок:

  1. 1 OTLP receiver принимает батч спанов от SDK приложения
  2. 2 memory_limiter проверяет текущий RAM и сбрасывает при превышении порога
  3. 3 k8sattributes добавляет метаданные pod, namespace и node
  4. 4 batch группирует спаны для эффективного экспорта
  5. 5 attributes редактирует поля PII
  6. 6 OTLP exporter отправляет батч в бэкенд
Вспомните перед уходом
  1. 01
    Что делает процессор memory_limiter и почему он должен стоять перед другими процессорами в пайплайне?
  2. 02
    Почему паттерн agent-to-gateway использует loadbalancing exporter на агентном уровне вместо простого round-robin?
  3. 03
    Назовите три процессора и объясните production-порядок их расположения в пайплайне трассировок.
Итог

OTel Collector — это настраиваемый через YAML пайплайн с тремя стадиями: receivers (otlp, filelog, prometheus, kafka), принимающие входящую телеметрию; processors (memory_limiter, batch, resource, attributes, k8sattributes, tail_sampling, transform), преобразующие записи на лету; и exporters (otlp, datadog, prometheusremotewrite, loki), отправляющие записи в бэкенды. memory_limiter должен стоять первым — он дёшево сбрасывает записи перед дорогостоящей обработкой при давлении памяти. Три паттерна развёртывания: agent (DaemonSet на ноду, простой, без tail sampling), gateway (центральный пул, tail sampling возможен) и agent-to-gateway (production-canonical Kubernetes-паттерн — DaemonSet-агенты обогащают Kubernetes-метаданными и пересылают через маршрутизацию по хэшу trace_id на центральный шлюз, запускающий tail sampling и маршрутизацию в несколько бэкендов). Ценность Collector — в отделении политики (редактирование, маршрутизация, сэмплирование) от инструментирования (код приложения): обновляй YAML, а не код.

Связанные уроки
встречается в202
Продолжить восхождение ↑Стратегии сэмплирования: head, tail и parent-based
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.