Мониторинг времени на сервере с помощью Zabbix
Очередная статья на тему использования современной универсальной системы мониторинга. Расскажу, как с помощью zabbix настроить мониторинг времени на серверах и предупреждать при слишком больших расхождениях. На мой взгляд, полезная метрика, которой почему-то нет в базовых проверках.
Цели статьи
- Рассказать о разных способах мониторинга локального времени на сервере.
- Описать выбранный способ.
- Предоставить готовый шаблон для zabbix сервера.
Введение
Задача по мониторингу времени на сервере на первый взгляд кажется тривиальной, но с ней не все так просто. Я несколько раз брался за эту задачу и не доводил ее до конца. Сейчас уже не помню всех подробностей, так как поделиться решил финальной версией, которая уже некоторое время у меня функционирует. Основная проблема там в том, что время с агента берется в один момент, а время заббикс сервера берется в другой момент. И когда они сравниваются, может быть большое расхождение именно потому, что бралось время для сравения в разные моменты, а не потому, что время реально расходится.
Сравнение времени идет между временем сервера zabbix и локальным временем на сервере, где установлен агент, с помощью встроенной функции fuzzytime. Я для себя решил, что мне достаточно проверять время раз в минуту. Если расхождение будет более 60 секунд в трех последних проверках, то срабатывает триггер.
Теоретически, к этому триггеру можно прицепить action, который будет что-то исполнять на сервере. К примеру, запуск утилиты ntpdate для синхронизации времени. Но я не стал это настраивать, так как на всех серверах у меня всегда работает служба ntpd или chrony. Так что если время неактуальное, то надо идти на сервер и проверять, что со службой синхронизации времени.
Приступаем к настройке.
к содержанию ↑Элемент данных для мониторинга за временем
Это вычисляемый элемент данных. Формула:
fuzzytime(system.localtime,60)
В данном случае фукнция fuzzytime сравнивает время на сервере zabbix с локальным временем наблюдаемого сервера. Если разница больше 60 секунд, функция возвратит 0, если меньше, то 1.
С помощью вычисляемого элемента в базу сразу идет конкретный результат проверки на текущий момент времени, который потом легко использовать в триггере. Не нужно делать каких-то вычислений и сравнений в нем. Я просто беру 3 последних проверки и если они все три вернули значение 0, значит триггер сработает.
Вместо вычисляемого элемента можно было бы сделать обычный с ключом system.localtime, а затем функцию fuzzytime использовать уже в триггере. Но там может получаться большая погрешность, если интервал обновления будет большой (несколько минут), а проверяемая разница небольшая (десятки секунд). Мне не понравилось, как это работало, поэтому переделал на вычисляемое значение сразу в итеме.
к содержанию ↑Триггер для оповещения о неправильном времени
Вот пример самого триггера для оповещений.
Если 3 последние проверки были с ошибкой, то их сумма будет равно 0. После этого шлем уведомление. Как только время будет синхронизировано, триггер сразу же перейдет в нормальное состояние.
Вот готовый шаблон с элементом и триггером zabbix_time.xml.. Проверки работают как на linux, так и windows серверах. Шаблон выгружен с серера версии 4.0.
Проверка работы
Для проверки работы мониторинга за временем, достаточно на каком-то сервере установить время с отставанием или опережением более чем на 60 секунд. После этого подождать 3 неудачные проверки.
После этого сработает триггер.
Как видно по графику, 3 неверных значения пришли к 14:40, в этот момент сработал триггер. В 14:47 проверка вернула значение 1 и триггер перешл в состояние РЕШЕНО. В это время я сначала остановил ntpd, потом задал неправильное время командой:
# date +%T -s "14:35:13"
Этим я создал отставание на полторы минуты. Подождал несколько минут, потом обратно запустил службу ntpd и дождался, когда она проведет синхронизацию.
к содержанию ↑Заключение
Такая проверка времени серверов работает нормально и ложных срабатываний почти нет. Если вам нужны более жесткие интервалы проверки, то могут быть трудности. К примеру, если вам надо сделить за временем и предупреждать, когда разница становится 5 секунд. Если сделать, как показано у меня, то будет работать не надежно.
Точно не знаю, с чем это связано. Возможно сетевые задержки, или в работе вычисляемых значений. Тут надо внимательно смотреть в реализацию fuzzytime. Мне это было не нужно. Если кто-то решал подобную задачу, прошу поделиться в комментариях, как это делали вы.
Читайте мои остальные статьи по мониторингу с помощью zabbix.