Обзор OpenTelemetry (OTLP)

StatusRadar предоставляет встроенную поддержку протокола OpenTelemetry (OTLP) для сбора трейсов, логов и метрик из ваших backend-приложений.

Что такое OpenTelemetry?

OpenTelemetry — это open-source фреймворк для observability, предназначенный для:

  • Трейсы: распределённая трассировка запросов между сервисами
  • Логи: структурированное логирование приложений
  • Метрики: пользовательские метрики приложения и бизнес-метрики

Зачем нужен OTLP?

Вендор-нейтральный стандарт

  • Промышленный стандарт протокола (проект CNCF)
  • Отсутствие привязки к вендору
  • Широкая поддержка языков (Java, Python, Go, Node.js, PHP, Ruby, .NET и др.)

Унифицированная observability

  • Единый SDK для трейсов, логов и метрик
  • Автоматическая инструментация популярных фреймворков
  • Согласованный контекст между сигналами

Богатая экосистема

  • Официальные SDK от OpenTelemetry
  • Авто-инструментация фреймворков (Express, Django, Gin, Laravel)
  • Тысячи интеграций от сообщества

Как это работает

Your App → OTLP SDK → StatusRadar Platform → Dashboard & Alerts

Поток данных:

  1. Ваше приложение: инструментировано с помощью OpenTelemetry SDK
  2. OTLP SDK: собирает трейсы, логи и метрики
  3. Платформа StatusRadar: принимает и обрабатывает телеметрию
  4. Dashboard: визуализация трейсов, поиск по логам, анализ метрик

Поддерживаемые сигналы

1. Трейсы

Отслеживание запросов между распределёнными сервисами:

from opentelemetry import trace

tracer = trace.get_tracer(__name__)

with tracer.start_as_current_span("process_payment"):
    # Your code here
    result = charge_card(amount)

Сценарии использования:

  • Визуализация потока запросов
  • Поиск узких мест производительности
  • Отслеживание ошибок между сервисами
  • Построение карты зависимостей

2. Логи

Структурированное логирование приложений:

import { logs } from '@opentelemetry/api-logs';

logger.emit({
  severityText: 'INFO',
  body: 'Payment processed',
  attributes: {
    user_id: '12345',
    amount: 49.99,
    currency: 'USD'
  }
});

Сценарии использования:

  • Централизованная агрегация логов
  • Структурированный поиск и фильтрация
  • Корреляция трейсов и логов
  • Журналы аудита

3. Метрики

Пользовательские метрики приложения:

import "go.opentelemetry.io/otel/metric"

meter := otel.Meter("my-service")
counter := meter.Int64Counter("requests_total")

counter.Add(ctx, 1, metric.WithAttributes(
    attribute.String("method", "POST"),
    attribute.String("endpoint", "/api/users"),
))

Сценарии использования:

  • Отслеживание бизнес-KPI
  • Метрики производительности приложения
  • Пользовательские дашборды
  • Мониторинг SLO

Эндпоинты

HTTP (рекомендуется)

https://otlp.statusradar.dev/v1/traces
https://otlp.statusradar.dev/v1/logs
https://otlp.statusradar.dev/v1/metrics

Аутентификация

Передавайте API-токен в заголовке:

curl -X POST https://otlp.statusradar.dev/v1/traces \
  -H "X-App-Token: your-api-key-here" \
  -H "Content-Type: application/json" \
  -d @trace.json

Быстрый старт

1. Создайте OTLP-приложение

  1. Dashboard → Observability → Apps
  2. Нажмите «Create App»
  3. Выберите «Backend (OTLP)»
  4. Скопируйте свой API Token

2. Установите OpenTelemetry SDK

Инструкции по установке для вашего языка смотрите в официальных руководствах OpenTelemetry Language Instrumentation:

3. Настройте SDK для StatusRadar

Node.js

const { NodeSDK } = require('@opentelemetry/sdk-node');
const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-http');
const { Resource } = require('@opentelemetry/resources');

