Найти в Дзене
Stable IT

Как настроить мониторинг в Zabbix в нерабочее время

Сразу оговорюсь, что во-первых речь идёт о Zabbix версии 6.0 (в других версиях возможно будет работать по-другому), во-вторых я это записываю в основном для себя, чтобы не забыть, если снова понадобится (если будет полезно кому-то ещё - отлично). Итак, здесь будет рассмотрен вариант настройки мониторинга в ночное время, а так же в выходные и праздничные дни (если вдруг он по каким-то причинам должен отличаться от мониторинга в рабочее время).

Итак, имеется несколько метрик, триггеры по которым должны срабатывать по разным условиям в дневное и ночное время. Это делается легко:

для дневного времени (09:00-21:00) пишется выражение

(УСЛОВИЕ1) and ((time()>=090000) and (time()<=210000))

для ночного времени (21:00-09:00)

(УСЛОВИЕ2) and ((time()<090000) or (time()>210000))

Далее задача усложняется, нужно чтобы в выходные дни триггер работал так же, как в ночное время. Это тоже не представляет сложностей. Меняем выражения:

для дневного времени в рабочие дни

(УСЛОВИЕ1) and ((time()>=090000) and (time()<=210000)) and (dayofweek()<6)

для ночного времени в будни и выходных круглосуточно

(УСЛОВИЕ2) and (((time()<090000) or (time()>210000)) or (dayofweek()>5))

И тут внезапно выясняется, что кроме стандартных выходных дней (субботы и воскресенья) бывают ещё нерабочие (праздничные) дни среди недели, в которые (сюрприз!) триггер должен опять же работать по режиму выходного дня. Вот тут уже начинаются проблемы. Статьи в интернете предлагают использовать производственный календарь внутри организации или в интернете или ещё какие-то сложные способы. Но меня это не устроило, во-первых, потому что доступ в интернет из корпоративной сети ограничен, во-вторых, внутри организации готового ресурса с производственным календарём нет и городить его нет желания (если кто-то работал в крупных компаниях, поймёт меня). Итак, что же можно сделать, чтобы решить проблему малой кровью? Заводим в соответствующем шаблоне или группе хостов новый итем с ключом (Key), например, "Holiday", типом (Type) - "Calculated" и типом возвращаемых данных (Type of information) - "Numeric (unsigned)", в поле Formula сравниваем текущую дату со списком праздничных дней в таком виде

date()=20251103 or date()=20251104 or date()=20251231

Даты пишутся в формате ГГГГММДД. Проверять достаточно раз в сутки ночью или рано утром, поэтому интервал (Update interval) ставим "24h", в Custom intervals выбираем Type - "Scheduling", Interval - "h5m00" (кавычки писать не нужно). Конкретное время срабатывания можете поставить удобное, но до начала "дневного времени", чтобы триггер работал корректно. Результатом выполнения будет 1, если текущая дата совпадает с одной из заданных, либо 0 в противном случае.

Важное замечание, если у вас уже был итем и работал в производное время, а Вы изменили его таким образом, чтобы он выполнялся в определённое время, то не забудьте деактивировать его (Disabled) и активировать снова (Enabled). Иначе проверка будет выполняться с заданным интервалом, но и в старое и в новое время. По крайней мере у меня было так.

Теперь изменяем собственно сам триггер. Для ночного времени, выходных и праздничных дней меняем выражение на такое

(УСЛОВИЕ2) and (((time()<090000) or (time()>210000)) or (dayofweek()>5) or last(bla-bla-bla/Holiday)=1)

Конечно бывают и рабочие дни в выходные. Для этих случаев аналогично делается новый итем и меняется выражение триггера для будних дней.

Лично я вижу здесь только одну сложность - нужно не забывать раз в год вносить праздничные дни в список.

Плюс у меня почему-то не получилось добавить итем, когда он был задан в верхнеуровневом шаблоне "Linux by Zabbix agent" (в который входят все Linux-серверы), в выражение для триггера, поэтому пришлось добавлять его в конкретный шаблон. Это может стать проблемой, если проверку на нерабочие дни нужно будет выполнять для многих разных серверов, не входящих в одну группу или шаблон. Но меня пока данный вариант решения устроил. Если знаете, как это сделать лучше, поделитесь - буду благодарен.

P.S. Можно связать свой шаблон с "Linux by Zabbix agent" через поле Template на вкладке Template своего шаблона и тогда можно будет использовать итем, имеющийся в "Linux by Zabbix agent" на всех серверах.