Skip to content

Экспорт данных

SDK поддерживает три транспорта для отправки телеметрии: HTTP (JSON и Protobuf), gRPC и InMemory (для тестов). Все экспортеры работают с любым транспортом — достаточно передать нужный объект транспорта.

Архитектура

Транспорт → Экспортер → Процессор → Провайдер
  • Транспорт (ОтелHttpТранспорт, ОтелGrpcТранспорт, ОтелВПамятьТранспорт) — отвечает за физическую отправку данных.
  • Экспортер (ОтелЭкспортерСпанов, ОтелЭкспортерЛогов, ОтелЭкспортерМетрик) — сериализует данные и передаёт транспорту.
  • Процессор — буферизирует и вызывает экспортер.

HTTP-транспорт

ОтелHttpТранспорт отправляет данные по OTLP/HTTP (порт 4318). Поддерживает два формата: http/protobuf (по умолчанию) и http/json.

bsl
// Protobuf — бинарный формат, более компактный
Транспорт = Новый ОтелHttpТранспорт("http://localhost:4318");
// Транспорт.УстановитьПротокол("http/protobuf"); // явно, необязательно
bsl
Транспорт = Новый ОтелHttpТранспорт("http://localhost:4318");
Транспорт.УстановитьПротокол("http/json");
bsl
Транспорт = Новый ОтелHttpТранспорт("http://otel-collector:4318");
Транспорт.УстановитьПротокол("http/protobuf");
Транспорт.УстановитьЗаголовок("Authorization", "Bearer my-token");
Транспорт.УстановитьЗаголовок("X-Team", "backend");
Транспорт.УстановитьТаймаут(15000); // 15 секунд
bsl
Транспорт = Новый ОтелHttpТранспорт("http://localhost:4318");
Транспорт.УстановитьСжатие("gzip");

Эндпоинты HTTP

Экспортеры автоматически добавляют суффикс пути к базовому URL транспорта:

ЭкспортерПуть
ОтелЭкспортерСпанов/v1/traces
ОтелЭкспортерЛогов/v1/logs
ОтелЭкспортерМетрик/v1/metrics

gRPC-транспорт

ОтелGrpcТранспорт отправляет данные по OTLP/gRPC (порт 4317) через библиотеку oint (OPI_GRPC).

Для использования gRPC необходимо установить oint 1.33.0+: opm install oint

bsl
#Использовать opentelemetry

// gRPC-транспорт — порт 4317 (стандартный OTLP gRPC)
Транспорт = Новый ОтелGrpcТранспорт("http://localhost:4317");

// Все три экспортера работают с gRPC так же, как с HTTP
ЭкспортерСпанов = Новый ОтелЭкспортерСпанов(Транспорт);
ЭкспортерЛогов = Новый ОтелЭкспортерЛогов(Транспорт);
ЭкспортерМетрик = Новый ОтелЭкспортерМетрик(Транспорт);

InMemory-транспорт (для тестов)

ОтелВПамятьТранспорт сохраняет сериализованные данные в памяти. Используется в тестах для проверки экспортируемых данных без реальной сети.

bsl
Транспорт = Новый ОтелВПамятьТранспорт();

Экспортер = Новый ОтелЭкспортерСпанов(Транспорт);
Процессор = Новый ОтелПростойПроцессорСпанов(Экспортер);

Провайдер = Новый ОтелПровайдерТрассировки(Ресурс, Процессор);
Трассировщик = Провайдер.ПолучитьТрассировщик("test");

// Работа
Спан = Трассировщик.НачатьСпан("тест", ОтелВидСпана.Внутренний());
Спан.Завершить();

// Проверка экспортированных данных
Записи = Транспорт.ПолучитьЗаписи();
// Записи — массив сериализованных OTLP-пакетов

TLS

ОтелНастройкиTls позволяет настроить взаимную TLS-аутентификацию (mTLS):

bsl
НастройкиTls = Новый ОтелНастройкиTls();
НастройкиTls.УстановитьПутьКСертификатуCA("/etc/ssl/certs/ca.pem");
НастройкиTls.УстановитьПутьККлиентскомуКлючу("/etc/ssl/private/client.key");
НастройкиTls.УстановитьПутьККлиентскомуСертификату("/etc/ssl/certs/client.pem");

Транспорт = Новый ОтелHttpТранспорт("https://otel-collector:4318");
Транспорт.УстановитьНастройкиTls(НастройкиTls);

TLS через переменные окружения:

ПеременнаяОписание
OTEL_EXPORTER_OTLP_CERTIFICATEПуть к CA-сертификату (PEM)
OTEL_EXPORTER_OTLP_CLIENT_KEYПуть к клиентскому ключу (PEM)
OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATEПуть к клиентскому сертификату (PEM)
OTEL_EXPORTER_OTLP_INSECUREtrue — отключить проверку TLS (небезопасно)

Полные примеры

Трассировка + Логирование + Метрики

bsl
#Использовать opentelemetry

Ресурс = Новый ОтелРесурс();
Ресурс.Атрибуты().Установить("service.name", "my-service");

// Один транспорт для всех сигналов
Транспорт = Новый ОтелHttpТранспорт("http://otel-collector:4318");

// Трассировка
ЭкспортерСпанов = Новый ОтелЭкспортерСпанов(Транспорт);
ПроцессорСпанов = Новый ОтелПакетныйПроцессорСпанов(ЭкспортерСпанов);
ПровайдерТрассировки = Новый ОтелПровайдерТрассировки(Ресурс, ПроцессорСпанов);

// Логирование
ЭкспортерЛогов = Новый ОтелЭкспортерЛогов(Транспорт);
ПроцессорЛогов = Новый ОтелПакетныйПроцессорЛогов(ЭкспортерЛогов);
ПровайдерЛогирования = Новый ОтелПровайдерЛогирования(Ресурс, ПроцессорЛогов);

// Метрики
ЭкспортерМетрик = Новый ОтелЭкспортерМетрик(Транспорт);
Читатель = Новый ОтелПериодическийЧитательМетрик(ЭкспортерМетрик, 60000);
Читатель.Запустить();
ПровайдерМетрик = Новый ОтелПровайдерМетрик(Ресурс, Читатель);

// Завершение — сбрасывает все буферы
ПровайдерТрассировки.Закрыть();
ПровайдерЛогирования.Закрыть();
ПровайдерМетрик.Закрыть();

gRPC для всех сигналов

bsl
#Использовать opentelemetry

Ресурс = Новый ОтелРесурс();
Ресурс.Атрибуты().Установить("service.name", "my-service");

// gRPC-транспорт
Транспорт = Новый ОтелGrpcТранспорт("http://otel-collector:4317");

// Трассировка
ЭкспортерСпанов = Новый ОтелЭкспортерСпанов(Транспорт);
ПроцессорСпанов = Новый ОтелПакетныйПроцессорСпанов(ЭкспортерСпанов);
Провайдер = Новый ОтелПровайдерТрассировки(Ресурс, ПроцессорСпанов);

Трассировщик = Провайдер.ПолучитьТрассировщик("my-library");
Спан = Трассировщик.НачатьСпан("операция", ОтелВидСпана.Сервер());
Область = Спан.СделатьТекущим();
// ... работа ...
Область.Закрыть();
Спан.Завершить();

Провайдер.Закрыть();

Смотрите также