Skip to content

Мониторинг и метрики ​

Подсистема интеграции предоставляет встроенную поддержку экспорта метрик в формате Prometheus для мониторинга состояния очередей, производительности и обнаружения проблем.

Архитектура мониторинга ​

┌───────────────────────────────────────────────────────────────────┐
│                         1С:Предприятие                            │
│  ┌────────────────┐    ┌──────────────────┐    ┌───────────────┐  │
│  │ Регламентное   │───▶│ Справочник       │───▶│ Регистр       │  │
│  │ задание        │    │ пэмМетрики       │    │ пэмСостояние  │  │
│  │ пэм_ВыполнитьР │    │ (алгоритмы)      │    │ Метрик        │  │
│  │ асчетМетрик    │    └──────────────────┘    └───────┬───────┘  │
│  └────────────────┘                                    │          │
│                                                        ▼          │
│  ┌────────────────────────────────────────────────────────────┐   │
│  │           HTTP-сервис /prometheus/polling                  │   │
│  └────────────────────────────────────────────────────────────┘   │
└────────────────────────────────────────────────────────────────|──┘
                                                                 │
                    ┌────────────────────────────────────────────┼──┐
                    │                                            ▼  │
                    │  ┌──────────────┐    ┌──────────────────────┐ │
                    │  │  Prometheus  │───▶│      Grafana         │ │
                    │  │  (scrape)    │    │   (dashboards)       │ │
                    │  └──────────────┘    └──────────────────────┘ │
                    │                    Мониторинг                  │
                    └────────────────────────────────────────────────┘

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

Шаг 1. Назначить роли пользователям ​

Для работы мониторинга необходимо назначить роли пользователям 1С:

РольКому назначатьЧто даёт
PDE: Получение метрикСервисному пользователю, от имени которого Prometheus обращается к HTTP-сервисуДоступ к эндпоинту GET /prometheus/polling; чтение/запись регистра пэмСостояниеМетрик
PDE: Настройка метрикАдминистратору, настраивающему метрики через интерфейс 1СПолный доступ к справочнику пэмМетрики; управление константами Pushgateway; просмотр формы настроек
Администрирование интеграцииАдминистратору подсистемы (опционально)Включает расширенные права на константы Pushgateway, отчёт по состоянию метрик. Не включает справочник метрик и HTTP-сервис — они в выделенных ролях выше

Минимальная конфигурация

Для базового мониторинга через Prometheus достаточно одного сервисного пользователя с ролью PDE: Получение метрик.

Шаг 2. Настроить регламентное задание ​

Метрики рассчитываются регламентным заданием пэмВыполнитьРасчетМетрик:

ПараметрРекомендуемое значение
РасписаниеКаждые 30–60 секунд
МногопоточностьВключить (пэмМногопоточныйРасчетМетрик = Истина)

Персональное расписание расчёта метрики ​

Тяжёлой метрике можно назначить собственное регламентное задание: в форме элемента справочника пэмМетрики включается флажок «Персональное расписание», и метрика получает отдельное задание с собственным расписанием.

Персональное расписание меняет момент расчёта метрики, но не адрес её доставки:

Метод полученияПерсональное расписаниеГде доступно значение
PullнетРассчитывается в момент опроса и выдаётся в ответе GET /hs/prometheus/polling
PullдаРассчитывается по расписанию, сохраняется и выдаётся в ответе на опрос значением последнего расчёта
PushнетРассчитывается общим регламентным заданием и отправляется на Pushgateway
PushдаРассчитывается по персональному расписанию и отправляется на Pushgateway

Метрика с персональным расписанием в общем цикле не пересчитывается: двойного расчёта назначение расписания не вызывает. Значение метрики Pull хранится в регистре пэмСостояниеМетрик вместе с моментом расчёта, поэтому опрос выдаёт его без обращения к алгоритму, а возраст значения виден потребителю через pde_metric_last_refresh_timestamp_seconds.

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

Расписание задаёт частоту наблюдений

Значение метрики с персональным расписанием отстаёт от момента опроса на время до одного периода расписания. Расписание реже интервала опроса Prometheus даёт временную последовательность со ступенчатым графиком: соседние выборки повторяют одно и то же наблюдение.

Окно агрегации метрик длительности ​

