Skip to content

Метрики

OpenTelemetry Metrics API позволяет измерять числовые характеристики системы: счётчики запросов, время ответа, использование ресурсов и другие показатели. Метрики периодически собираются и экспортируются в формате OTLP.

Архитектура

ОтелПровайдерМетрик
    └── ОтелМетр
            ├── ОтелСчетчик
            ├── ОтелРеверсивныйСчетчик
            ├── ОтелДатчик
            ├── ОтелГистограмма
            ├── ОтелЭкспоненциальнаяГистограмма
            ├── ОтелНаблюдаемыйСчетчик
            ├── ОтелНаблюдаемыйРеверсивныйСчетчик
            └── ОтелНаблюдаемыйДатчик

Создание провайдера

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

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

Транспорт = Новый ОтелHttpТранспорт("http://localhost:4318");
Экспортер = Новый ОтелЭкспортерМетрик(Транспорт);

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

Провайдер = Новый ОтелПостроительПровайдераМетрик()
    .УстановитьРесурс(Ресурс)
    .ДобавитьЧитатель(Читатель)
    .Построить();

Метр = Провайдер.ПолучитьМетр("my-library", "1.0.0");

Синхронные инструменты

Counter (Счётчик)

Монотонно возрастающий счётчик. Используется для подсчёта событий, запросов, байт и т.п.

bsl
// Создание
Счетчик = Метр.СоздатьСчетчик("http.requests", "Количество запросов", "1");

// Использование
Счетчик.Добавить(1);

// С атрибутами
Атрибуты = Новый ОтелАтрибуты();
Атрибуты.Установить("http.method", "GET");
Атрибуты.Установить("http.status_code", 200);
Счетчик.Добавить(1, Атрибуты);

UpDownCounter (Реверсивный счётчик)

Счётчик, который может как увеличиваться, так и уменьшаться. Используется для очередей, пула соединений.

bsl
ОчередьСчетчик = Метр.СоздатьРеверсивныйСчетчик("queue.size", "Размер очереди", "1");

ОчередьСчетчик.Добавить(1);   // задача добавлена
ОчередьСчетчик.Добавить(-1);  // задача обработана

Gauge (Датчик)

Фиксирует последнее измеренное значение. Используется для CPU, памяти, температуры.

bsl
Датчик = Метр.СоздатьДатчик("cpu.usage", "Загрузка CPU", "%");
Датчик.Записать(75.5);

// С атрибутами
Атрибуты = Новый ОтелАтрибуты();
Атрибуты.Установить("cpu.core", "0");
Датчик.Записать(62.3, Атрибуты);

Histogram (Гистограмма)

Распределяет значения по корзинам. Идеально для времени ответа, размеров запросов.

bsl
Гистограмма = Метр.СоздатьГистограмму("http.duration", "Время ответа", "ms");

// Запись измерения
Гистограмма.Записать(150);

// С атрибутами
Атрибуты = Новый ОтелАтрибуты();
Атрибуты.Установить("http.route", "/api/orders");
Гистограмма.Записать(230, Атрибуты);

ExponentialHistogram (Экспоненциальная гистограмма)

Гистограмма с автоматическими экспоненциальными корзинами. Более точная при широком диапазоне значений.

bsl
ЭксГистограмма = Метр.СоздатьЭкспоненциальнуюГистограмму("db.query.duration", "Время запроса к БД", "ms");
ЭксГистограмма.Записать(45);

Наблюдаемые (асинхронные) инструменты

Наблюдаемые инструменты вызывают callback-функцию при каждом сборе метрик. Это удобно для измерений, которые дорого получать по запросу.

ObservableCounter

bsl
// Регистрация callback
Функция ПолучитьОшибки(Наблюдение) Экспорт
    // вызывается при каждом сборе метрик
    Наблюдение.Записать(ПолучитьКоличествоОшибокИзСистемы());
КонецФункции

