Skip to content

ИнтерфейсПродюсерМетрик ​

Интерфейс продюсера метрик (MetricProducer) — внешнего источника готовых данных метрик.

Описание ​

Продюсер метрик подключает к читателю метрик источник уже агрегированных метрик, например мост к другой библиотеке метрик (спецификация Metrics SDK, раздел MetricProducer). При каждом сборе читатель вызывает функцию продюсера Произвести и добавляет полученные данные к метрикам своих метров: периодический читатель передаёт их экспортёру, Prometheus-читатель выдаёт вместе с остальными метриками.

Продюсер — объект с экспортной функцией Произвести(Ресурс, ТаймаутМс). Читатели вызывают её напрямую и не проверяют, что класс реализует интерфейс. Класс продюсера может отметить реализацию аннотацией &Реализует("ИнтерфейсПродюсерМетрик") библиотеки extends — так классы SDK отмечают свои интерфейсы. Создавать объект ИнтерфейсПродюсерМетрик не нужно.

Подключение к читателю ​

Продюсер регистрируют у читателя методом ДобавитьПродюсер: ОтелПериодическийЧитательМетрик или ОтелПрометеусЧитательМетрик. У провайдера метрик и его построителя такого метода нет; читатели провайдера, в том числе созданные автоконфигурацией, возвращает ЧитателиМетрик() ОтелПровайдерМетрик. Читатель вызывает продюсеры по очереди, в порядке добавления, при каждом своём сборе; продюсер, добавленный к нескольким читателям, вызывается при сборе каждого из них.

SDK не обрабатывает метрики продюсера: представления (Views), лимиты мощности, фильтры атрибутов и фильтр exemplars к ним не применяются.

Данные метрик ​

Метрики продюсер возвращает объектами ОтелДанныеМетрики (формат точек данных — на её странице):

  • ресурс — из параметра Ресурс: данные метрик содержат ресурс, поэтому читатель передаёт его продюсеру (спецификация, раздел Produce batch);
  • область инструментирования — одна на все метрики продюсера, она идентифицирует продюсер (спецификация, раздел Produce batch: Produce SHOULD include a single InstrumentationScope which identifies the MetricProducer);
  • временная агрегация — УстановитьВременнуюАгрегацию, если продюсер знает, как источник накапливает значения (спецификация, раздел MetricProducer: реализации SHOULD принимать настройку временной агрегации выдаваемых метрик). Без неё OTLP-экспортёр выбирает временную агрегацию своим селектором по типу метрики (ОтелСелекторВременнойАгрегации). Сумму и гистограмму с временной агрегацией Дельта() Prometheus-читатель пропускает с предупреждением в логе: Prometheus принимает только кумулятивные данные.

Метрике без ресурса читатель задаёт ресурс, переданный в Произвести, метрике без области — пустую область (без имени и версии): такие метрики экспортируются и выдаются, как остальные.

Продюсер может передавать и сводки (ОтелТипМетрики.Сводка), которых инструменты SDK не создают.

Ошибки и таймаут ​

Читатель вызывает Произвести в своём потоке сбора и не прерывает её: уложиться в ТаймаутМс должен сам продюсер. Если не успевает, он возвращает результат со статусом Timeout.

Сбой продюсера не мешает сбору: метрики метров и остальных продюсеров собираются как обычно, а о сбое сообщает результат сбора — ОтелРезультатЭкспорта из СброситьБуфер периодического читателя или выходной параметр РезультатСбора Prometheus-читателя:

  • исключение в Произвести или статус, отличный от Success и Timeout (обычно Failure), — результат сбора с ошибкой; в лог пишется предупреждение с описанием исключения или со статусом и СообщениеОшибки;
  • статус Timeout — результат сбора с таймаутом, если других сбоев нет; предупреждение в лог тоже пишется.

Метрики неуспешного результата читатель не использует, даже если они заполнены.

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

Прежний контракт: Произвести возвращала массив ОтелДанныеМетрики. Такой результат читатели по-прежнему принимают как успешный.