Метрики длительности (pde_formation_duration_seconds, pde_send_duration_seconds, pde_incoming_duration_seconds) считают наблюдения за общее окно агрегации, заданное константой пэмОкноАгрегацииМетрикДлительностиСек (форма настроек метрик, группа «Метрики длительности»).

СвойствоЗначение
Значение по умолчанию300 секунд
Допустимый диапазонот 60 до 3600 секунд
Единица измерениясекунда

Окно должно быть не меньше интервала опроса Prometheus, иначе часть выборок окажется пустой, и не должно быть чрезмерно широким, иначе метрика долго удерживает след уже устранённой проблемы. Рекомендуемое соотношение — окно, равное пяти-десяти интервалам опроса: при scrape_interval: 30s это 150–300 секунд.

Одно и то же значение применяется всеми метриками длительности: сопоставимость метрик между собой важнее раздельной настройки. Изменённое значение действует со следующего расчёта, перезапуск сеансов не требуется. Незаполненная константа и значение вне диапазона расчёт не прерывают: применяется 300 секунд, а подмена записывается в журнал регистрации по событию Prometheus data exporter с уровнем «Предупреждение».

Изменение окна меняет значения метрик

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

Шаг 3. Настроить Prometheus ​

Pull-модель (рекомендуется) ​

HTTP-сервис для Prometheus scraping:

GET /<имя_базы>/hs/prometheus/polling
Authorization: Basic <credentials>

Конфигурация Prometheus:

yaml
scrape_configs:
  - job_name: '1c_integration'
    scrape_interval: 30s
    scrape_timeout: 10s
    metrics_path: /<имя_базы>/hs/prometheus/polling
    basic_auth:
      username: prometheus_user
      password: secret
    static_configs:
      - targets: ['1c-server.local:80']
        labels:
          instance: 'prod-erp'

Ответ эндпоинта:

Свойство ответаЗначение
Код состояния при успешном формировании200 — в том числе когда ни одна метрика не дала строк значений
Код состояния, когда не рассчитана ни одна метрика из-за ошибок500 с текстом ошибок в теле
Content-Typetext/plain; version=0.0.4; charset=utf-8
Кодировка телаUTF-8 без метки порядка байтов, последняя строка завершена переводом строки

Пустая база отвечает кодом 200, поэтому показатель up цели Prometheus отражает доступность базы, а не наличие в ней данных. Ошибка расчёта отдельных метрик ответ не отменяет: рассчитанные метрики выдаются с кодом 200, а число метрик, завершившихся ошибкой, выгружается служебной метрикой pde_metric_calculation_errors.

Push-модель (Pushgateway) ​

Для сред без прямого доступа к 1С можно настроить отправку метрик на Pushgateway:

КонстантаОписание
пэмИспользоватьPushgatewayВключить push-режим
пэмАдресСервераPushgatewayАдрес сервера (например, pushgateway.local)
пэмПортСервераPushgatewayПорт (по умолчанию 9091)
пэмПутьНаСервереPushgatewayПуть (по умолчанию /metrics/job/1c_integration)
пэмТаймаутСоединенияPushgatewayТайм-аут соединения в секундах (незаполненное значение означает 30)

Тайм-аут ограничивает время, на которое недоступный Pushgateway удерживает регламентное задание, поэтому его согласуют с интервалом запуска задания: при интервале 30 секунд тайм-аут больше 30 секунд приводит к тому, что задание не успевает завершиться до следующего запуска.

Успешной доставкой считается ответ Pushgateway с кодом 200 или 202. Любой иной код состояния, отказ соединения и незаполненная константа адреса или пути записываются в журнал регистрации по событию Prometheus data exporter с уровнем «Ошибка» — с адресом, портом, путём и телом ответа. Неуспешная доставка регламентное задание не прерывает: следующая попытка приходится на следующий запуск задания. Пустая строка метрик на Pushgateway не отправляется, чтобы не удалить ранее опубликованную группу метрик; факт отсутствия метрик записывается в журнал с уровнем «Информация».

Обновление подсистемы на работающей базе ​

Раздел адресован администратору базы, на которой мониторинг уже настроен и справочник метрик однажды заполнен. Первичная настройка описана выше, здесь описано только то, что требуется выполнить после обновления конфигурации.

Состав метрик обновляется вручную

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

Пока команда обновления не выполнена, ни одно изменение метрик, внесённое выпуском, до базы не доходит: переименованные метрики выгружаться перестают, пришедшие им на смену не появляются, pde_queue_length и pde_oldest_pending_age_seconds считаются алгоритмами прежнего выпуска, метрики длительности остаются датчиками Gauge с меткой aggregation.

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

