Initial commit: SES Monitor

Watchdog-демон для непрерывного мониторинга SES.
- Liveness-проверки API, лицензии, списка роботов
- Диалоговые сценарии из YAML с агрегацией в 6 фиксированных Zabbix-метрик
- Доставка: zabbix_sender (push) или UserParameter (poll)
- Hot-reload сценариев без перезапуска
This commit is contained in:
Maksim Totmin
2026-06-19 21:04:05 +07:00
commit 8dca7eb46b
25 changed files with 4267 additions and 0 deletions
+10
View File
@@ -0,0 +1,10 @@
# =============================================================================
# Резервный вариант: UserParameter для Zabbix Agent (пассивный режим).
# =============================================================================
# Используется если zabbix_sender недоступен.
# Поместить в /etc/zabbix/zabbix_agentd.d/ses_monitor.conf
# и перезапустить zabbix-agent: systemctl restart zabbix-agent
#
# Скрипт ses_monitor_zabbix_agent.py должен быть установлен в
# /opt/ses-monitor/scripts/ses_monitor_zabbix_agent.py
# =============================================================================
+465
View File
@@ -0,0 +1,465 @@
<?xml version="1.0" encoding="UTF-8"?>
<zabbix_export>
<version>6.0</version>
<date>2026-06-19T12:00:00Z</date>
<groups>
<group>
<name>Templates</name>
</group>
</groups>
<templates>
<template>
<uuid>a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6</uuid>
<template>SES Monitor</template>
<name>SES Monitor — Service Engine Server</name>
<description>Шаблон для мониторинга диалоговой сценарной машины SES.
Метрики отправляются watchdog-демоном ses-monitor через zabbix_sender (trapper).
Проверяет: доступность API, лицензию, выполнение сценариев, архив диалогов.
Сценарии задаются в YAML-файлах (config/scenarios/). Ключи метрик
формируются из поля zabbix_key в файле сценария. Примеры метрик:
- ses.scenario.{имя_сценария}.ok
- ses.scenario.{имя_сценария}.time
- ses.scenario.{имя_сценария}.error
Для каждого сценария вручную добавьте соответствующий item в этот шаблон.</description>
<groups>
<group>
<name>Templates</name>
</group>
</groups>
<!-- ============================================================ -->
<!-- Макросы (переопределяются на уровне хоста) -->
<!-- ============================================================ -->
<macros>
<macro>
<macro>{$SES_API_TIMEOUT_MS}</macro>
<value>5000</value>
<description>Порог медленного ответа API (миллисекунды)</description>
</macro>
<macro>
<macro>{$SES_UNKNOWN_THRESHOLD}</macro>
<value>10</value>
<description>Порог unknown-запросов за 5 минут</description>
</macro>
<macro>
<macro>{$SES_STEP_TIME_WARNING_MS}</macro>
<value>5000</value>
<description>Порог предупреждения: среднее время шага диалога (мс)</description>
</macro>
<macro>
<macro>{$SES_STEP_TIME_ERROR_MS}</macro>
<value>15000</value>
<description>Порог ошибки: среднее время шага диалога (мс)</description>
</macro>
</macros>
<items>
<!-- ======================================================== -->
<!-- Liveness-проверки -->
<!-- ======================================================== -->
<item>
<uuid>a1b2c3d4e5f6a7b8000000000000001</uuid>
<name>SES: API доступность</name>
<type>ZABBIX_TRAPPER</type>
<key>ses.api.liveness</key>
<delay>0</delay>
<history>7d</history>
<trends>0</trends>
<value_type>UINT64</value_type>
<description>0 — API недоступен, 1 — работает. Проверяется GET /ses/hostname.</description>
<triggers>
<trigger>
<uuid>tr00000000000000000000000000000001</uuid>
<expression>{last()}=0</expression>
<name>SES API недоступен на {HOST.NAME}</name>
<priority>HIGH</priority>
<manual_close>YES</manual_close>
</trigger>
</triggers>
</item>
<item>
<uuid>a1b2c3d4e5f6a7b8000000000000002</uuid>
<name>SES: время ответа API</name>
<type>ZABBIX_TRAPPER</type>
<key>ses.api.response_time</key>
<delay>0</delay>
<history>7d</history>
<trends>30d</trends>
<value_type>FLOAT</value_type>
<units>ms</units>
<description>Время ответа GET /ses/hostname в миллисекундах.</description>
<triggers>
<trigger>
<uuid>tr00000000000000000000000000000002</uuid>
<expression>{last()}&gt;{$SES_API_TIMEOUT_MS}</expression>
<name>SES: медленный ответ API (&gt;{$SES_API_TIMEOUT_MS} мс)</name>
<priority>WARNING</priority>
<manual_close>YES</manual_close>
</trigger>
</triggers>
</item>
<item>
<uuid>a1b2c3d4e5f6a7b8000000000000003</uuid>
<name>SES: статус лицензии</name>
<type>ZABBIX_TRAPPER</type>
<key>ses.license.ok</key>
<delay>0</delay>
<history>7d</history>
<trends>0</trends>
<value_type>UINT64</value_type>
<description>0 — проблема с лицензией, 1 — в порядке.</description>
<triggers>
<trigger>
<uuid>tr00000000000000000000000000000003</uuid>
<expression>{last()}=0</expression>
<name>SES: проблема с лицензией на {HOST.NAME}</name>
<priority>HIGH</priority>
<manual_close>YES</manual_close>
</trigger>
</triggers>
</item>
<item>
<uuid>a1b2c3d4e5f6a7b8000000000000004</uuid>
<name>SES: количество сценариев (роботов)</name>
<type>ZABBIX_TRAPPER</type>
<key>ses.robots.count</key>
<delay>0</delay>
<history>30d</history>
<trends>365d</trends>
<value_type>UINT64</value_type>
<description>Общее количество зарегистрированных сценариев (роботов).
Изменение значения может сигнализировать о проблемах конфигурации.</description>
</item>
<!-- ======================================================== -->
<!-- Сценарии (добавляйте items по мере создания YAML-файлов) -->
<!-- ======================================================== -->
<!--
Формат ключа: ses.scenario.{zabbix_key}.ok
Где {zabbix_key} — значение поля zabbix_key из YAML-файла сценария.
Пример для сценария с zabbix_key: "ses.scenario.my_bot":
<item>
<name>SES: сценарий my_bot</name>
<type>ZABBIX_TRAPPER</type>
<key>ses.scenario.my_bot.ok</key>
<delay>0</delay>
<history>7d</history>
<value_type>UINT64</value_type>
<triggers>
<trigger>
<expression>{last()}=0</expression>
<name>SES: сценарий my_bot провален</name>
<priority>AVERAGE</priority>
<manual_close>YES</manual_close>
</trigger>
</triggers>
</item>
<item>
<name>SES: сценарий my_bot — время</name>
<type>ZABBIX_TRAPPER</type>
<key>ses.scenario.my_bot.time</key>
<delay>0</delay>
<history>7d</history>
<trends>30d</trends>
<value_type>FLOAT</value_type>
<units>ms</units>
</item>
<item>
<name>SES: сценарий my_bot — ошибка</name>
<type>ZABBIX_TRAPPER</type>
<key>ses.scenario.my_bot.error</key>
<delay>0</delay>
<history>7d</history>
<value_type>TEXT</value_type>
</item>
-->
<!-- ======================================================== -->
<!-- Архив диалогов -->
<!-- ======================================================== -->
<item>
<uuid>a1b2c3d4e5f6a7b8000000000000030</uuid>
<name>SES: архив — всего диалогов (5 мин)</name>
<type>ZABBIX_TRAPPER</type>
<key>ses.archive.total_5m</key>
<delay>0</delay>
<history>7d</history>
<trends>30d</trends>
<value_type>UINT64</value_type>
<description>Количество диалогов за последние 5 минут. 0 может означать отсутствие трафика или проблемы с коннекторами.</description>
</item>
<item>
<uuid>a1b2c3d4e5f6a7b8000000000000031</uuid>
<name>SES: архив — unknown запросы (5 мин)</name>
<type>ZABBIX_TRAPPER</type>
<key>ses.archive.unknown_5m</key>
<delay>0</delay>
<history>7d</history>
<trends>30d</trends>
<value_type>UINT64</value_type>
<description>Количество нераспознанных (unknown) запросов. Рост может указывать на проблемы с моделями SEE/SMC.</description>
<triggers>
<trigger>
<uuid>tr0000000000000000000000000000031</uuid>
<expression>{last()}&gt;{$SES_UNKNOWN_THRESHOLD}</expression>
<name>SES: много unknown запросов (&gt;{$SES_UNKNOWN_THRESHOLD} за 5 мин)</name>
<priority>WARNING</priority>
<manual_close>YES</manual_close>
</trigger>
</triggers>
</item>
<item>
<uuid>a1b2c3d4e5f6a7b8000000000000032</uuid>
<name>SES: архив — not_found ошибки (5 мин)</name>
<type>ZABBIX_TRAPPER</type>
<key>ses.archive.not_found_5m</key>
<delay>0</delay>
<history>7d</history>
<trends>30d</trends>
<value_type>UINT64</value_type>
</item>
<!-- ======================================================== -->
<!-- Мониторинг внутренних моделей SES -->
<!-- ======================================================== -->
<!-- SEE (распознавание намерений/сущностей) -->
<item>
<uuid>a1b2c3d4e5f6a7b8000000000000040</uuid>
<name>SES: SEE — всего детекций (5 мин)</name>
<type>ZABBIX_TRAPPER</type>
<key>ses.models.see.total</key>
<delay>0</delay>
<history>7d</history>
<trends>30d</trends>
<value_type>UINT64</value_type>
<description>Общее количество SEE-детекций (распознавание намерений и сущностей) за 5 минут.</description>
</item>
<item>
<uuid>a1b2c3d4e5f6a7b8000000000000041</uuid>
<name>SES: SEE — низкая уверенность (5 мин)</name>
<type>ZABBIX_TRAPPER</type>
<key>ses.models.see.low_confidence</key>
<delay>0</delay>
<history>7d</history>
<trends>30d</trends>
<value_type>UINT64</value_type>
<description>Количество SEE-детекций с уверенностью ниже порога (по умолчанию 0.5). Рост означает проблемы с распознаванием.</description>
<triggers>
<trigger>
<uuid>tr0000000000000000000000000000041</uuid>
<expression>{last()}&gt;0</expression>
<name>SES: низкая уверенность SEE-моделей</name>
<priority>WARNING</priority>
<manual_close>YES</manual_close>
</trigger>
</triggers>
</item>
<item>
<uuid>a1b2c3d4e5f6a7b8000000000000042</uuid>
<name>SES: SEE — средняя уверенность (5 мин)</name>
<type>ZABBIX_TRAPPER</type>
<key>ses.models.see.avg_confidence</key>
<delay>0</delay>
<history>7d</history>
<trends>30d</trends>
<value_type>FLOAT</value_type>
<description>Средняя уверенность (confidence) всех SEE-детекций за 5 минут (0.0 — 1.0).</description>
</item>
<!-- SMC (классификация запросов) -->
<item>
<uuid>a1b2c3d4e5f6a7b8000000000000050</uuid>
<name>SES: SMC — всего классификаций (5 мин)</name>
<type>ZABBIX_TRAPPER</type>
<key>ses.models.smc.total</key>
<delay>0</delay>
<history>7d</history>
<trends>30d</trends>
<value_type>UINT64</value_type>
<description>Общее количество SMC-классификаций за 5 минут.</description>
</item>
<item>
<uuid>a1b2c3d4e5f6a7b8000000000000051</uuid>
<name>SES: SMC — низкая уверенность (5 мин)</name>
<type>ZABBIX_TRAPPER</type>
<key>ses.models.smc.low_confidence</key>
<delay>0</delay>
<history>7d</history>
<trends>30d</trends>
<value_type>UINT64</value_type>
<description>Количество SMC-классификаций с уверенностью ниже порога. Рост означает дрифт классификации.</description>
<triggers>
<trigger>
<uuid>tr0000000000000000000000000000051</uuid>
<expression>{last()}&gt;0</expression>
<name>SES: низкая уверенность SMC-классификации</name>
<priority>WARNING</priority>
<manual_close>YES</manual_close>
</trigger>
</triggers>
</item>
<item>
<uuid>a1b2c3d4e5f6a7b8000000000000052</uuid>
<name>SES: SMC — средняя уверенность (5 мин)</name>
<type>ZABBIX_TRAPPER</type>
<key>ses.models.smc.avg_confidence</key>
<delay>0</delay>
<history>7d</history>
<trends>30d</trends>
<value_type>FLOAT</value_type>
<description>Средняя уверенность всех SMC-классификаций за 5 минут (0.0 — 1.0).</description>
</item>
<!-- TTS (синтез речи) -->
<item>
<uuid>a1b2c3d4e5f6a7b8000000000000060</uuid>
<name>SES: TTS — голосовых ответов (5 мин)</name>
<type>ZABBIX_TRAPPER</type>
<key>ses.models.tts.voice_present</key>
<delay>0</delay>
<history>7d</history>
<trends>30d</trends>
<value_type>UINT64</value_type>
<description>Количество ответов с синтезированным голосом за 5 минут.</description>
</item>
<item>
<uuid>a1b2c3d4e5f6a7b8000000000000061</uuid>
<name>SES: TTS — ответов без голоса (5 мин)</name>
<type>ZABBIX_TRAPPER</type>
<key>ses.models.tts.voice_missing</key>
<delay>0</delay>
<history>7d</history>
<trends>30d</trends>
<value_type>UINT64</value_type>
<description>Количество ответов без голоса за 5 минут. Рост при наличии трафика — проблема TTS.</description>
</item>
<!-- QAS (вопросно-ответная система) -->
<item>
<uuid>a1b2c3d4e5f6a7b8000000000000070</uuid>
<name>SES: QAS — всего диалогов с QAS (5 мин)</name>
<type>ZABBIX_TRAPPER</type>
<key>ses.models.qas.total</key>
<delay>0</delay>
<history>7d</history>
<trends>30d</trends>
<value_type>UINT64</value_type>
</item>
<item>
<uuid>a1b2c3d4e5f6a7b8000000000000071</uuid>
<name>SES: QAS — пустых ответов (5 мин)</name>
<type>ZABBIX_TRAPPER</type>
<key>ses.models.qas.empty</key>
<delay>0</delay>
<history>7d</history>
<trends>30d</trends>
<value_type>UINT64</value_type>
<description>Количество диалогов с пустым QAS за 5 минут. Высокое значение — QAS не отвечает.</description>
<triggers>
<trigger>
<uuid>tr0000000000000000000000000000071</uuid>
<expression>{last()}&gt;0 and {ses.models.qas.total.last()}&gt;0</expression>
<name>SES: QAS возвращает пустые ответы</name>
<priority>WARNING</priority>
<manual_close>YES</manual_close>
</trigger>
</triggers>
</item>
<!-- SPR (распознавание речи: аудио→текст) -->
<item>
<uuid>a1b2c3d4e5f6a7b8000000000000080</uuid>
<name>SES: SPR — всего диалогов с reports (5 мин)</name>
<type>ZABBIX_TRAPPER</type>
<key>ses.models.spr.total</key>
<delay>0</delay>
<history>7d</history>
<trends>30d</trends>
<value_type>UINT64</value_type>
</item>
<item>
<uuid>a1b2c3d4e5f6a7b8000000000000081</uuid>
<name>SES: SPR — успешных расшифровок (5 мин)</name>
<type>ZABBIX_TRAPPER</type>
<key>ses.models.spr.filled</key>
<delay>0</delay>
<history>7d</history>
<trends>30d</trends>
<value_type>UINT64</value_type>
<description>Количество диалогов с успешной расшифровкой речи (непустые reports) за 5 минут.</description>
</item>
<!-- ======================================================== -->
<!-- Время шага диалога (из request.datetime / reply.datetime) -->
<!-- ======================================================== -->
<item>
<uuid>a1b2c3d4e5f6a7b8000000000000090</uuid>
<name>SES: среднее время шага диалога (5 мин)</name>
<type>ZABBIX_TRAPPER</type>
<key>ses.archive.avg_step_time_5m</key>
<delay>0</delay>
<history>7d</history>
<trends>30d</trends>
<value_type>FLOAT</value_type>
<units>ms</units>
<description>Среднее время обработки шага диалога (request.datetime -> reply.datetime) за 5 минут. Рост указывает на тормоза в пайплайне (SEE/SMC/TTS/QAS или внешние API).</description>
<triggers>
<trigger>
<uuid>tr0000000000000000000000000000090</uuid>
<expression>{last()}&gt;{$SES_STEP_TIME_WARNING_MS}</expression>
<name>SES: медленная обработка шага диалога (&gt;{$SES_STEP_TIME_WARNING_MS} мс) на {HOST.NAME}</name>
<priority>WARNING</priority>
<manual_close>YES</manual_close>
</trigger>
<trigger>
<uuid>tr0000000000000000000000000000091</uuid>
<expression>{last()}&gt;{$SES_STEP_TIME_ERROR_MS}</expression>
<name>SES: критическая задержка обработки шага (&gt;{$SES_STEP_TIME_ERROR_MS} мс) на {HOST.NAME}</name>
<priority>AVERAGE</priority>
<manual_close>YES</manual_close>
</trigger>
</triggers>
</item>
<item>
<uuid>a1b2c3d4e5f6a7b8000000000000092</uuid>
<name>SES: макс. время шага диалога (5 мин)</name>
<type>ZABBIX_TRAPPER</type>
<key>ses.archive.max_step_time_5m</key>
<delay>0</delay>
<history>7d</history>
<trends>30d</trends>
<value_type>FLOAT</value_type>
<units>ms</units>
<description>Максимальное время обработки шага диалога за 5 минут. Показывает пиковые задержки.</description>
</item>
</items>
</template>
</templates>
</zabbix_export>
+212
View File
@@ -0,0 +1,212 @@
<?xml version='1.0' encoding='utf-8'?>
<zabbix_export>
<version>5.0</version>
<date>2026-06-19T12:00:00Z</date>
<groups>
<group>
<name>Templates</name>
</group>
</groups>
<templates>
<template>
<template>SES Monitor</template>
<name>SES Monitor — Service Engine Server</name>
<description>Шаблон для мониторинга диалоговой сценарной машины SES.
Метрики отправляются watchdog-демоном ses-monitor через zabbix_sender (trapper).
Проверяет: доступность API, лицензию, выполнение сценариев.
Сценарии задаются в YAML-файлах (config/scenarios/). Все сценарии
агрегируются в фиксированные метрики — шаблон универсален и не зависит
от количества или состава сценариев.</description>
<groups>
<group>
<name>Templates</name>
</group>
</groups>
<macros>
<macro>
<macro>{$SES_API_TIMEOUT_MS}</macro>
<value>5000</value>
<description>Порог медленного ответа API (миллисекунды)</description>
</macro>
</macros>
<items>
<!-- Liveness -->
<item>
<name>SES: API доступность</name>
<type>TRAP</type>
<key>ses.api.liveness</key>
<delay>0</delay>
<history>7d</history>
<trends>31536000</trends>
<value_type>UNSIGNED</value_type>
<description>0 — API недоступен, 1 — работает. Проверяется GET /ses/hostname.</description>
<triggers>
<trigger>
<expression>{SES Monitor:ses.api.liveness.last()}=0</expression>
<name>SES API недоступен на {HOST.NAME}</name>
<priority>HIGH</priority>
<manual_close>YES</manual_close>
</trigger>
</triggers>
</item>
<item>
<name>SES: время ответа API</name>
<type>TRAP</type>
<key>ses.api.response_time</key>
<delay>0</delay>
<history>7d</history>
<trends>31536000</trends>
<value_type>FLOAT</value_type>
<units>ms</units>
<description>Время ответа GET /ses/hostname в миллисекундах.</description>
<triggers>
<trigger>
<expression>{SES Monitor:ses.api.response_time.last()}&gt;{$SES_API_TIMEOUT_MS}</expression>
<name>SES: медленный ответ API (&gt;{$SES_API_TIMEOUT_MS} мс)</name>
<priority>WARNING</priority>
<manual_close>YES</manual_close>
</trigger>
</triggers>
</item>
<item>
<name>SES: дней до окончания лицензии</name>
<type>TRAP</type>
<key>ses.license.days_remaining</key>
<delay>0</delay>
<history>7d</history>
<trends>31536000</trends>
<value_type>FLOAT</value_type>
<units>d</units>
<description>Количество дней до окончания лицензии SES. -1 = бессрочная.</description>
</item>
<item>
<name>SES: статус лицензии</name>
<type>TRAP</type>
<key>ses.license.ok</key>
<delay>0</delay>
<history>7d</history>
<trends>31536000</trends>
<value_type>UNSIGNED</value_type>
<description>0 — проблема с лицензией, 1 — в порядке.</description>
<triggers>
<trigger>
<expression>{SES Monitor:ses.license.ok.last()}=0</expression>
<name>SES: проблема с лицензией на {HOST.NAME}</name>
<priority>HIGH</priority>
<manual_close>YES</manual_close>
</trigger>
</triggers>
</item>
<item>
<name>SES: количество сценариев (роботов)</name>
<type>TRAP</type>
<key>ses.robots.count</key>
<delay>0</delay>
<history>7d</history>
<trends>31536000</trends>
<value_type>UNSIGNED</value_type>
<description>Общее количество зарегистрированных сценариев (роботов).
Изменение значения может сигнализировать о проблемах конфигурации.</description>
</item>
<!-- Сценарии -->
<item>
<name>SES: сценарии — все успешны</name>
<type>TRAP</type>
<key>ses.scenario.ok</key>
<delay>0</delay>
<history>7d</history>
<trends>31536000</trends>
<value_type>UNSIGNED</value_type>
<description>1 — все сценарии прошли, 0 — есть упавшие.</description>
<triggers>
<trigger>
<expression>{SES Monitor:ses.scenario.ok.last()}=0</expression>
<name>SES: сценарии мониторинга падают на {HOST.NAME}</name>
<priority>AVERAGE</priority>
<manual_close>YES</manual_close>
</trigger>
</triggers>
</item>
<item>
<name>SES: сценарии — всего</name>
<type>TRAP</type>
<key>ses.scenario.total</key>
<delay>0</delay>
<history>7d</history>
<trends>31536000</trends>
<value_type>UNSIGNED</value_type>
<description>Количество активных сценариев мониторинга.</description>
</item>
<item>
<name>SES: сценарии — упало</name>
<type>TRAP</type>
<key>ses.scenario.failed</key>
<delay>0</delay>
<history>7d</history>
<trends>31536000</trends>
<value_type>UNSIGNED</value_type>
<description>Количество упавших сценариев за последний цикл.</description>
<triggers>
<trigger>
<expression>{SES Monitor:ses.scenario.failed.last()}&gt;0</expression>
<name>SES: сценарии мониторинга падают на {HOST.NAME}</name>
<priority>WARNING</priority>
<manual_close>YES</manual_close>
</trigger>
</triggers>
</item>
<item>
<name>SES: сценарии — среднее время</name>
<type>TRAP</type>
<key>ses.scenario.avg_time</key>
<delay>0</delay>
<history>7d</history>
<trends>31536000</trends>
<value_type>FLOAT</value_type>
<units>ms</units>
<description>Среднее время выполнения сценария (миллисекунды).</description>
</item>
<item>
<name>SES: сценарии — макс. время</name>
<type>TRAP</type>
<key>ses.scenario.max_time</key>
<delay>0</delay>
<history>7d</history>
<trends>31536000</trends>
<value_type>FLOAT</value_type>
<units>ms</units>
<description>Максимальное время выполнения сценария (миллисекунды).</description>
</item>
<item>
<name>SES: сценарии — ошибка</name>
<type>TRAP</type>
<key>ses.scenario.error</key>
<delay>0</delay>
<history>7d</history>
<trends>31536000</trends>
<value_type>TEXT</value_type>
<description>Текст ошибки: "N сценариев упали". Пустая строка если всё хорошо.</description>
</item>
</items>
</template>
</templates>
</zabbix_export>
+261
View File
@@ -0,0 +1,261 @@
<?xml version="1.0" encoding="UTF-8"?>
<zabbix_export>
<version>5.0</version>
<date>2026-06-19T12:00:00Z</date>
<groups>
<group>
<name>Templates</name>
</group>
</groups>
<templates>
<template>
<template>SES Monitor</template>
<name>SES Monitor — Service Engine Server</name>
<description>Шаблон для мониторинга диалоговой сценарной машины SES.
Метрики передаются watchdog-демоном ses-monitor через UserParameter (Zabbix агент).
JSON с метриками пишется в /var/tmp/ses_monitor/metrics.json и читается
скриптом scripts/zbx_get.py. Master-элемент: ses.metrics.
Проверяет: доступность API, лицензию, выполнение сценариев.
Сценарии задаются в YAML-файлах (config/scenarios/). Все сценарии
агрегируются в фиксированные метрики — шаблон универсален и не зависит
от количества или состава сценариев.</description>
<groups>
<group>
<name>Templates</name>
</group>
</groups>
<macros>
<macro>
<macro>{$SES_API_TIMEOUT_MS}</macro>
<value>5000</value>
<description>Порог медленного ответа API (миллисекунды)</description>
</macro>
</macros>
<items>
<item>
<name>SES: все метрики (JSON)</name>
<type>ZABBIX_PASSIVE</type>
<key>ses.metrics</key>
<delay>30s</delay>
<history>7d</history>
<trends>31536000</trends>
<value_type>TEXT</value_type>
<description>Полный JSON со всеми метриками ses-monitor. Используется как master item для dependent items с JSONPath.</description>
</item>
<!-- Liveness -->
<item>
<name>SES: API доступность</name>
<type>DEPENDENT</type>
<master_item>
<key>ses.metrics</key>
</master_item>
<preprocessing>
<step>
<type>JSONPATH</type>
<params>$["ses.api.liveness"]</params>
</step>
</preprocessing>
<history>7d</history>
<trends>31536000</trends>
<value_type>UNSIGNED</value_type>
<key>ses.api.liveness</key>
</item>
<item>
<name>SES: время ответа API</name>
<type>DEPENDENT</type>
<master_item>
<key>ses.metrics</key>
</master_item>
<preprocessing>
<step>
<type>JSONPATH</type>
<params>$["ses.api.response_time"]</params>
</step>
</preprocessing>
<history>7d</history>
<trends>31536000</trends>
<value_type>FLOAT</value_type>
<units>ms</units>
<key>ses.api.response_time</key>
</item>
<item>
<name>SES: статус лицензии</name>
<type>DEPENDENT</type>
<master_item>
<key>ses.metrics</key>
</master_item>
<preprocessing>
<step>
<type>JSONPATH</type>
<params>$["ses.license.ok"]</params>
</step>
</preprocessing>
<history>7d</history>
<trends>31536000</trends>
<value_type>UNSIGNED</value_type>
<key>ses.license.ok</key>
</item>
<item>
<name>SES: дней до окончания лицензии</name>
<type>DEPENDENT</type>
<master_item>
<key>ses.metrics</key>
</master_item>
<preprocessing>
<step>
<type>JSONPATH</type>
<params>$["ses.license.days_remaining"]</params>
</step>
</preprocessing>
<history>7d</history>
<trends>31536000</trends>
<value_type>FLOAT</value_type>
<units>d</units>
<key>ses.license.days_remaining</key>
</item>
<item>
<name>SES: количество сценариев (роботов)</name>
<type>DEPENDENT</type>
<master_item>
<key>ses.metrics</key>
</master_item>
<preprocessing>
<step>
<type>JSONPATH</type>
<params>$["ses.robots.count"]</params>
</step>
</preprocessing>
<history>7d</history>
<trends>31536000</trends>
<value_type>UNSIGNED</value_type>
<key>ses.robots.count</key>
</item>
<!-- Сценарии -->
<item>
<name>SES: сценарии — все успешны</name>
<type>DEPENDENT</type>
<master_item>
<key>ses.metrics</key>
</master_item>
<preprocessing>
<step>
<type>JSONPATH</type>
<params>$["ses.scenario.ok"]</params>
</step>
</preprocessing>
<history>7d</history>
<trends>31536000</trends>
<value_type>UNSIGNED</value_type>
<key>ses.scenario.ok</key>
</item>
<item>
<name>SES: сценарии — всего</name>
<type>DEPENDENT</type>
<master_item>
<key>ses.metrics</key>
</master_item>
<preprocessing>
<step>
<type>JSONPATH</type>
<params>$["ses.scenario.total"]</params>
</step>
</preprocessing>
<history>7d</history>
<trends>31536000</trends>
<value_type>UNSIGNED</value_type>
<key>ses.scenario.total</key>
</item>
<item>
<name>SES: сценарии — упало</name>
<type>DEPENDENT</type>
<master_item>
<key>ses.metrics</key>
</master_item>
<preprocessing>
<step>
<type>JSONPATH</type>
<params>$["ses.scenario.failed"]</params>
</step>
</preprocessing>
<history>7d</history>
<trends>31536000</trends>
<value_type>UNSIGNED</value_type>
<key>ses.scenario.failed</key>
</item>
<item>
<name>SES: сценарии — среднее время</name>
<type>DEPENDENT</type>
<master_item>
<key>ses.metrics</key>
</master_item>
<preprocessing>
<step>
<type>JSONPATH</type>
<params>$["ses.scenario.avg_time"]</params>
</step>
</preprocessing>
<history>7d</history>
<trends>31536000</trends>
<value_type>FLOAT</value_type>
<units>ms</units>
<key>ses.scenario.avg_time</key>
</item>
<item>
<name>SES: сценарии — макс. время</name>
<type>DEPENDENT</type>
<master_item>
<key>ses.metrics</key>
</master_item>
<preprocessing>
<step>
<type>JSONPATH</type>
<params>$["ses.scenario.max_time"]</params>
</step>
</preprocessing>
<history>7d</history>
<trends>31536000</trends>
<value_type>FLOAT</value_type>
<units>ms</units>
<key>ses.scenario.max_time</key>
</item>
<item>
<name>SES: сценарии — ошибка</name>
<type>DEPENDENT</type>
<master_item>
<key>ses.metrics</key>
</master_item>
<preprocessing>
<step>
<type>JSONPATH</type>
<params>$["ses.scenario.error"]</params>
</step>
</preprocessing>
<history>7d</history>
<trends>31536000</trends>
<value_type>TEXT</value_type>
<key>ses.scenario.error</key>
</item>
</items>
</template>
</templates>
</zabbix_export>