Zabbix

Защищаемся от ложных срабатываний триггеров в Zabbix 7.0 LTS

"В этой статье рассказываю о лайфхаке для устранения проблемы с ложными срабатываниями триггеров при использовании троттлинга"
Александр Романюк
автор, инженер-проектировщик систем мониторинга
Если вы используете троттлинг для элементов данных с каким-либо статусом, вы можете столкнуться с ложными срабатываниями триггеров. Это связано с тем, что троттлинг не позволяет использовать функции min, max или avg для оценки нескольких последних значений. Это связано с тем, что Zabbix отбрасывает одни и те же последовательные значения.
Определяем проблему
Для элементов данных со статусом чего-либо, такие как статусы служб Windows, вы наверняка используете троттлинг, чтобы не хранить одни и те же значения. Если для триггера установлено срабатывание на 3 последовательных значения, он не перейдет в статус True, т.к. одинаковые предыдущие значения будут отброшены. Но есть решение, позволяющее избежать такую ситуацию. Решение позволяет сэкономить ресурсы хранения в крупных системах, не храня ненужные данные. Инструкция основана на стандартном шаблоне для служб Windows и служит примером, который можно использовать и для других элементов данных. Например, если у вас 1000 серверов Windows, на каждом из которых запущено 100 служб и выполняется проверка каждую минуту, то вам придется хранить в среднем 1660 значений метрик.
Как решить проблему
Чтобы решить эту проблему, можно использовать препроцессинг. Его можно использовать для управления значением ошибки (путем добавления метки времени), чтобы значение ошибки каждый раз было разным. Таким образом, значение ошибки проходит через троттлинг (отбрасывается без изменений). Значение, указывающее на штатное состояние сервиса, повторяется и отбрасывается с помощью троттлинга. Выполнить настройки ппрепроцессинга следует таким образом:
  • На первом этапе к значению ошибки добавляется временная метка.
  • Второй шаг отбрасывает неизмененные значения.
  • Третий шаг извлекает исходное значение ошибки из метки времени.
Пример JavaScript для добавления временной метки:

if (value == 0 ) {
  return value;
} else {
  return (Math.floor(Date.now() / 1000) - 1717182000 )*1000 + value;
}
После троттлинга возвращаем исходное значение, используя выражение:

return value % 1000;
Приведенный пример работает для состояний ошибок от 1 до 999 и для состояния со значением 0, когда всё в порядке.

С помощью такого подхода к препроцессингу вы можете использовать триггеры с функциями min/max/avg и они будут работать как положено. Это связано с тем, что у последние отличаются и не отбрасываются на шаге троттлинга:

min(//service.info["{#SERVICE.NAME}",state],#3)<>0
Что дальше

Приглашаем наши тренинги по Zabbix, OpenSearch, ElasticSearch

Максимум знаний за короткое время