Мониторинг и метрики
Подсистема интеграции предоставляет встроенную поддержку экспорта метрик в формате 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:
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-Type | text/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» (пэмРегламентныеОперации): при первом выполнении после обновления конфигурации оно снимает признак активности и очищает алгоритм у метрик, упразднённых выпуском. Задание предопределённое и включено по умолчанию. Это же задание выполняет и первоначальное заполнение на базе, где метрики ещё ни разу не заполнялись. Собственного обработчика обновления информационной базы у подсистемы нет, поэтому на базе с выключенным заданием не выполняется ни то, ни другое: упразднённые метрики продолжают выгружаться прежними алгоритмами.
Команда, применяющая новый состав метрик
Состав метрик целиком применяет команда «Первоначальное заполнение». Путь к ней:
- Раздел командного интерфейса «Prometheus».
- Панель действий, группа «Сервис», команда «Настройки» — открывается форма «Настройки метрик».
- Кнопка «Первоначальное заполнение» в командной панели формы.
Команда выполняется без запроса подтверждения, поэтому последствия читаются до нажатия, а не после.
Заголовок команды не отражает её назначения
Заголовок говорит о первоначальном заполнении, но команда применяет индекс метрик целиком и к уже заполненному справочнику: признак выполненного первоначального заполнения она не проверяет. Это и есть штатный способ обновить состав метрик на работающей базе.
После выполнения команды состав метрик проверяется ответом опроса GET /<имя_базы>/hs/prometheus/polling: в нём должны появиться новые имена метрик.
Обновление отдельной метрики
Одну метрику обновляет команда «Обновить» на форме элемента справочника пэмМетрики (полный заголовок команды — «Обновить метрику из макета»). Команда видна при одновременном выполнении двух условий: метрика предопределённая и версия её алгоритма в поставке выше версии, сохранённой в базе. Рядом с командой выводится надпись вида «Доступна новая версия алгоритма метрики (v1 → v2)».
В отличие от «Первоначального заполнения», эта команда персональное расписание метрики не сбрасывает.
Последствия обновления состава метрик
Команда «Первоначальное заполнение» перезаписывает наименование, тип, метод получения, признак активности, алгоритм и версию каждой предопределённой метрики значениями из поставки. Запись пропускается только у метрики, версия которой в базе не ниже версии в поставке и алгоритм которой заполнен.
Персональное расписание сбрасывается, а прежнее задание остаётся
Команда очищает у метрики ссылку на персональное регламентное задание, но само задание не удаляет. Метрика возвращается в общий цикл расчёта и одновременно продолжает рассчитываться осиротевшим персональным заданием — то есть считается дважды, расходуя ресурсы сервера на каждый лишний расчёт.
Осиротевшее задание из формы метрики уже не видно: флажок «Персональное расписание» снят. Удалить его можно только из списка регламентных заданий базы.
Перед выполнением команды выпишите метрики с персональным расписанием, а после — удалите оставшиеся от них задания и назначьте расписание заново.
Ручные правки алгоритмов теряются
Алгоритм предопределённой метрики заменяется текстом из поставки. Если алгоритм правился вручную, правка теряется без предупреждения, поэтому её следует сохранить отдельно до выполнения команды.
Метрики, заведённые администратором вручную как обычные, непредопределённые элементы справочника пэмМетрики, командой не затрагиваются: проход выполняется по перечню предопределённых метрик из поставки. Не затрагивает их и гашение упразднённых метрик.
Переименованные метрики
Прежние имена перестают выгружаться: прежнее и новое имя одновременно в ответе не присутствуют. Панели Grafana и правила оповещений следует перевести на новые имена.
| Прежнее имя | Новое имя |
|---|---|
pde_scrape_duration | pde_metric_calculation_duration_seconds |
pde_last_refresh | pde_metric_last_refresh_timestamp_seconds |
pde_error_count | pde_operations_awaiting_intervention |
pde_retry_count | pde_operations_awaiting_retry |
Переименование pde_error_count меняет и смысл метрики: она считает только операции, исчерпавшие число попыток, тогда как прежняя считала все операции в состоянии ошибки. Метка error_type упразднена, разбивка ведётся по потоку данных. Пороги оповещений подлежат пересмотру, а не только переименованию.
Метрики, сохранившие имя
| Метрика | Прежний набор меток | Новый набор меток |
|---|---|---|
pde_queue_length | label со значениями incomingQueue, outcomingQueue, outcomingFormingQueue | queue со значениями incoming, outgoing, distribution |
pde_oldest_pending_age_seconds | queue со значениями incoming, outgoing, distribution | queue со значениями 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.
Алерты:
- 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.
Возраст очереди рассылки определяется по паре «сообщение — подписчик»: сообщение, доставленное четырём подписчикам из пяти, продолжает учитываться через оставшуюся ожидающую пару.
Алерты:
- 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 |
Устройство счётчика
Значение по каждому сочетанию меток равно сумме двух величин:
- числа записей регистра
инт_СтатистикаОбработкиСообщений, отвечающих этому сочетанию на момент расчёта; - накопленного числа удалённых записей того же сочетания из регистра
инт_УдаленнаяСтатистикаОбработкиСообщений.
Новая операция увеличивает первое слагаемое на единицу. Очистка устаревшей статистики уменьшает первое слагаемое на число удалённых записей и на столько же увеличивает второе: подсчёт удаляемых записей, их удаление и прибавление к накопленному итогу выполняются в одной транзакции для каждой порции. Сумма при очистке не меняется, поэтому счётчик монотонен.
Каждая запись регистра статистики считается одной операцией: повторная обработка одного и того же сообщения увеличивает счётчик ещё раз. Если операций не было, метрика выгружается со значением 0 по каждому активному потоку данных и каждому применимому сочетанию меток operation и status.
Когда значение счётчика уменьшается
| Случай | Наблюдаемое поведение |
|---|---|
| Восстановление базы из архива, перенос базы | Оба регистра восстанавливаются согласованно. Счётчик уменьшается на объём операций, выполненных после точки восстановления. Prometheus распознаёт убывание как сброс и со следующего опроса считает скорость корректно. |
| Ручная очистка регистра статистики, свёртка информационной базы | Записи удаляются без обновления накопленного итога, компенсации не происходит. Prometheus засчитывает следующее значение целиком как прирост — однократный выброс, равный текущему значению счётчика. |
| Ручное изменение регистра накопленных удалений | Следствие то же, что и при ручной очистке статистики. Права на изменение регистра не выдаются пользователям вне роли администратора информационной базы. |
Чтобы выброса не возникало, удаляйте записи регистра статистики только регламентным заданием инт_ОчисткаСтатистикиОбработкиСообщений: оно обновляет накопленный итог. Развёртывание новой базы, в которой ни одной операции ещё не выполнялось, сбросом не является — счётчик начинает отсчёт с нуля, что для типа Counter штатно.
Пример 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).
Алерты:
- 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. Пропуск ряда потребитель не отличил бы от остановки сбора, а нулевое значение прямо говорит, что ответ полон.
Алерты:
- alert: MetricsCalculationErrors
expr: pde_metric_calculation_errors > 0
for: 5m
labels:
severity: warning
annotations:
summary: "Часть метрик не рассчитывается"Сводная таблица метрик
| Метрика | Тип | Источник | Лейблы |
|---|---|---|---|
pde_queue_length | Gauge | Статусные регистры | queue |
pde_oldest_pending_age_seconds | Gauge | Статусные регистры | queue |
pde_operations_awaiting_intervention | Gauge | Статусные регистры | flow_name, direction |
pde_operations_awaiting_retry | Gauge | Статусные регистры | flow_name, direction |
pde_formation_duration_seconds | Histogram | Статистика | flow_name, status |
pde_send_duration_seconds | Histogram | Статистика | flow_name, subscriber, status |
pde_incoming_duration_seconds | Histogram | Статистика | flow_name, status |
pde_messages_processed_total | Counter | Статистика | flow_name, operation, status |
pde_metric_last_refresh_timestamp_seconds | Gauge | Служебная | metric |
pde_metric_calculation_duration_seconds | Gauge | Служебная | metric |
pde_metric_calculation_errors | Gauge | Служебная | — |
Добавление пользовательских метрик
Метрики хранятся в справочнике пэмМетрики. Для добавления новой метрики:
- Создайте общий макет (
CommonTemplate) с алгоритмом расчёта - Добавьте элемент справочника с настройками:
- Код — имя метрики в Prometheus (например,
my_custom_metric) - Тип метрики —
CounterилиGauge - Метод получения —
Pull(HTTP scrape) илиPush(Pushgateway) - Алгоритм — текст BSL-кода из макета
- Код — имя метрики в Prometheus (например,
Формат алгоритма:
// Результат должен быть в переменной ТаблицаЗначений
// Колонки: label1, label2, ..., value (число)
ТаблицаЗначений = Новый ТаблицаЗначений;
ТаблицаЗначений.Колонки.Добавить("my_label", Новый ОписаниеТипов("Строка"));
ТаблицаЗначений.Колонки.Добавить("value", Новый ОписаниеТипов("Число"));
Запрос = Новый Запрос;
Запрос.Текст = "...";
ТаблицаЗначений = Запрос.Выполнить().Выгрузить();Интеграция с Grafana
Рекомендуемые панели Grafana
| Панель | Метрики | Тип визуализации |
|---|---|---|
| Размер очередей | pde_queue_length | Time series / Stat |
| Ошибки, требующие разбора | sum(pde_operations_awaiting_intervention) by (flow_name) | Bar chart |
| Пропускная способность | rate(pde_messages_processed_total[5m]) | Time series |
| Время обработки | pde_*_duration_seconds_bucket | Heatmap |
| Квантили времени обработки | histogram_quantile(0.95, sum(rate(pde_incoming_duration_seconds_bucket[5m])) by (le, flow_name)) | Time series |
| Застрявшие сообщения | pde_oldest_pending_age_seconds | Gauge / Alert list |
| Повторные попытки | pde_operations_awaiting_retry | Stat / Table |
Пример дашборда
{
"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 }})" }
]
}
]
}Рекомендации по алертам
Критические
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 часов"Предупреждения
- 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 }}"Диагностика через журнал регистрации
Помимо метрик, подсистема пишет события в журнал регистрации:
| Событие | Описание |
|---|---|
ПодсистемаИнтеграции.ОчередьИсходящихСообщений | Формирование и отправка |
ПодсистемаИнтеграции.ОбработкаВходящихСообщений | Обработка входящих |
ПодсистемаИнтеграции.МенеджерПотоковОбработки* | Работа менеджеров потоков |
Связанные материалы
- Очереди сообщений — как работают очереди
- Многопоточность — параллельная обработка
- Обработка входящих — настройка входящих потоков