НаблСчетчик = Метр.СоздатьНаблюдаемыйСчетчик("process.errors", "Количество ошибок", "1");
НаблСчетчик.ДобавитьCallback(ЭтотОбъект, "ПолучитьОшибки");

ObservableUpDownCounter

bsl
Функция ПолучитьРазмерПула(Наблюдение) Экспорт
    Наблюдение.Записать(ПулСоединений.Размер());
КонецФункции

НаблРеверсивный = Метр.СоздатьНаблюдаемыйРеверсивныйСчетчик("db.pool.size", "Размер пула", "1");
НаблРеверсивный.ДобавитьCallback(ЭтотОбъект, "ПолучитьРазмерПула");

ObservableGauge

bsl
Функция ПолучитьПамять(Наблюдение) Экспорт
    Наблюдение.Записать(ПолучитьИспользуемуюПамятьМб());
КонецФункции

НаблДатчик = Метр.СоздатьНаблюдаемыйДатчик("process.memory", "Использование памяти", "MB");
НаблДатчик.ДобавитьCallback(ЭтотОбъект, "ПолучитьПамять");

Периодический читатель метрик

ОтелПериодическийЧитательМетрик запускает фоновый поток, который собирает и экспортирует метрики с заданным интервалом.

bsl
// Интервал задаётся в миллисекундах (60000 = 60 секунд)
Читатель = Новый ОтелПериодическийЧитательМетрик(Экспортер, 60000);
Читатель.Запустить();

// ... работа приложения ...

// При завершении — сброс накопленных метрик
Провайдер.Закрыть();

Настройка через переменную окружения:

bash
export OTEL_METRIC_EXPORT_INTERVAL=30000  # каждые 30 секунд

Читатель Prometheus

ОтелПрометеусЧитательМетрик предоставляет метрики в формате Prometheus для scraping:

bsl
Читатель = Новый ОтелПрометеусЧитательМетрик();

Провайдер = Новый ОтелПостроительПровайдераМетрик()
    .УстановитьРесурс(Ресурс)
    .ДобавитьЧитатель(Читатель)
    .Построить();

Представления (Views)

ОтелПредставление позволяет переименовывать инструменты, фильтровать атрибуты и менять агрегацию.

bsl
// Оставить только нужные атрибуты, убрать чувствительные данные
Селектор = Новый ОтелСелекторИнструментов();
Селектор.УстановитьИмяИнструмента("http.requests");

Представление = Новый ОтелПредставление();
Представление.УстановитьСелектор(Селектор);
Представление.УстановитьФильтрАтрибутов(Новый ОтелФильтрМетрик("http.method", "http.status_code"));

Провайдер = Новый ОтелПостроительПровайдераМетрик()
    .ДобавитьПредставление(Представление)
    .Построить();
bsl
// Использовать экспоненциальную гистограмму вместо явных корзин
Селектор = Новый ОтелСелекторИнструментов();
Селектор.УстановитьИмяИнструмента("http.duration");

Представление = Новый ОтелПредставление();
Представление.УстановитьСелектор(Селектор);
Представление.УстановитьАгрегацию(ОтелАгрегация.ExponentialHistogram());

Провайдер = Новый ОтелПостроительПровайдераМетрик()
    .ДобавитьПредставление(Представление)
    .Построить();

Агрегации

ОтелАгрегация определяет, как измерения объединяются в точку данных:

МетодОписание
ОтелАгрегация.Sum()Сумма всех измерений (Counter, UpDownCounter)
ОтелАгрегация.LastValue()Последнее значение (Gauge)
ОтелАгрегация.ExplicitBucketHistogram()Гистограмма с явными корзинами
ОтелАгрегация.ExponentialHistogram()Экспоненциальная гистограмма
ОтелАгрегация.Drop()Отбросить измерения (отключить инструмент)

Временна́я агрегация

ОтелВременнаяАгрегация определяет, как агрегируются данные во времени:

ЗначениеОписание
CumulativeНакопительные значения с начала работы (по умолчанию)
DeltaРазница за интервал экспорта
bash
# Настройка через переменную окружения
export OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE=delta

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