Прежние имена упразднённых метрик гасит регламентное задание «Регламентные операции Prometheus» (пэмРегламентныеОперации): при первом выполнении после обновления конфигурации оно снимает признак активности и очищает алгоритм у метрик, упразднённых выпуском. Задание предопределённое и включено по умолчанию. Это же задание выполняет и первоначальное заполнение на базе, где метрики ещё ни разу не заполнялись. Собственного обработчика обновления информационной базы у подсистемы нет, поэтому на базе с выключенным заданием не выполняется ни то, ни другое: упразднённые метрики продолжают выгружаться прежними алгоритмами.

Команда, применяющая новый состав метрик ​

Состав метрик целиком применяет команда «Первоначальное заполнение». Путь к ней:

  1. Раздел командного интерфейса «Prometheus».
  2. Панель действий, группа «Сервис», команда «Настройки» — открывается форма «Настройки метрик».
  3. Кнопка «Первоначальное заполнение» в командной панели формы.

Команда выполняется без запроса подтверждения, поэтому последствия читаются до нажатия, а не после.

Заголовок команды не отражает её назначения

Заголовок говорит о первоначальном заполнении, но команда применяет индекс метрик целиком и к уже заполненному справочнику: признак выполненного первоначального заполнения она не проверяет. Это и есть штатный способ обновить состав метрик на работающей базе.

После выполнения команды состав метрик проверяется ответом опроса GET /<имя_базы>/hs/prometheus/polling: в нём должны появиться новые имена метрик.

Обновление отдельной метрики ​

Одну метрику обновляет команда «Обновить» на форме элемента справочника пэмМетрики (полный заголовок команды — «Обновить метрику из макета»). Команда видна при одновременном выполнении двух условий: метрика предопределённая и версия её алгоритма в поставке выше версии, сохранённой в базе. Рядом с командой выводится надпись вида «Доступна новая версия алгоритма метрики (v1 → v2)».

В отличие от «Первоначального заполнения», эта команда персональное расписание метрики не сбрасывает.

Последствия обновления состава метрик ​

Команда «Первоначальное заполнение» перезаписывает наименование, тип, метод получения, признак активности, алгоритм и версию каждой предопределённой метрики значениями из поставки. Запись пропускается только у метрики, версия которой в базе не ниже версии в поставке и алгоритм которой заполнен.

Персональное расписание сбрасывается, а прежнее задание остаётся

Команда очищает у метрики ссылку на персональное регламентное задание, но само задание не удаляет. Метрика возвращается в общий цикл расчёта и одновременно продолжает рассчитываться осиротевшим персональным заданием — то есть считается дважды, расходуя ресурсы сервера на каждый лишний расчёт.

Осиротевшее задание из формы метрики уже не видно: флажок «Персональное расписание» снят. Удалить его можно только из списка регламентных заданий базы.

Перед выполнением команды выпишите метрики с персональным расписанием, а после — удалите оставшиеся от них задания и назначьте расписание заново.

Ручные правки алгоритмов теряются

Алгоритм предопределённой метрики заменяется текстом из поставки. Если алгоритм правился вручную, правка теряется без предупреждения, поэтому её следует сохранить отдельно до выполнения команды.

Метрики, заведённые администратором вручную как обычные, непредопределённые элементы справочника пэмМетрики, командой не затрагиваются: проход выполняется по перечню предопределённых метрик из поставки. Не затрагивает их и гашение упразднённых метрик.

Переименованные метрики ​

Прежние имена перестают выгружаться: прежнее и новое имя одновременно в ответе не присутствуют. Панели Grafana и правила оповещений следует перевести на новые имена.

Прежнее имяНовое имя
pde_scrape_durationpde_metric_calculation_duration_seconds
pde_last_refreshpde_metric_last_refresh_timestamp_seconds
pde_error_countpde_operations_awaiting_intervention
pde_retry_countpde_operations_awaiting_retry

Переименование pde_error_count меняет и смысл метрики: она считает только операции, исчерпавшие число попыток, тогда как прежняя считала все операции в состоянии ошибки. Метка error_type упразднена, разбивка ведётся по потоку данных. Пороги оповещений подлежат пересмотру, а не только переименованию.

Метрики, сохранившие имя ​