const sdk = new NodeSDK({
  resource: new Resource({
    'service.name': 'my-service',
    'app.id': 'your-app-id'
  }),
  traceExporter: new OTLPTraceExporter({
    url: 'https://otlp.statusradar.dev/v1/traces',
    headers: {
      'X-App-Token': 'your-api-key'
    }
  })
});

sdk.start();

Python

from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter

trace.set_tracer_provider(TracerProvider(
    resource=Resource.create({
        "service.name": "my-service",
        "app.id": "your-app-id"
    })
))

otlp_exporter = OTLPSpanExporter(
    endpoint="https://otlp.statusradar.dev/v1/traces",
    headers={"X-App-Token": "your-api-key"}
)

trace.get_tracer_provider().add_span_processor(
    BatchSpanProcessor(otlp_exporter)
)

4. Проверьте поступление данных

  1. Dashboard → Observability → Apps → [Your App]
  2. Откройте вкладки «Traces», «Logs» или «Metrics»
  3. Данные должны появиться в течение нескольких секунд

Авто-инструментация

Node.js (Express, Fastify и др.)

const { getNodeAutoInstrumentations } = require('@opentelemetry/auto-instrumentations-node');

const sdk = new NodeSDK({
  instrumentations: [getNodeAutoInstrumentations()]
});

Автоматически инструментирует:

  • HTTP/HTTPS-запросы
  • Express, Fastify, Koa
  • MongoDB, MySQL, PostgreSQL
  • Redis, Memcached
  • AWS SDK
  • И ещё более 50 библиотек

Python (Django, Flask и др.)

После установки пакетов инструментации OpenTelemetry запустите своё приложение с авто-инструментацией:

opentelemetry-instrument python app.py

Инструкции по установке пакетов смотрите в руководстве по инструментации Python.

Go

import (
    "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
    "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc"
)

// Wrap HTTP handler
handler = otelhttp.NewHandler(handler, "my-server")

// Wrap gRPC client
conn, _ := grpc.Dial(addr,
    grpc.WithUnaryInterceptor(otelgrpc.UnaryClientInterceptor()),
)

Возможности

Распространение контекста

Автоматическое распространение контекста трейса между сервисами:

  • W3C Trace Context (рекомендуется)
  • B3 (Zipkin)
  • Jaeger

Сэмплирование

Управление объёмом данных:

  • Always on
  • На основе вероятности
  • На основе родительского спана
  • Ограничение частоты

Атрибуты ресурса

Метаданные, прикрепляемые ко всей телеметрии:

  • Имя сервиса, версия, окружение
  • Информация о хосте, контейнере, поде
  • Пользовательский бизнес-контекст

Безопасность

  • Очистка PII (номера карт, токены, пароли)
  • Редактирование на уровне полей
  • Фильтрация чувствительных заголовков

Квоты и тарификация

Каждый план включает месячные квоты:

  • Spans: количество спанов трейсов (по умолчанию: 100 000/месяц)
  • Logs: объём хранения логов в МБ (по умолчанию: 1 ГБ/месяц)
  • Metrics: количество хранимых точек данных (по умолчанию: без ограничения с лимитами по сроку хранения)

При превышении доступны top-up.

Сценарии использования

Микросервисы

  • Трассировка запросов через 10+ сервисов
  • Поиск медленных вызовов сервисов
  • Визуализация зависимостей между сервисами

Мониторинг API

  • Отслеживание производительности эндпоинтов
  • Мониторинг частоты ошибок
  • Оповещения о нарушениях SLO

Производительность базы данных

  • Измерение времени выполнения запросов
  • Поиск N+1-запросов
  • Мониторинг использования пула соединений

Бизнес-метрики

  • Отслеживание регистраций пользователей
  • Мониторинг метрик выручки
  • Оповещения о падении конверсии

Сравнение с RUM

OTLP (Backend) RUM (Frontend)
Сценарий использования Серверные приложения Браузерные приложения
Сигналы Трейсы, логи, метрики Просмотры страниц, vitals, ошибки
Язык Любой (Python, Go, Java и др.) JavaScript
Протокол OpenTelemetry Собственный RUM SDK
Авто-инструментация Да (фреймворки, БД, HTTP) Да (vitals, ошибки, клики)

Дальнейшие шаги

Полезные ссылки