Обзор триггерных выражений
В триггерах можно использовать разнообразные конструкции, которые позволяют создавать сложные логические условия для отслеживания статистики.
В базовом выражении применяется функция, которая обрабатывает элемент данных с определёнными параметрами. Функция возвращает результат, который затем сравнивается с пороговым значением с помощью оператора и константы.
Хотя синтаксис выражений идентичен, с точки зрения функциональности можно выделить два типа триггерных выражений:
- проблемное выражение — определяет условия задачи;
- выражение восстановления (необязательное) — определяет дополнительные условия решения проблемы.
Если мы рассматриваем проблему в контексте одного выражения, то оно будет выступать в роли как индикатора проблемы, так и индикатора её решения.
Как только значение выражения становится истинным, проблема возникает. Как только значение выражения становится ложным, проблема решена.
В процессе определения как постановки задачи, так и дополнительного условия для её решения, задача усложняется: необходимо не только определить ложное условие задачи, но и найти истинное условие для её решения. Это помогает создать гистерезис и предотвратить срабатывание триггеров.
Функции
Функции позволяют вычислять собранные значения (среднее, минимальное, максимальное, сумму), находить строки, ссылаться на текущее время и другие факторы.
В большинстве случаев функции возвращают числовые данные для сопоставления. Если же функция возвращает строки, то их можно сравнить, используя операторы «=» и «<>».
Полный список поддерживаемых функций доступен здесь.
Параметры функции
В функции можно задать следующие параметры:
- ключ узла сети и элемента данных (функции, которые работают только с историей элементов данных узла сети);
- параметры, которые зависят от конкретной функции;
- другие выражения (недоступны для функций, которые работают с историей элемента данных узла сети).
В качестве ключа узла сети и элемента данных можно использовать /host/key. Элемент данных, на который делается ссылка, должен быть в поддерживаемом состоянии (за исключением функции nodata(), которая также вычисляется для неподдерживаемых элементов данных).
В то время как другие выражения триггеров в качестве параметров функций ограничены функциями без истории в триггерах, это ограничение не применяется к вычисляемым элементам данных.
Параметры, зависящие от конкретной функции
Параметры, которые связаны с определённой функцией, располагаются после идентификатора элемента данных и отделяются от него запятой. Полный перечень этих характеристик можно найти в разделе, посвящённом поддерживаемым функциям.
В большинстве случаев числовые функции используют время в качестве аргумента. Для указания времени можно использовать секунды или временные суффиксы. Если перед аргументом стоит символ #, то он имеет другое значение:
Выражение | Описание |
---|---|
sum(/host/key,10m) | Сумма значений за последние 10 минут. |
sum(/host/key,#10) | Сумма последних десяти значений. |
В функции last параметры с хэш-тегом имеют другое значение. Они обозначают N-е предыдущее значение. Если у нас есть значения 3, 7, 2, 6, 5 (от последнего к более раннему), то:
- last(/host/key,#2) вернёт значение 7;
- last(/host/key,#5) вернёт значение 5.
Временной сдвиг
В функции предусмотрен дополнительный параметр, который позволяет задать смещение по времени или количеству значений. Это позволяет обращаться к данным, относящимся к определённому периоду времени в прошлом.
Отсчёт времени начинается с текущего момента, обозначенного как «now». Затем следует добавить или вычесть N единиц времени, используя символы «+» или «-».
Например:
**avg(/host/key,1h:now-1d)** — будет возвращено среднее значение за час, прошедший один день назад.
Временной сдвиг с абсолютными периодами времени
В опции сдвига времени можно использовать абсолютные временные интервалы, такие как:
- с 00:00 до 00:00 в течение суток;
- с понедельника по воскресенье в течение недели; - с 1-го по последний день месяца в течение месяца.
Временной сдвиг для абсолютных временных интервалов начинается с указания текущего момента времени, за которым следует любое количество операций с временем.
Для определения начала и конца временного интервала используется единица времени, например, с полуночи до полуночи в течение дня.
Для добавления или вычитания N единиц времени используются операторы «+N» или «-N».
Важно отметить, что временной сдвиг может быть как положительным, так и нулевым, а минимальный временной интервал составляет одну единицу.
Параметр | Описание |
---|---|
1d: now/d | Вчера |
1d: now/d+1d | Сегодня |
2d: now/d+1d | Последние 2 дня |
1w: now/w | На прошлой неделе |
1w: now/w+1w | На этой неделе |
Операторы
Для триггеров доступны следующие операторы, которые выполняются в порядке убывания приоритета:
Приоритет | Оператор | Определение | Примечания к неизвестным значениям | Принудительно переводит операнд приведения в исходное состояние*1 |
---|---|---|---|---|
1 | - | Унарный минус | -Неизвестно → Неизвестно | ДА |
2 | not | Логическое НЕТ | нет Неизвестно → Неизвестно | ДА |
3 | * | Умножение | 0 * Неизвестный → Неизвестный (да, Неизвестный, а не 0 — чтобы не потерять Неизвестный в арифметических операциях) 1.2 * Неизвестный → Неизвестный | ДА |
3 | / | Деление | Неизвестно / 0 → ошибка Неизвестно / 1.2 → Неизвестно 0.0 / Неизвестно → Неизвестно | ДА |
4 | + | Арифметический плюс | 1.2 + Неизвестно → Неизвестно | ДА |
4 | - | Арифметический минус | 1.2 - Неизвестно → Неизвестно | ДА |
5 | < | Меньше. Оператор определяется как: A<B ⇔ (A<B-0,000001) | 1.2 < Неизвестно → Неизвестно | ДА |
5 | <= | Меньше или равно. Оператор определяется как: A<=B ⇔ (A≤B+0,000001) | Неизвестно <= Неизвестно → Неизвестно | ДА |
5 | > | Больше, чем. Оператор определяется как: A>B ⇔ (A>B+0,000001) | ДА | |
5 | >= | Больше или равно. Оператор определяется как: A>=B ⇔ (A≥B-0,000001) | ДА | |
6 | = | Равно. Оператор определяется как: A=B ⇔ (A≥B-0,000001) и (A≤B+0,000001) | НЕТ 1 | |
6 | <> | Не равно. Оператор определяется как: A<>B ⇔ (A |
НЕТ 1 | |
7 | and | Логическое И | 0 и Неизвестный → 0 1 и Неизвестный → Неизвестный Неизвестный и Неизвестный → Неизвестный | ДА |
8 | or | Логическое ИЛИ | 1 или Неизвестный → 1 0 или Неизвестный → Неизвестный Неизвестный или Неизвестный → Неизвестный | ДА |
*1 — в случае, когда один из операндов является строкой, а другой — числом, происходит преобразование строки в число. Это происходит, если:
- другой операнд представляет собой число;
- для операнда используется оператор, отличный от = или <>.
Операторы «не», «и» и «или» чувствительны к регистру и должны быть записаны строчными буквами. Также их следует заключить в пробелы или скобки.
Все операторы, кроме операторов унарного отрицания и логического отрицания, обладают свойством ассоциативности слева направо. Операторы унарного отрицания и логического отрицания не являются ассоциативными. Вместо выражений -(-1) и not (not 1) следует использовать выражения --1 и not not 1 соответственно.
Кэширование значений
Для оценки триггеров на сервере Glaber создаются временные хранилища данных. Это может привести к увеличению нагрузки на базу данных после перезапуска сервера.
Кэшированные данные не удаляются при очистке истории элементов данных, поэтому сервер будет использовать их до тех пор, пока они не станут старше, чем указано в настройках триггеров, или до следующего перезапуска.
Примеры триггеров
1. Загрузка большого файла из Интернета.
Использование функции min:
min(/www.example.com/net.if.in[eth0,bytes],5m)>100K
Выражение истинно, если количество полученных байтов на eth0 превышает 100 КБ за последние 5 минут.
2. Сервер недоступен.
count(/example.example.com/icmpping,30m,,"0")>5
Выражение истинно, если узел сети «example.example.com» был недоступен более 5 раз за последние 30 минут.
3. Активность процессора в ночное время.
Использование функции time():
min(/Zabbix server/system.cpu.load[all,avg1],5m)>2 and time()<060000
Триггер может изменить своё состояние на проблемное только в ночное время (с 00:00 до 06:00).