МетрикаПрежний набор метокНовый набор меток
pde_queue_lengthlabel со значениями incomingQueue, outcomingQueue, outcomingFormingQueuequeue со значениями incoming, outgoing, distribution
pde_oldest_pending_age_secondsqueue со значениями incoming, outgoing, distributionqueue со значениями incoming, outgoing, distribution

У pde_queue_length изменились имя метки и набор её значений: запрос pde_queue_length{label="incomingQueue"} записывается как pde_queue_length{queue="incoming"}.

У pde_oldest_pending_age_seconds набор меток прежний, а изменился состав учитываемых операций: операция, которую подсистема больше не возьмёт в работу, возраст очереди больше не увеличивает. Значения обеих метрик после обновления отличаются от прежних, поэтому подобранные для них пороги оповещений подлежат пересмотру.

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

Перечень метрик ​

Все метрики имеют префикс pde_ (Prometheus Data Exporter). Встроенных метрик десять; кроме них ответ на опрос содержит служебную метрику pde_metric_calculation_errors, которую формирует сам обработчик опроса.

Метрики очередей ​

pde_queue_length ​

ТипGauge
ОписаниеЧисло ожидающих выполнения операций в трёх очередях подсистемы
Единица измеренияожидающая выполнения операция
Период агрегациитекущее состояние (моментальный снимок)
ЛейблОписаниеЗначения
queueОчередьincoming, outgoing, distribution

Единица измерения — операция, а не сообщение. Во входящей очереди операция — обработка сообщения, в исходящей — формирование и отправка сообщения, в очереди рассылки — отправка сообщения одному подписчику. Сообщение, ожидающее рассылки пяти подписчикам, даёт пять единиц в distribution, поэтому складывать три временные последовательности как однородные величины нельзя.

Ожидающими считаются операции, которые подсистема ещё возьмёт в работу: сообщения в статусе «Новый», записи рассылки в статусах «Сформирован» и «ВПроцессеОтправки», а также записи в статусах ошибки, у которых остались попытки. Сообщение, исчерпавшее попытки, в длину очереди не входит — его показывает pde_operations_awaiting_intervention.

Все три временные последовательности присутствуют в ответе всегда: при пустой очереди выводится 0.

Алерты:

yaml
- alert: QueueBacklog
  expr: pde_queue_length > 1000
  for: 5m
  labels:
    severity: warning
  annotations:
    summary: "Очередь {{ $labels.queue }} растёт"

Пороги пересмотрены

В значение метки distribution теперь входят записи в статусах «Сформирован» и «ВПроцессеОтправки», поэтому наблюдаемое значение выше прежнего. Порог подбирается заново по фактическому объёму рассылки установки, приведённое значение — только пример.


pde_oldest_pending_age_seconds ​

ТипGauge
ОписаниеВозраст старейшей ожидающей выполнения операции в секундах. Индикатор застревания очереди
Единица измерениясекунда
Период агрегациитекущее состояние
ЛейблОписаниеЗначения
queueОчередьincoming, outgoing, distribution

В расчёт входит то же множество ожидающих выполнения операций, что считает pde_queue_length: операция, которую подсистема больше не возьмёт в работу, возраст очереди не увеличивает, поэтому оповещение по возрасту гасится по мере разбора очереди, а не остаётся включённым навсегда. При пустой очереди выводится 0.

Возраст очереди рассылки определяется по паре «сообщение — подписчик»: сообщение, доставленное четырём подписчикам из пяти, продолжает учитываться через оставшуюся ожидающую пару.

Алерты:

yaml
- alert: StuckMessages
  expr: pde_oldest_pending_age_seconds > 3600
  for: 5m
  labels:
    severity: critical
  annotations:
    summary: "Сообщения застряли в очереди {{ $labels.queue }}"

Метрики ошибок ​

Две парные метрики делят операции, завершившиеся ошибкой, по признаку «кто выполнит следующий шаг»: подсистема сама или оператор. Множества метрик не пересекаются, набор лейблов у них общий, поэтому поэлементная сумма даёт полное число операций в статусах ошибки:

sum(pde_operations_awaiting_intervention) by (flow_name)
  + sum(pde_operations_awaiting_retry) by (flow_name)

Единица измерения обеих метрик — операция, та же, что у pde_queue_length: обработке входящего и формированию исходящего сообщения соответствует сообщение, отправке подписчику — пара «сообщение — подписчик». Общая единица измерения позволяет складывать разнородные ошибки в одно значение по потоку данных.

