Что такое OpenTelemetry и как собирать метрики и логи из приложений

8 минут чтения
Средний рейтинг статьи — 4.8

Современные приложения состоят из множества микросервисов, баз данных, API и очередей сообщений. При масштабировании возникает вопрос: как понять, что происходит внутри системы, где теряются запросы и почему падает производительность?

Для этого существует OpenTelemetry (OTel) — открытый стандарт и набор инструментов для сбора метрик, логов и трассировок из приложений. Это универсальный способ организовать наблюдаемость (observability) независимо от языка, фреймворка и инфраструктуры.

Что такое OpenTelemetry

OpenTelemetry — это проект под эгидой CNCF (Cloud Native Computing Foundation), объединяющий идеи двух старых инициатив: OpenTracing и OpenCensus.
Его цель — создать единый стандарт для сбора телеметрии из любого приложения.

OpenTelemetry состоит из трёх основных компонентов:

  1. API и SDK — библиотеки для различных языков (Go, Python, Node.js, Java и др.), через которые приложения отправляют данные.
  2. Collector — агент или сервис, который принимает данные от приложений, обрабатывает их и экспортирует в нужную систему (например, Prometheus, Jaeger, Grafana, Zipkin).
  3. Протокол OTLP (OpenTelemetry Protocol) — формат передачи данных между SDK и Collector.

Таким образом, приложение не зависит от конкретного сервиса мониторинга — всё можно перенастроить без изменения кода.

Какие данные собирает OpenTelemetry

OpenTelemetry охватывает три ключевых типа наблюдаемости:

Тип данныхНазначениеПример
Метрики (Metrics)Числовые показатели состояния системынагрузка на CPU, время отклика API
Логи (Logs)Текстовые события в приложенииошибки, предупреждения, системные события
Трейсы (Traces)Данные о пути запроса через микросервисыот клиента до базы данных

Вместе эти данные дают полную картину того, как работает приложение и где возникают проблемы.

Пример интеграции с Node.js

Рассмотрим базовую интеграцию OpenTelemetry с Node.js-приложением.

Установим нужные пакеты:

npm install @opentelemetry/api \
@opentelemetry/sdk-node \
@opentelemetry/auto-instrumentations-node \
@opentelemetry/exporter-otlp-http

Создадим файл telemetry.js:

const { NodeSDK } = require('@opentelemetry/sdk-node');
const { getNodeAutoInstrumentations } = require('@opentelemetry/auto-instrumentations-node');
const { OTLPTraceExporter } = require('@opentelemetry/exporter-otlp-http');
 
const sdk = new NodeSDK({
  traceExporter: new OTLPTraceExporter({
    url: 'http://localhost:4318/v1/traces'
  }),
  instrumentations: [getNodeAutoInstrumentations()]
});
 
sdk.start();

И подключим его в index.js:

require('./telemetry');
const express = require('express');
const app = express();
 
app.get('/', (req, res) => res.send('Hello OpenTelemetry!'));
app.listen(3000);

Теперь приложение автоматически собирает трейсы HTTP-запросов и передаёт их в Collector.

Установка и настройка OpenTelemetry Collector

Collector — это сервис, который принимает данные от приложений и экспортирует их в другие системы.
Установим Collector через Docker:

docker run --name otel-collector -p 4317:4317 -p 4318:4318 \
  -v $(pwd)/otel-config.yaml:/etc/otel/config.yaml \
  otel/opentelemetry-collector

Пример простого конфига otel-config.yaml:

receivers:
  otlp:
    protocols:
      http:
      grpc:
 
exporters:
  logging:
    loglevel: info
  prometheus:
    endpoint: "0.0.0.0:9464"
 
service:
  pipelines:
    traces:
      receivers: [otlp]
      exporters: [logging]
    metrics:
      receivers: [otlp]
      exporters: [prometheus]

Collector примет трейсы и метрики, выведет их в логи и отдаст Prometheus-совместимые метрики на порту 9464.

Интеграция с Prometheus и Grafana

Если у вас уже настроен Prometheus, достаточно добавить Collector как endpoint в конфигурации Prometheus:

scrape_configs:
  - job_name: 'otel'
    static_configs:
      - targets: ['localhost:9464']

Далее в Grafana можно подключить Prometheus как источник данных и визуализировать метрики в виде графиков, панелей и дашбордов.

Пример с Python

Для Python установка выглядит аналогично:

pip install opentelemetry-sdk opentelemetry-exporter-otlp

Пример кода:

from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk.trace.export import BatchSpanProcessor
 
trace.set_tracer_provider(TracerProvider())
tracer = trace.get_tracer(__name__)
 
exporter = OTLPSpanExporter(endpoint="http://localhost:4318/v1/traces")
trace.get_tracer_provider().add_span_processor(BatchSpanProcessor(exporter))
 
with tracer.start_as_current_span("example-request"):
    print("Trace sent to OpenTelemetry Collector")

Преимущества OpenTelemetry

  • Единый стандарт для всех языков. Можно использовать один протокол и Collector для Node.js, Python, Go и Java.
  • Независимость от вендора. OTel работает с Prometheus, Grafana, Jaeger, Zipkin и многими другими.
  • Минимальное вмешательство в код. Благодаря автоинструментации можно получать телеметрию без переписывания приложения.
  • Гибкость экспорта. Collector может передавать данные сразу в несколько систем — например, одновременно в Prometheus и Jaeger.

Заключение

OpenTelemetry — это фундаментальный инструмент для построения системы наблюдаемости.
Он упрощает сбор метрик, логов и трейсов из распределённых приложений и делает диагностику производительности значительно проще.

Если вы разворачиваете микросервисную архитектуру, внедрение OpenTelemetry — это шаг к прозрачности, контролю и предсказуемости поведения системы.

8 минут чтения
Средний рейтинг статьи — 4.8

Настроить мониторинг за 30 секунд

Надежные оповещения о даунтаймах. Без ложных срабатываний