12 Триггеры
Триггеры это логические выражения, которые отображают собой состояние системы.
Триггер может принимать следующие значения:
Значение | Описание |
---|---|
ПРОБЛЕМА | Обычно означает, что что-то случилось. Например, высокая загрузка процессора. Называлось TRUE в предыдущих версиях Zabbix. |
ОК | Это нормальное состояние для триггера. Называлось FALSE в предыдущих версиях Zabbix. |
НЕИЗВЕСТНО | Означает что Zabbix не может высчитать выражение триггера. Это может произойти по нескольким причинам: – сервер недоступен – выражение триггера не может быть высчитано – выражение триггера было недавно изменено |
1 Выражения у триггеров
Используемые в триггерах выражения являются очень гибкими. Вы можете использовать их для создания сложных логических тестов, учитывая статистику по мониторингу.
1.1 Операторы выражений
Следующие операторы поддерживаются для триггеров (представлены по убыванию приоритета выполнения):
Приоритет | Оператор | Определение |
---|---|---|
1 | / | Деление |
2 | * | Умножение |
3 | – | Арифметический минус |
4 | + | Арифметический плюс |
5 | < | Менее чем. Этот оператор может быть представлен в виде: A<B ⇔ (A<=B-0.000001) |
6 | > | Более чем. Этот оператор может быть представлен в виде: A>B ⇔ (A>=B+0.000001) |
7 | # | Не равен. Этот оператор может быть представлен в виде: A#B ⇔ (A<=B-0.000001) | (A>=B+0.000001) |
8 | = | Равен. Этот оператор может быть представлен в виде: A=B ⇔ (A>B-0.000001) & (A<B+0.000001) |
9 | & | Логическое И |
10 | | | Логическое ИЛИ |
2 Функции триггеров
Функции триггеров позволяют ссылаться на собранные значения, текущее время и другие факторы.
2.1 Функции основанные на времени
Состояние (выражение) триггера пересчитывается каждый раз когда Zabbix сервер получает новое значение данных, если это значение данных является частью выражения. Если в выражении триггера используются функции относящиеся ко времени такой триггер пересчитывается каждые 30 секунд.
Функции относящиеся ко времени:
-
nodata()
-
date()
-
dayofmonth()
-
dayofweek()
-
time()
-
now()
2.2 Список функций триггеров
Поддерживаются следующие функции:
2) Строковые аргументы должны быть заключены в двойные кавычки. В противном случае они могут быть не верно интерпретированы.
▼ | ФУНКЦИЯ | Аргумент(ы) | Типы поддерживаемых значений |
---|---|---|---|
Описание | |||
abschange | игнорируется | float, int, str, text, log | |
Возвращает абсолютную разницу между последним и предыдущим значениями. Для строк: 0 – значения равны 1 – значения различны |
|||
avg | секунды или #num | float, int | |
Среднее значение за период времени. Параметр определяет продолжительность периода в секундах. Эта функция принимает секунды, необязательный параметр time_shift. Это бывает полезно, когда нужно сравнить текущее среднее значение со средним значением time_shift секунд ранее. Например, avg(3600,86400) вернет среднее значение за один час одним днем ранее. Параметр time_shift поддерживается начиная с Zabbix 1.8.2 |
|||
change | игнорируется | float, int, str, text, log | |
Возвращает разницу между последним и предыдущим значениями. Для строк: 0 – значения равны 1 – значения различны |
|||
count | секунды или #num | float, int, str, text, log | |
Количество значений данных из истории за период времени в секундах или количество последних #num значений попадающих под условие. Функция может принимать второй необязательный параметр шаблон, третий параметр оператор, и четвертый параметр time_shift. Например, count(600,12) вернет точное количество значений равных '12' из истории за промежуток времени 10 минут. Элементы данных с типом Целые числа: точное совпадение Числа с плавающей запятой: совпадение с точностью до 0.00001 Строки, текст и журналы элементы данных: поддерживаются операторы like (по умолчанию), eq, ne. Поддерживаемые операторы: eq – равно ne – не равно gt – больше ge – больше или равно lt – меньше le – меньше или равно like (только текстовый поиск) – совпадение, если содержит шаблон. Например, count(600,12,"gt") вернет точное количество значений больших чем '12' из истории за последние 10 минут. Другой пример: count(#10,12,"gt",86400) вернет точное количество значений больших '12' из истории из последних 10 значений 24 часами ранее. Если требуется подсчитывать произвольные значения, например, за последние 600 секунд 24 часами ранее, либо count(600,,86400) или count(600,,,86400) должно быть использовано в зависимости от того что требуется подсчитать – текст или числа, соответственно. Параметр #num поддерживается начиная с Zabbix 1.6.1. Параметр time_shift и строковые операторы поддерживаются начиная с Zabbix 1.8.2 |
|||
date | игнорируется | любые | |
Возвращает текущую дату в формате ГГГГММДД. Например: 20031025 |
|||
dayofmonth | игнорируется | любые | |
Возвращает день месяца из диапазона от 1 до 31. Эта функция поддерживается начиная с 1.8.5 |
|||
dayofweek | игнорируется | любые | |
Возвращает день недели из диапазона от 1 до 7. Пн – 1, Вс – 7. | |||
delta | секунды или #num | float, int | |
То же самое, что и max()-min(). Начиная с версии Zabbix 1.8.2 эта функция поддерживает секунды, необязательный параметр time_shift. Смотрите функцию avg для примера использования. |
|||
diff | игнорируется | float, int, str, text, log | |
Возвращает: 1 – последнее и предыдущее значения различаются 0 – наоборот |
|||
fuzzytime | секунды | float, int | |
Возвращает 1 если штамп времени (значения элемента данных) не отличается от времени на Zabbix сервере более чем на N секунд, 0 – наоборот. Обычно применяется с system.localtime, для проверки синхронно ли локальное время с локальным временем Zabbix сервера. |
|||
iregexp | 1-ый – строка, 2-ой – секунды или #num | str, log, text | |
Это – не чувствительный к регистру аналог функции regexp. | |||
last | секунды или #num | float, int, str, text, log | |
Последнее (самое новое) значение. Параметр: секунды – игнорируется #num – N-ное значение Например, last(0) всегда равняется last(#1) last(#3) – третье из последних значений Функция поддерживает необязательный параметр time_shift. Например: last(0,86400) вернет последнее значение одним днем ранее. Zabbix не гарантирует точный порядок значений, если за одну секунду имеется более одного значения. Параметр #num поддерживается начиная с Zabbix 1.6.2. Параметр time_shift поддерживается начиная с Zabbix 1.8.2. |
|||
logeventid | строка | log | |
Проверяет соответствие регулярному выражению Event ID последней записи в журнале. Параметр определяет регулярное выражение в формате расширенных регулярных выражений POSIX. Возвращает: 0 – не соответствует 1 – соответствует Эта функция поддерживается начиная с версии 1.8.5 |
|||
logseverity | игнорируется | log | |
Возвращает важность последней записи в журнале (логе). Параметры игнорируются. 0 – важность по умолчанию N – важность (целое число, полезно для журналов событий Windows). Zabbix берет важность журнала из колонки Информация из журнала событий Windows. |
|||
logsource | строка | log | |
Проверяет совпадает ли последняя запись в логе с параметром. 0 – не совпадает 1 – совпадает Обычно используется для журнала событий Windows. Например, logsource["VMWare Server"] |
|||
max | секунды или #num | float, int | |
Максимальное значение за период времени. Параметр определяет период времени в секундах. Начиная с версии Zabbix 1.8.2, функция поддерживает секунды, необязательный параметр time_shift. Смотрите функцию avg для примера использования. |
|||
min | секунды или #num | float, int | |
Минимальное значение за период времени. Параметр определяет период времени в секундах. Начиная с версии Zabbix 1.8.2, функция поддерживает секунды, необязательный параметр time_shift. Смотрите функцию avg для примера использования. |
|||
nodata | секунды | любые | |
Возвращает: 1 – если не было получено данных за указанный промежуток времени в секундах. Период не может быть меньше 30 секунд. 0 – наоборот |
|||
now | игнорируется | любые | |
Возвращает количество секунд с начала Эпохи (00:00:00 UTC, 1 Января 1970 г.). | |||
prev | игнорируется | float, int, str, text, log | |
Возвращает предыдущее значение. Параметр игнорируется. Аналог last(#2) |
|||
regexp | 1-ый – строка, 2-ой – секунды или #num | str, log, text | |
Проверяет, соответствует ли последнее значение регулярному выражению. Параметр должен задаваться регулярным выражением в формате расширенных регулярных выражений POSIX. Второй необязательный параметр это количество секунд или количество строк для анализа. В этом случае будет обработано более одного значения. Эта функция чувствительная к регистру. Возвращает: 1 – если найдено 0 – наоборот |
|||
str | 1-ый – строка, 2-ой – секунды или #num | str, log, text | |
Ищет строку в последнем значении. Параметр определяет строку для поиска. Эта функция чувствительная к регистру! Второй необязательный параметр это количество секунд или количество строк для анализа. В этом случае будет обработано более одного значения. Возвращает: 1 – если найдено 0 – если не найдено |
|||
strlen | секунды или #num | str, log, text | |
Длина последнего (наиболее нового) значения в символах (не в байтах). Параметры такие же, как и для функции last. Например, strlen(0) идентично strlen(#1) strlen(#3) – длина третьего наиболее нового значения strlen(0,86400) – длина наиболее нового значения один день назад. Эта функция поддерживается начиная с версии Zabbix 1.8.4. |
|||
sum | секунды или #num | float, int | |
Сумма значений за период времени. Параметр определяет период времени в секундах. Начиная с версии Zabbix 1.8.2, функция поддерживает секунды, необязательный параметр time_shift. Смотрите функцию avg для примера использования. |
|||
time | игнорируется | любые | |
Возвращает текущее время в формате ЧЧММСС. Например: 123055 |
Большинство числовых функций принимают количество секунд в качестве аргумента. Вы также можете использовать префикс # чтобы указать, что аргумент имеет другое значение:
ВЫЗЫВАЕМАЯ ФУНКЦИЯ | СМЫСЛ |
---|---|
sum(600) | Сумма всех значений в течении 600 секунд |
sum(#5) | Сумма последних 5 значений |
Функция last имеет особый смысл для значений с префиксом решетки – функция выбирает N-ное предыдущее значение. Поэтому из представленных значений (выстроены от последних к предыдущим) 3, 7, 2, 6, 5, функция last(#2) вернет 7 и функция last(#5) вернет 5.
Выражения триггеров поддерживают использование различных множителей, такие как суффиксы.
Простое полезное выражение может выглядеть так:
{<сервер>:<ключ>.<функция>(<параметр>)}<оператор><константа>
Параметр должен быть предоставлен даже для тех функций, которые его игнорируют. Например: last(0)
Пример 1
Высокая загрузка процессора на www.zabbix.com
{www.zabbix.com:system.cpu.load[all,avg1].last(0)}>5
'www.zabbix.com:system.cpu.load[all,avg1]' передает короткое имя наблюдаемого параметра.
Эта строка указывает, что контролируется сервер 'www.zabbix.com' и ключ 'system.cpu.load[all,avg1]'. Используя функцию 'last()', мы ссылаемся на самое последнее значение. И наконец '>5' означает, что триггер будет определен как ПРОБЛЕМА всякий раз, когда последнее значение загрузки процессора на сервере www.zabbix.com будет превышать 5.
Пример 2
www.zabbix.com перегружен
{www.zabbix.com:system.cpu.load[all,avg1].last(0)}>5|{www.zabbix.com:system.cpu.load[all,avg1].min(600)}>2
Это выражение будет определено как ПРОБЛЕМА, когда либо текущая загрузка процессора больше 5, либо загрузка процессора больше 2 за последние 10 минут.
Пример 3
Изменился файл /etc/passwd
Используем функцию diff:
{www.zabbix.com:vfs.file.cksum[/etc/passwd].diff(0)}>0
Это выражение будет определено как ПРОБЛЕМА, когда предыдущее значение контрольной суммы файла /etc/passwd отличается от последнего значения.
Аналогичные выражения могут быть полезны для мониторинга изменений в важных файлах, таких как /etc/passwd, /etc/inetd.conf, /kernel и других.
Пример 4
Кто-то скачивает большой файл из Интернет
Используем функцию min:
{www.zabbix.com:net.if.in[eth0,bytes].min(300)}>100K
Это выражение будет определено как ПРОБЛЕМА, когда сумма полученных байт за последних 5 минут на интерфейсе eth0 превышает 100КБ.
Пример 5
Оба узла кластера SMTP серверов недоступны
Примечание, в выражении используются два разных узла сети:
{smtp1.zabbix.com:net.tcp.service[smtp].last(0)}=0&{smtp2.zabbix.com:net.tcp.service[smtp].last(0)}=0
Это выражение будет определено как ПРОБЛЕМА, когда оба SMTP сервера недоступны smtp1.zabbix.com и smtp2.zabbix.com.
Пример 6
Zabbix агент нуждается в обновлении
Используем функцию str():
{zabbix.zabbix.com:agent.version.str("beta8")}=1
Это выражение будет определено как ПРОБЛЕМА, когда версия Zabbix агента содержит в себе 'beta8' (возможно 1.0beta8).
Пример 7
Сервер недоступен
{zabbix.zabbix.com:icmpping.count(1800,0)}>5
Выражение правдиво, если узел сети “zabbix.zabbix.com" недоступен более 5 раз за последние 30 минут.
Пример 8
Нет получения данных за последние 3 минуты
Используем функцию nodata():
{zabbix.zabbix.com:tick.nodata(180)}=1
‘tick’ должен иметь тип ‘Zabbix trapper’’. Для того чтобы этот триггер заработал, элемент данных ‘tick’ должен существовать. Узел сети должен периодически отправлять данные этому элементу данных используя zabbix_sender. Если не было получено данных за последние 180 секунд, значение триггера будет определено как ПРОБЛЕМА.
Пример 9
Активность ЦПУ в ночное время
Используем функцию time():
{zabbix:system.cpu.load[all,avg1].min(300)}>2&{zabbix:system.cpu.load[all,avg1].time(0)}>000000&{zabbix:system.cpu.load[all,avg1].time(0)}<060000
Триггер может быть определен как ПРОБЛЕМА только в ночное время (00:00-06:00).
Пример 10
Проверяет, если локальное время на клиенте синхронизировано с временем на Zabbix сервере
Используется функция fuzzytime():
{MySQL_DB:system.localtime.fuzzytime(10)}=0
Триггер меняет состояние на проблему тогда, когда локальное время на сервере MySQL_DB и Zabbix сервере различаются более чем на 10 секунд.
3 Зависимости триггеров
Зависимости триггеров могут быть использованы для определения взаимосвязи между триггерами.
Зависимости триггера являются очень удобным способом ограничения количества сообщений, которые будут отправлены в случае если возникающее событие относится к нескольким ресурсам.
Например, узел сети Хост находится позади маршрутизатора Роутер2, а Роутер2 находится позади Роутер1.
Zabbix - Роутер1 – Роутер2 - Хост
Если Роутер1 недоступен, то очевидно, что и Хост и Роутер2 недоступны. Никто не хочет получать три уведомления с информацией о Хост, Роутер1 и Роутер2. Это как раз тот случай, когда использование зависимостей триггера будет очень удобным.
Для этого случая, мы определяем эти зависимости:
триггер 'Хост недоступен' зависит от триггера 'Роутер2 недоступен' триггер 'Роутер2 недоступен' зависит от триггера 'Роутер1 недоступен'
Перед изменением состояния триггера 'Хост недоступен', Zabbix будет проверять существуют ли у этого триггера заданные зависимости. Если это так, и один из триггеров в находится в состоянии ПРОБЛЕМА, то состояние триггера не будет изменено и, следовательно, действие не будет выполнено и оповещение не будет отправлено.
Zabbix выполняет эту проверку рекурсивно. Если Роутер1 или Роутер2 недоступен, тогда триггер у Хоста не будет изменен.
4 Важности триггеров
Важность триггера определяет насколько триггер важен. Zabbix поддерживает следующие важности триггеров:
Важность | Определение | Цвет |
---|---|---|
Не классифицировано | Неизвестная важность. | Серый. |
Информация | В информационных целях. | Светло зеленый. |
Предупреждение | Предупреждающий. | Светло желтый. |
Средняя | Средняя проблема. | Темно красный. |
Высокая | Произошло что-то важное. | Красный. |
Чрезвычайная | Чрезвычайный. Финансовые потери и т.п. | Ярко красный. |
Важности могут быть использованы в:
-
визуальном представлении триггеров. Различные цвета для различных уровней важности.
-
звуковой сигнализации на странице наблюдения за состоянием триггеров. Различные звуковые сигналы для различных важностей.
-
оповещениях пользователей. Различные типы оповещений (каналы оповещения) для различных важностей. Например, СМС – для высокой важности, email – для остального.
5 Гистерезис
Иногда триггер должен иметь различные условия для разных состояний. Например, мы хотим определить триггер, который перейдет в состояние ПРОБЛЕМА если температура в серверной комнате поднимется выше 20 градусов. При этом триггер должен оставаться в состоянии ПРОБЛЕМА, пока температура не опустится ниже 15 градусов.
Для того чтобы сделать это, мы определим следующий триггер:
Пример 1
Температура в серверной комнате слишком высокая.
({TRIGGER.VALUE}=0&{server:temp.last(0)}>20)| ({TRIGGER.VALUE}=1&{server:temp.last(0)}>15)
Примечание: Здесь используется макрос {TRIGGER.VALUE}, который возвращает текущее состояние триггера (его числовое значение).
Пример 2
Осталось очень мало свободного места на диске
Проблема: осталось меньше чем 10ГБ за последние 5 минут
Восстановление: остается более чем 40ГБ за последние 10 минут
({TRIGGER.VALUE}=0&{server:vfs.fs.size[/,free].max(5m)}<10G) | ({TRIGGER.VALUE}=1&{server:vfs.fs.size[/,free].min(10m)}<40G)
Примечание: Здесь используется макрос {TRIGGER.VALUE}, который возвращает текущее состояние триггера (его числовое значение).
Data source: Zabbix