По каждому активному потоку данных обе метрики выводятся всегда: при отсутствии ошибок — со значением 0. Запись рассылки, поток данных которой определить не удалось, выводится с лейблом flow_name="unknown".

pde_operations_awaiting_intervention ​

ТипGauge
ОписаниеОперации, завершившиеся ошибкой и исчерпавшие число попыток: подсистема больше не возьмёт их в работу
Единица измеренияожидающая вмешательства оператора операция
ИсточникРегистры инт_ТекущийСтатусВходящихСообщений, инт_ТекущийСтатусИсходящихСообщений, инт_ТекущийСтатусРассылкиСообщений
Прежнее имяpde_error_count
ЛейблОписаниеЗначения
flow_nameНаименование потока данныхСтрока, unknown
directionНаправлениеincoming, outgoing

Попытки считаются исчерпанными, когда число выполненных попыток не меньше предела: реквизита КоличествоПопытокОбработки потока данных для входящих и исходящих сообщений либо реквизита КоличествоПопытокОтправки подписчика для рассылки. Незаполненный предел означает, что попытки исчерпаны.

Применение

Метрика отвечает на вопрос «что требует разбора вручную». Ошибки, которые подсистема исправит сама следующей попыткой, сюда не входят — их считает pde_operations_awaiting_retry.


pde_operations_awaiting_retry ​

ТипGauge
ОписаниеОперации, у которых уже была попытка и остались следующие: подсистема выполнит их сама
Единица измеренияожидающая повтора операция
ИсточникРегистры инт_ТекущийСтатусВходящихСообщений, инт_ТекущийСтатусИсходящихСообщений, инт_ТекущийСтатусРассылкиСообщений
Прежнее имяpde_retry_count
ЛейблОписаниеЗначения
flow_nameНаименование потока данныхСтрока, unknown
directionНаправлениеincoming, outgoing

Сообщение, ожидающее повторной рассылки трём подписчикам, даёт три единицы.

Применение

Высокие значения указывают на нестабильные внешние сервисы или ошибки в логике обработчиков. Вмешательство оператора при этом не требуется, пока значение не перетекает в pde_operations_awaiting_intervention.


Метрики производительности ​

Все три метрики длительности выгружаются типом Histogram. Каждая даёт три семейства строк: <имя>_bucket с лейблом le — накопленное число наблюдений с длительностью не больше границы, <имя>_sum — сумма длительностей в секундах, <имя>_count — число наблюдений. Пороги отклика строятся по квантилям выражением histogram_quantile, а не по предагрегированному среднему; лейбл aggregation со значениями avg и max упразднён.

Если за окно агрегации операций не было, метрика не исчезает из ответа: по каждому активному потоку данных выводятся нулевые _sum и _count. Если наименование потока данных или подписчик не определены, соответствующий лейбл принимает значение unknown.

pde_formation_duration_seconds ​

ТипHistogram
ОписаниеВремя выполнения обработчика формирования исходящих сообщений
Источникинт_СтатистикаОбработкиСообщений (ТипОперации = Формирование)
Период агрегацииокно из константы пэмОкноАгрегацииМетрикДлительностиСек (по умолчанию 300 секунд)
Границы корзин, с0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10, 30, +Inf
ЛейблОписаниеЗначения
flow_nameНаименование потока данныхСтрока, unknown
statusРезультат операцииsuccess, error
# 95-й процентиль времени успешного формирования по потокам данных
histogram_quantile(0.95, sum(rate(pde_formation_duration_seconds_bucket{status="success"}[5m])) by (le, flow_name))

pde_send_duration_seconds ​

ТипHistogram
ОписаниеВремя отправки сообщений подписчикам (включая сетевые задержки)
Источникинт_СтатистикаОбработкиСообщений (ТипОперации = Отправка)
Период агрегацииокно из константы пэмОкноАгрегацииМетрикДлительностиСек (по умолчанию 300 секунд)
Границы корзин, с0.1, 0.25, 0.5, 1, 2.5, 5, 10, 30, 60, +Inf
ЛейблОписаниеЗначения
flow_nameНаименование потока данныхСтрока, unknown
subscriberНаименование подписчикаСтрока, unknown
statusРезультат операцииsuccess, error

