ИнтерфейсПродюсерМетрик
Интерфейс продюсера метрик (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:
Перем Область;
Перем ВремяЗапуска;
&Реализует("ИнтерфейсПродюсерМетрик")
Процедура ПриСозданииОбъекта()
Область = Новый ОтелОбластьИнструментирования("queue-bridge", "1.0");
ВремяЗапуска = ОтелУтилиты.ТекущееВремяВНаносекундах();
КонецПроцедуры
Функция Произвести(Ресурс, ТаймаутМс) Экспорт
НачалоМс = ТекущаяУниверсальнаяДатаВМиллисекундах();
Попытка
Обработано = ПрочитатьСчетчикОчереди();
Исключение
Возврат Новый ОтелРезультатПроизводстваМетрик("Failure", , ОписаниеОшибки());
КонецПопытки;
Если ТаймаутМс > 0 И ТекущаяУниверсальнаяДатаВМиллисекундах() - НачалоМс > ТаймаутМс Тогда
Возврат Новый ОтелРезультатПроизводстваМетрик("Timeout", , "Очередь не ответила в срок");
КонецЕсли;
Точка = Новый Соответствие();
Точка.Вставить("attributes", Новый Массив());
Точка.Вставить("startTimeUnixNano", ВремяЗапуска);
Точка.Вставить("timeUnixNano", ОтелУтилиты.ТекущееВремяВНаносекундах());
Точка.Вставить("value", Обработано);
Точки = Новый Массив();
Точки.Добавить(Точка);
Данные = Новый ОтелДанныеМетрики(Ресурс, Область, "queue.messages.processed",
"Обработанные сообщения", "{message}", ОтелТипМетрики.Сумма(), Точки, Истина);
Данные.УстановитьВременнуюАгрегацию(ОтелВременнаяАгрегация.Кумулятивная());
Метрики = Новый Массив();
Метрики.Добавить(Данные);
Возврат Новый ОтелРезультатПроизводстваМетрик("Success", Метрики);
КонецФункции
Функция ПрочитатьСчетчикОчереди()
// ... запрос к брокеру очередей ...
Возврат 42;
КонецФункцииПодключение к читателю:
ПодключитьСценарий("МостМетрикОчереди.os", "МостМетрикОчереди");
Транспорт = Новый ОтелHttpТранспорт("http://localhost:4318");
Читатель = Новый ОтелПериодическийЧитательМетрик(Новый ОтелЭкспортерМетрик(Транспорт));
Читатель.ДобавитьПродюсер(Новый МостМетрикОчереди());
Ресурс = ОтелРесурсы.ПоУмолчанию().ВПостроитель()
.Установить("service.name", "queue-bridge")
.Построить();
Провайдер = Новый ОтелПостроительПровайдераМетрик()
.УстановитьРесурс(Ресурс)
.ЗарегистрироватьЧитатель(Читатель)
.Построить();
Читатель.Запустить();