Методы ​

Произвести ​

Возвращает метрики источника. Реализует продюсер, вызывает читатель при каждом сборе.

ПараметрТипПо умолчаниюОписание
РесурсОтелРесурс—Ресурс провайдера метрик, у которого зарегистрирован читатель; у читателя без провайдера — ресурс по умолчанию (ОтелРесурсы.ПоУмолчанию()). Продюсер передаёт его в данные метрик
ТаймаутМсЧисло—Время на производство в миллисекундах, 0 — без ограничения. Периодический читатель передаёт время, оставшееся до срока СброситьБуфер, ПринудительноВыгрузитьСРезультатом или Закрыть; при периодическом сборе и при вызове СброситьБуфер() самого читателя без срока — 0. СброситьБуфер() и Закрыть() провайдера метрик без срока дают читателю срок 30000 мс. Prometheus-читатель всегда передаёт 0: у сбора по запросу срока нет

Возвращает: ОтелРезультатПроизводстваМетрик — статус Success и метрики, Failure и сообщение об ошибке или Timeout, если продюсер не уложился в ТаймаутМс

Пример ​

Класс продюсера, файл МостМетрикОчереди.os:

bsl
Перем Область;
Перем ВремяЗапуска;

&Реализует("ИнтерфейсПродюсерМетрик")
Процедура ПриСозданииОбъекта()
    Область = Новый ОтелОбластьИнструментирования("queue-bridge", "1.0");
    ВремяЗапуска = ОтелУтилиты.ТекущееВремяВНаносекундах();
КонецПроцедуры

Функция Произвести(Ресурс, ТаймаутМс) Экспорт
    НачалоМс = ТекущаяУниверсальнаяДатаВМиллисекундах();
    Попытка
        Обработано = ПрочитатьСчетчикОчереди();
    Исключение
        Возврат Новый ОтелРезультатПроизводстваМетрик("Failure", , ОписаниеОшибки());
    КонецПопытки;
    Если ТаймаутМс > 0 И ТекущаяУниверсальнаяДатаВМиллисекундах() - НачалоМс > ТаймаутМс Тогда
        Возврат Новый ОтелРезультатПроизводстваМетрик("Timeout", , "Очередь не ответила в срок");
    КонецЕсли;

    Точка = Новый Соответствие();
    Точка.Вставить("attributes", Новый Массив());
    Точка.Вставить("startTimeUnixNano", ВремяЗапуска);
    Точка.Вставить("timeUnixNano", ОтелУтилиты.ТекущееВремяВНаносекундах());
    Точка.Вставить("value", Обработано);
    Точки = Новый Массив();
    Точки.Добавить(Точка);

    Данные = Новый ОтелДанныеМетрики(Ресурс, Область, "queue.messages.processed",
        "Обработанные сообщения", "{message}", ОтелТипМетрики.Сумма(), Точки, Истина);
    Данные.УстановитьВременнуюАгрегацию(ОтелВременнаяАгрегация.Кумулятивная());

    Метрики = Новый Массив();
    Метрики.Добавить(Данные);
    Возврат Новый ОтелРезультатПроизводстваМетрик("Success", Метрики);
КонецФункции

Функция ПрочитатьСчетчикОчереди()
    // ... запрос к брокеру очередей ...
    Возврат 42;
КонецФункции

Подключение к читателю:

bsl
ПодключитьСценарий("МостМетрикОчереди.os", "МостМетрикОчереди");

Транспорт = Новый ОтелHttpТранспорт("http://localhost:4318");
Читатель = Новый ОтелПериодическийЧитательМетрик(Новый ОтелЭкспортерМетрик(Транспорт));
Читатель.ДобавитьПродюсер(Новый МостМетрикОчереди());

Ресурс = ОтелРесурсы.ПоУмолчанию().ВПостроитель()
    .Установить("service.name", "queue-bridge")
    .Построить();

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

См. также ​