Лейбл subscriber отличает медленный внешний сервис одного подписчика от общей деградации потока данных. Число временных последовательностей метрики равно числу подписчиков и верхней границы не имеет: у потока данных обычно один подписчик.

# 95-й процентиль времени успешной отправки в разрезе подписчиков
histogram_quantile(0.95, sum(rate(pde_send_duration_seconds_bucket{status="success"}[5m])) by (le, subscriber))

pde_incoming_duration_seconds ​

ТипHistogram
ОписаниеВремя обработки входящих сообщений; метрика охватывает оба режима обработки — и асинхронный, и синхронный
Источникинт_СтатистикаОбработкиСообщений (ТипОперации = ОбработкаВходящего)
Период агрегацииокно из константы пэмОкноАгрегацииМетрикДлительностиСек (по умолчанию 300 секунд)
Границы корзин, с0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10, 30, +Inf
ЛейблОписаниеЗначения
flow_nameНаименование потока данныхСтрока, unknown
statusРезультат операцииsuccess, error

Сводка по синхронным потокам

Отдельная метрика pde_sync_incoming_duration_seconds упразднена: её наблюдения были строгим подмножеством наблюдений этой метрики, а разбивку по результату обработки даёт лейбл status. Реквизит АсинхроннаяОбработка принадлежит потоку данных, поэтому все наблюдения одного значения flow_name относятся к одному режиму, и сводка по синхронным потокам строится отбором по лейблу flow_name — перечислением потоков или регулярным выражением по соглашению об именовании:

sum(rate(pde_incoming_duration_seconds_count{status="error", flow_name=~"sync-.*"}[5m])) by (flow_name)

Метрики пропускной способности ​

pde_messages_processed_total ​

ТипCounter
ОписаниеЧисло выполненных операций обработки сообщений нарастающим итогом
Источникиинт_СтатистикаОбработкиСообщений, инт_УдаленнаяСтатистикаОбработкиСообщений
Единица измеренияоперация обработки
ЛейблОписаниеЗначения
flow_nameНаименование потока данныхСтрока, unknown — если поток данных не определён
operationВид операцииformation, send, incoming
statusРезультатsuccess, error
Устройство счётчика ​

Значение по каждому сочетанию меток равно сумме двух величин:

  1. числа записей регистра инт_СтатистикаОбработкиСообщений, отвечающих этому сочетанию на момент расчёта;
  2. накопленного числа удалённых записей того же сочетания из регистра инт_УдаленнаяСтатистикаОбработкиСообщений.

Новая операция увеличивает первое слагаемое на единицу. Очистка устаревшей статистики уменьшает первое слагаемое на число удалённых записей и на столько же увеличивает второе: подсчёт удаляемых записей, их удаление и прибавление к накопленному итогу выполняются в одной транзакции для каждой порции. Сумма при очистке не меняется, поэтому счётчик монотонен.

Каждая запись регистра статистики считается одной операцией: повторная обработка одного и того же сообщения увеличивает счётчик ещё раз. Если операций не было, метрика выгружается со значением 0 по каждому активному потоку данных и каждому применимому сочетанию меток operation и status.

Когда значение счётчика уменьшается ​
СлучайНаблюдаемое поведение
Восстановление базы из архива, перенос базыОба регистра восстанавливаются согласованно. Счётчик уменьшается на объём операций, выполненных после точки восстановления. Prometheus распознаёт убывание как сброс и со следующего опроса считает скорость корректно.
Ручная очистка регистра статистики, свёртка информационной базыЗаписи удаляются без обновления накопленного итога, компенсации не происходит. Prometheus засчитывает следующее значение целиком как прирост — однократный выброс, равный текущему значению счётчика.
Ручное изменение регистра накопленных удаленийСледствие то же, что и при ручной очистке статистики. Права на изменение регистра не выдаются пользователям вне роли администратора информационной базы.

Чтобы выброса не возникало, удаляйте записи регистра статистики только регламентным заданием инт_ОчисткаСтатистикиОбработкиСообщений: оно обновляет накопленный итог. Развёртывание новой базы, в которой ни одной операции ещё не выполнялось, сбросом не является — счётчик начинает отсчёт с нуля, что для типа Counter штатно.

Пример PromQL:

promql
# Пропускная способность, операций в секунду
sum(rate(pde_messages_processed_total{status="success"}[5m])) by (operation)

# Доля ошибок по потокам
sum(rate(pde_messages_processed_total{status="error"}[5m])) by (flow_name)
  / sum(rate(pde_messages_processed_total[5m])) by (flow_name)

