Что такое OpenTelemetry и как собирать метрики и логи из приложений
Современные приложения состоят из множества микросервисов, баз данных, API и очередей сообщений. При масштабировании возникает вопрос: как понять, что происходит внутри системы, где теряются запросы и почему падает производительность?
Для этого существует OpenTelemetry (OTel) — открытый стандарт и набор инструментов для сбора метрик, логов и трассировок из приложений. Это универсальный способ организовать наблюдаемость (observability) независимо от языка, фреймворка и инфраструктуры.
Что такое OpenTelemetry
OpenTelemetry — это проект под эгидой CNCF (Cloud Native Computing Foundation), объединяющий идеи двух старых инициатив: OpenTracing и OpenCensus.
Его цель — создать единый стандарт для сбора телеметрии из любого приложения.
OpenTelemetry состоит из трёх основных компонентов:
- API и SDK — библиотеки для различных языков (Go, Python, Node.js, Java и др.), через которые приложения отправляют данные.
- Collector — агент или сервис, который принимает данные от приложений, обрабатывает их и экспортирует в нужную систему (например, Prometheus, Jaeger, Grafana, Zipkin).
- Протокол 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 — это шаг к прозрачности, контролю и предсказуемости поведения системы.
Настроить мониторинг за 30 секунд
Надежные оповещения о даунтаймах. Без ложных срабатываний