Всем привет! Мы делаем проекты по Zabbix, накопили большую экспертизу и решили сделать переводы нескольких статей, которые нам показались интересными и полезными. Наверняка, будут полезны и вам. Также своим опытом делимся в телеграм-канале zabbix_ru, где вы можете найти полезные материалы и записи наших вебинаров, опубликованных на нашем ютуб-канале (прим. переводчика). Ниже ссылки на предыдущие статьи из цикла.
Миграция с MySQL на PostgreSQL
SELinux: интеграция с Zabbix и другими инструментами
При использовании элементов данных в Zabbix, собирающих состояния систем, вы можете столкнуться с ложными срабатываниями. Это связано с тем, что настройки не позволяют использовать функции min, max или avg для оценки нескольких значений, т.к. Zabbix отбрасывает одинаковые последовательные состояния (в случае наличия предобработки Discard unchanged).
Описание проблемы
Для элементов состояния, таких как статусы служб Windows, вы, скорее всего, используете фильтрацию одинаковых значений подряд (так называемое отбрасывание неизменных значений). Этот тип предобработки использовать нельзя, поскольку триггер, который по умолчанию установлен на 3 последовательных значения, в этом случае не сработает. Однако существует решение, позволяющее смягчить эту ситуацию. Это решение позволяет значительно сэкономить ресурсы в крупных системах, не храня ненужные данные. Инструкции основаны на стандартном шаблоне для служб Windows и служат общим примером. Например, если у вас есть 1000 серверов Windows, на каждом из которых запущено 100 служб, проверяющих каждую минуту, то без этого улучшения в среднем каждую секунду будет извлекаться 1660 значений. С этим небольшим изменением конфигурации ситуация изменится до примерно 0–100 значений в минуту, в зависимости от частоты изменения состояния службы. Приведённые выше числа приведены лишь в качестве примера и могут отличаться в вашей среде.
Простое решение
Для решения этой проблемы можно использовать предварительную обработку. С её помощью можно манипулировать значением ошибки (добавляя метку времени), чтобы оно каждый раз было разным. Таким образом, значение ошибки проходит через шаг предобработки Discard unchanged. Значение, указывающее на правильное состояние, повторяется и также отбрасывается через шаг предобработки Discard unchanged. Вы можете настроить предварительную обработку следующим образом:

Первый шаг добавляет временную метку к значению ошибки.
Второй шаг отбрасывает неизмененные значения.
Третий шаг извлекает исходное значение ошибки из временной метки.
Добавить временную метку легко:
if (value == 0 ) {
return value;
} else {
return (Math.floor(Date.now() / 1000) - 1707000000 )*1000 + value;
}
После настройки вы получаете исходное значение, используя выражение:
return value % 1000;
Приведенный выше пример работает для состояний ошибки от 1 до 999 и для состояния со значением 0, когда состояние ОК.
С помощью описанной выше предварительной обработки вы по-прежнему можете использовать определение триггера с функциями min/max/avg, и всё будет работать как надо. Это связано с тем, что значения ошибок попадают в стандартный интервал:
min(//service.info["{#SERVICE.NAME}",state],#3)<>0
На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал zabbix_ru, где будет еще больше полезной информации.