Выражение rate вычисляет скорость по приросту счётчика, поэтому результат не зависит от интервала опроса и не искажается работой регламентной очистки статистики.


Служебные метрики ​

Метрики pde_metric_last_refresh_timestamp_seconds и pde_metric_calculation_duration_seconds читают регистр пэмСостояниеМетрик и используют один лейбл metric, поэтому соединяются в PromQL. В ответ попадают только метрики, помеченные активными в справочнике пэмМетрики.

pde_metric_last_refresh_timestamp_seconds ​

ТипGauge
ОписаниеМомент завершения последнего успешного расчёта метрики
Единица измерениясекунда эпохи Unix
Прежнее имяpde_last_refresh
ЛейблОписание
metricКод метрики справочника пэмМетрики

Отметка времени формируется из универсального времени, поэтому возраст расчёта не зависит от часового пояса базы и вычисляется потребителем:

time() - pde_metric_last_refresh_timestamp_seconds

Отметка обновляется только после успешного расчёта. Если расчёт метрики завершился ошибкой или не уложился в отведённое время, прежняя отметка сохраняется и вычисленный возраст растёт — это и есть признак сломанной метрики.

Пока ни одна метрика не рассчитана, регистр пуст и метрика в ответ не попадает: отметка времени несостоявшегося расчёта не определена. Такое состояние проверяется выражением absent(pde_metric_last_refresh_timestamp_seconds).

Алерты:

yaml
- alert: MetricsStale
  expr: time() - pde_metric_last_refresh_timestamp_seconds > 900
  for: 5m
  labels:
    severity: warning
  annotations:
    summary: "Метрика {{ $labels.metric }} не пересчитывается"

pde_metric_calculation_duration_seconds ​

ТипGauge
ОписаниеДлительность последнего расчёта метрики
Единица измерениясекунда
Прежнее имяpde_scrape_duration
ЛейблОписание
metricКод метрики справочника пэмМетрики

Длительность хранится в целых миллисекундах, поэтому разрешение измерения — одна миллисекунда, а расчёт быстрее миллисекунды выгружается значением 0, не пропадая из ответа.

Состояние расчёта записывается после формирования строки ответа, поэтому значения метрики относятся к предыдущему циклу расчёта, а не к текущему.


pde_metric_calculation_errors ​

ТипGauge
ОписаниеЧисло метрик, расчёт которых при формировании ответа завершился ошибкой
Единица измеренияметрика
ИсточникФормируется обработчиком опроса, элемента справочника пэмМетрики не имеет

Метрика выводится без лейблов и присутствует в ответе всегда: при отсутствии ошибок — со значением 0. Пропуск ряда потребитель не отличил бы от остановки сбора, а нулевое значение прямо говорит, что ответ полон.

Алерты:

yaml
- alert: MetricsCalculationErrors
  expr: pde_metric_calculation_errors > 0
  for: 5m
  labels:
    severity: warning
  annotations:
    summary: "Часть метрик не рассчитывается"

Сводная таблица метрик ​

МетрикаТипИсточникЛейблы
pde_queue_lengthGaugeСтатусные регистрыqueue
pde_oldest_pending_age_secondsGaugeСтатусные регистрыqueue
pde_operations_awaiting_interventionGaugeСтатусные регистрыflow_name, direction
pde_operations_awaiting_retryGaugeСтатусные регистрыflow_name, direction
pde_formation_duration_secondsHistogramСтатистикаflow_name, status
pde_send_duration_secondsHistogramСтатистикаflow_name, subscriber, status
pde_incoming_duration_secondsHistogramСтатистикаflow_name, status
pde_messages_processed_totalCounterСтатистикаflow_name, operation, status
pde_metric_last_refresh_timestamp_secondsGaugeСлужебнаяmetric
pde_metric_calculation_duration_secondsGaugeСлужебнаяmetric
pde_metric_calculation_errorsGaugeСлужебная—

Добавление пользовательских метрик ​

Метрики хранятся в справочнике пэмМетрики. Для добавления новой метрики:

  1. Создайте общий макет (CommonTemplate) с алгоритмом расчёта
  2. Добавьте элемент справочника с настройками:
    • Код — имя метрики в Prometheus (например, my_custom_metric)
    • Тип метрики — Counter или Gauge
    • Метод получения — Pull (HTTP scrape) или Push (Pushgateway)
    • Алгоритм — текст BSL-кода из макета

