Динамические шаблоны инцидентов и алертов
Тот же синтаксис плейсхолдеров {{variable}}, что и в JavaScript Expressions для критериев мониторинга, можно использовать для автоматического заполнения Title, Description и Remediation Notes инцидентов и алертов при срабатывании критериев монитора.
Поддерживаемые типы мониторов и переменные
Динамические шаблоны поддерживаются для перечисленных ниже типов с соответствующими переменными:
- Website и API: ответ, заголовки, коды, время
- Incoming Request: тело и заголовки запроса, метод, время
- Ping: доступность, время отклика, причины сбоя
- Port: доступность порта, время, таймаут
- IP: доступность IP, ping, ошибки
- SSL Certificate: данные сертификата, валидация, срок действия
- Server/VM: метрики (CPU, память, диск), процессы, hostname
- Synthetic: результат скрипта, скриншоты, браузер
- Custom JavaScript Code: результат, время, ошибки
- SNMP: устройство, время ответа, значения OID
Примечание: мониторы Logs, Traces и Metrics пока не поддерживают такие шаблоны — у них другой механизм триггеров.
Website и API monitors
| Переменная | Описание | Тип |
|---|---|---|
responseBody | Тело ответа. HTML/XML — строка; JSON — объект | string или JSON |
responseHeaders | Заголовки (ключи в нижнем регистре) | Dictionary<string> |
responseStatusCode | HTTP status code | number |
responseTimeInMs | Время отклика, мс | number |
isOnline | Монитор считается online | boolean |
Incoming Request monitors
| Переменная | Описание | Тип |
|---|---|---|
requestBody | Тело запроса | string или JSON |
requestHeaders | Заголовки (ключи в нижнем регистре) | Dictionary<string> |
requestMethod | HTTP-метод (GET, POST и т.д.) | string |
incomingRequestReceivedAt | Время получения запроса | Date |
Ping monitors
| Переменная | Описание | Тип |
|---|---|---|
isOnline | Цель ping online | boolean |
responseTimeInMs | Время ping, мс | number |
failureCause | Причина сбоя | string |
isTimeout | Таймаут ping | boolean |
Port monitors
| Переменная | Описание | Тип |
|---|---|---|
isOnline | Порт доступен | boolean |
responseTimeInMs | Время установки соединения, мс | number |
failureCause | Причина сбоя | string |
isTimeout | Таймаут | boolean |
IP monitors
| Переменная | Описание | Тип |
|---|---|---|
isOnline | IP доступен | boolean |
responseTimeInMs | Время ping, мс | number |
failureCause | Причина сбоя | string |
isTimeout | Таймаут | boolean |
SSL Certificate monitors
| Переменная | Описание | Тип |
|---|---|---|
isOnline | Проверка сертификата успешна | boolean |
isSelfSigned | Self-signed | boolean |
createdAt | Дата выдачи | Date |
expiresAt | Дата окончания | Date |
commonName | CN | string |
organizationalUnit | OU | string |
organization | O | string |
locality | L | string |
state | ST | string |
country | C | string |
serialNumber | Серийный номер | string |
fingerprint | SHA-1 fingerprint | string |
fingerprint256 | SHA-256 fingerprint | string |
failureCause | Причина сбоя проверки | string |
Server/VM monitors
| Переменная | Описание | Тип |
|---|---|---|
hostname | Hostname сервера | string |
requestReceivedAt | Время запроса монитора | Date |
cpuUsagePercent | Загрузка CPU, % | number |
cpuCores | Число ядер | number |
memoryUsagePercent | Использование памяти, % | number |
memoryFreePercent | Свободная память, % | number |
memoryTotalBytes | Объём памяти, байт | number |
diskMetrics | Метрики по дискам | Array<Object> |
diskMetrics[].diskPath | Точка монтирования | string |
diskMetrics[].usagePercent | Заполнение диска, % | number |
diskMetrics[].freePercent | Свободно, % | number |
diskMetrics[].totalBytes | Размер, байт | number |
processes | Список процессов | Array<Object> |
processes[].pid | PID | number |
processes[].name | Имя процесса | string |
processes[].command | Команда запуска | string |
failureCause | Причина сбоя | string |
Synthetic monitors
| Переменная | Описание | Тип |
|---|---|---|
executionTimeInMs | Время выполнения скрипта, мс | number |
result | Возвращённое значение | string, number, boolean или JSON |
scriptError | Ошибка выполнения | string |
logMessages | Сообщения из console.log | Array<string> |
screenshots | Скриншоты в Base64 | Object |
browserType | Тип браузера | string |
screenSizeType | Размер экрана | string |
Custom JavaScript Code monitors
| Переменная | Описание | Тип |
|---|---|---|
executionTimeInMs | Время выполнения, мс | number |
result | Результат return | string, number, boolean или JSON |
scriptError | Ошибка | string |
logMessages | Логи | Array<string> |
SNMP monitors
| Переменная | Описание | Тип |
|---|---|---|
isOnline | Устройство отвечает | boolean |
responseTimeInMs | Время SNMP-запроса, мс | number |
failureCause | Причина сбоя | string |
isTimeout | Таймаут | boolean |
oidResponses | Массив ответов: oid, name, value, type | Array<Object> |
oidResponses[].oid | OID | string |
oidResponses[].name | Имя OID | string |
oidResponses[].value | Значение | string или number |
oidResponses[].type | SNMP-тип значения | string |
{{OID_NAME}} | Значение по имени OID (например, {{sysUpTime}}) | string или number |
Базовое использование
В форме Incident / Alert внутри экземпляра критерия монитора:
API вернул {{responseStatusCode}} за {{responseTimeInMs}} мсПри коде 502 и времени 842 заголовок сохранится как:
API вернул 502 за 842 мсВложенный JSON — как в JavaScript Expressions:
ID проблемы: {{responseBody.error.id}}
Сообщение: {{responseBody.error.message}}Индексация массивов:
Первый пользователь: {{responseBody.users[0].name}}Несуществующий путь по умолчанию даёт пустую строку.
Продвинутое использование
Элементы массива
Загрузка первого диска: {{diskMetrics[0].usagePercent}}%
Последний процесс: {{processes[-1].name}}Вложенные объекты
Текст ошибки: {{responseBody.error.details.message}}
Локация: {{sslCertificate.locality}} {{sslCertificate.country}}Циклы {{#each}}
Итерация по массиву: {{#each path}}...{{/each}} — удобно для списков в описании инцидента или алерта.
Синтаксис:
{{#each arrayPath}}
...тело с {{property}} из элемента...
{{/each}}Внутри цикла:
{{propertyName}}— относительно текущего элемента{{nested.property}}— dot notation для элемента{{@index}}— индекс с 0{{this}}— значение элемента (для массивов примитивов)- отсутствующие поля элемента — fallback к родительской карте
Пример — Incoming Request с массивом алертов (webhook Grafana):
Тело запроса:
{
"status": "firing",
"alerts": [
{ "status": "firing", "labels": { "label": "Coralpay" } },
{ "status": "firing", "labels": { "label": "capitecpay" } },
{ "status": "resolved", "labels": { "label": "capricorn" } }
]
}Шаблон:
Метки алертов:
{{#each requestBody.alerts}}
- {{labels.label}} ({{status}})
{{/each}}Результат:
Метки алертов:
- Coralpay (firing)
- capitecpay (firing)
- capricorn (resolved)Диски сервера:
Диски:
{{#each diskMetrics}}
- {{diskPath}}: занято {{usagePercent}}%
{{/each}}С {{@index}}:
Процессы:
{{#each processes}}
{{@index}}. {{name}} (PID: {{pid}})
{{/each}}Массив примитивов и {{this}}:
Логи:
{{#each logMessages}}
- {{this}}
{{/each}}Вложенные циклы:
{{#each requestBody.groups}}
Группа: {{name}}
{{#each members}}
- {{id}}: {{role}}
{{/each}}
{{/each}}Примечание: если путь не массив — блок
{{#each}}...{{/each}}удаляется из вывода. Пустой массив не даёт содержимого блока.
Примеры
Заголовок инцидента (Website/API)
Высокая задержка: {{responseTimeInMs}} мс (выше порога)Описание инцидента (Website/API)
### Ошибка API
Статус: **{{responseStatusCode}}**
Задержка: **{{responseTimeInMs}} мс**
Фрагмент тела: `{{responseBody.error.message}}`Заголовок алерта (Incoming Request)
Проблемный входящий запрос: method={{requestMethod}} auth={{requestHeaders.authorization}}Заголовок алерта (SSL)
Истекает SSL: {{commonName}}, до {{expiresAt}}Описание алерта (Server)
### Сервер: {{hostname}}
CPU: **{{cpuUsagePercent}}%**
Память: **{{memoryUsagePercent}}%**
Первый диск: **{{diskMetrics[0].usagePercent}}%**
Последняя проверка: {{requestReceivedAt}}Заголовок алерта (Ping)
Ping не прошёл: {{failureCause}} ({{responseTimeInMs}} мс)Описание алерта (Port)
Проблема с портом
Доступность: {{isOnline}}
Время отклика: {{responseTimeInMs}} мс
Причина: {{failureCause}}Алерт (Synthetic)
Скрипт завершён за {{executionTimeInMs}} мс
Результат: {{result}}
Браузер: {{browserType}} ({{screenSizeType}})Алерт (Custom Code)
Выполнение кода: {{executionTimeInMs}} мс
Первая строка лога: {{logMessages[0]}}Заголовок алерта (SNMP)
SNMP offline: {{failureCause}} ({{responseTimeInMs}} мс)Описание алерта (SNMP)
### SNMP
Онлайн: **{{isOnline}}**
Время ответа: **{{responseTimeInMs}} мс**
Uptime: {{sysUpTime}}
Имя: {{sysName}}
Первое значение OID: {{oidResponses[0].value}}Incoming Request + цикл (Grafana)
Заголовок:
[{{requestBody.status}}] {{requestBody.receiver}}Описание:
### Алерты от {{requestBody.receiver}}
{{#each requestBody.alerts}}
**Алерт {{@index}}**: {{labels.alertname}}
- Метка: {{labels.label}}
- Статус: {{status}}
- Значения: {{valueString}}
- Источник: {{generatorURL}}
{{/each}}Сервер + диски и процессы
### Сервер: {{hostname}}
CPU: **{{cpuUsagePercent}}%**
Память: **{{memoryUsagePercent}}%**
**Диски:**
{{#each diskMetrics}}
- {{diskPath}}: занято {{usagePercent}}% (свободно {{freePercent}}%)
{{/each}}
**Процессы:**
{{#each processes}}
- [{{pid}}] {{name}}: {{command}}
{{/each}}SNMP + цикл по OID
### SNMP
Онлайн: {{isOnline}}
Ответ: {{responseTimeInMs}} мс
**Значения OID:**
{{#each oidResponses}}
- {{name}} ({{oid}}): {{value}}
{{/each}}