Формат алгоритма:

bsl
// Результат должен быть в переменной ТаблицаЗначений
// Колонки: label1, label2, ..., value (число)

ТаблицаЗначений = Новый ТаблицаЗначений;
ТаблицаЗначений.Колонки.Добавить("my_label", Новый ОписаниеТипов("Строка"));
ТаблицаЗначений.Колонки.Добавить("value", Новый ОписаниеТипов("Число"));

Запрос = Новый Запрос;
Запрос.Текст = "...";
ТаблицаЗначений = Запрос.Выполнить().Выгрузить();

Интеграция с Grafana ​

Рекомендуемые панели Grafana ​

ПанельМетрикиТип визуализации
Размер очередейpde_queue_lengthTime series / Stat
Ошибки, требующие разбораsum(pde_operations_awaiting_intervention) by (flow_name)Bar chart
Пропускная способностьrate(pde_messages_processed_total[5m])Time series
Время обработкиpde_*_duration_seconds_bucketHeatmap
Квантили времени обработкиhistogram_quantile(0.95, sum(rate(pde_incoming_duration_seconds_bucket[5m])) by (le, flow_name))Time series
Застрявшие сообщенияpde_oldest_pending_age_secondsGauge / Alert list
Повторные попыткиpde_operations_awaiting_retryStat / Table

Пример дашборда ​

json
{
  "title": "1C Integration Subsystem",
  "panels": [
    {
      "title": "Queue Length",
      "targets": [
        { "expr": "pde_queue_length", "legendFormat": "{{ queue }}" }
      ]
    },
    {
      "title": "Messages/min",
      "targets": [
        { "expr": "sum(rate(pde_messages_processed_total{status=\"success\"}[5m])) by (operation)" }
      ]
    },
    {
      "title": "Operations Awaiting Intervention",
      "targets": [
        { "expr": "sum(pde_operations_awaiting_intervention) by (flow_name)", "legendFormat": "{{ flow_name }}" }
      ]
    },
    {
      "title": "Incoming Duration p95",
      "targets": [
        { "expr": "histogram_quantile(0.95, sum(rate(pde_incoming_duration_seconds_bucket[5m])) by (le, flow_name, status))", "legendFormat": "{{ flow_name }} ({{ status }})" }
      ]
    }
  ]
}

Рекомендации по алертам ​

Критические ​

yaml
groups:
  - name: integration_critical
    rules:
      - alert: IntegrationQueueOverflow
        expr: pde_queue_length{queue="outgoing"} > 5000
        for: 10m
        labels:
          severity: critical
        annotations:
          summary: "Очередь исходящих переполнена"
          
      - alert: IntegrationStuckMessages
        expr: pde_oldest_pending_age_seconds > 7200
        # Порог гасится по мере разбора очереди: операции с исчерпанными попытками
        # в возраст очереди больше не входят
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "Сообщения не обрабатываются более 2 часов"

Предупреждения ​

yaml
      - alert: IntegrationOperationsAwaitingIntervention
        expr: sum(pde_operations_awaiting_intervention) > 10
        # Порог на порядок ниже прежнего порога по числу ошибок: метрика считает
        # только те операции, которые подсистема сама уже не выполнит
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "Операции интеграции ждут разбора оператором"
          
      - alert: IntegrationSlowProcessing
        expr: histogram_quantile(0.95, sum(rate(pde_formation_duration_seconds_bucket{status="success"}[5m])) by (le, flow_name)) > 10
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "Медленная обработка в потоке {{ $labels.flow_name }}"

      - alert: IncomingProcessingErrors
        expr: sum(rate(pde_incoming_duration_seconds_count{status="error"}[5m])) by (flow_name) > 0
        for: 1m
        labels:
          severity: warning
        annotations:
          summary: "Ошибки обработки входящих в потоке {{ $labels.flow_name }}"

Диагностика через журнал регистрации ​

Помимо метрик, подсистема пишет события в журнал регистрации:

СобытиеОписание
ПодсистемаИнтеграции.ОчередьИсходящихСообщенийФормирование и отправка
ПодсистемаИнтеграции.ОбработкаВходящихСообщенийОбработка входящих
ПодсистемаИнтеграции.МенеджерПотоковОбработки*Работа менеджеров потоков

Связанные материалы ​

Документация подсистемы интеграции