Очередная статья на тему использования современной универсальной системы мониторинга. Расскажу, как с помощью zabbix настроить мониторинг времени на серверах и предупреждать при слишком больших расхождениях. На мой взгляд, полезная метрика, которой почему-то нет в базовых проверках.
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Содержание:
Цели статьи
- Рассказать о разных способах мониторинга локального времени на сервере.
- Описать выбранный способ.
- Предоставить готовый шаблон для zabbix сервера.
Введение
Задача по мониторингу времени на сервере на первый взгляд кажется тривиальной, но с ней не все так просто. Я несколько раз брался за эту задачу и не доводил ее до конца. Сейчас уже не помню всех подробностей, так как поделиться решил финальной версией, которая уже некоторое время у меня функционирует. Основная проблема там в том, что время с агента берется в один момент, а время заббикс сервера берется в другой момент. И когда они сравниваются, может быть большое расхождение именно потому, что бралось время для сравения в разные моменты, а не потому, что время реально расходится.
Сравнение времени идет между временем сервера zabbix и локальным временем на сервере, где установлен агент, с помощью встроенной функции fuzzytime. Я для себя решил, что мне достаточно проверять время раз в минуту. Если расхождение будет более 60 секунд в трех последних проверках, то срабатывает триггер.
Теоретически, к этому триггеру можно прицепить action, который будет что-то исполнять на сервере. К примеру, запуск утилиты ntpdate для синхронизации времени. Но я не стал это настраивать, так как на всех серверах у меня всегда работает служба ntpd или chrony. Так что если время неактуальное, то надо идти на сервер и проверять, что со службой синхронизации времени.
Приступаем к настройке.
Если у вас еще нет своего сервера для мониторинга, то рекомендую материалы на эту тему. Для тех, кто предпочитает систему CentOS:
То же самое на Debian 10, если предпочитаете его:
Элемент данных для мониторинга за временем
В финальном варианте я предлагаю следующий элемент данных для мониторинга локального времени на сервере.
Это вычисляемый элемент данных. Формула:
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.
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Как мониторить время если часовой пояс отличается на агенте и на сервер?
Добрый день. Не подскажите, скачал Ваш шаблон и установил на своём сервере. Но выдаёт ошибку Cannot evaluate function "fuzzytime(60)": item "192.168.***.***:system.localtime" does not exist. Заранее благодарю!
Сейчас нет смысла использовать этот шаблон. Мониторинг времени добавили в стандартные шаблоны zabbix, начиная с версии 4.4, если не ошибаюсь.
Подскажите - как можно в Zabbix настроить мониторинг продолжительности работы запущенной программы в Windows?
Спасибо.
В Zabbix нет подобного функционала. Надо как-то со стороны собирать эти данные и передавать в Zabbix. Например с помощью скрипта powershell следить за работой процесса.
Добрый день. Важное уточнение - нужно создать в шаблоне (или чтобы был в узле сети) элемент данных:
system.localtime
целое положительное
1 раз в минуту проверка
он возвратит данные о времени utc формате.
иначе, Ваш шаблон не работает и ругается что нет этого элемента
Сейчас вообще не имеет смысла это настраивать самому. В последних версиях стандартного шаблона linux есть проверка времени сервера, где установлен агент.
добрый день!
Спасибо. понятно. я пока на 4.2 но со старыми шаблонами.
Не затруднит добавить это замечание в пост?
Я тоже долго сидел на серверах, которые регулярно обновлялись. Я даже не знал, что в новых версиях установки шаблоны уже другие. А те, кто обновляются со старых версий новые шаблоны не получают. Статью сейчас подправлю.
Добрый день
Может быть, не совсем по теме - но есть ли идеи, как реализовать такую проверку, но по сравнению не с временем на zabbix сервере, а с временем на другом хосте(который то же есть в заббикс, и считается эталонным)?
Не знаю. Проще всего синхронизировать время заббикс сервера с эталоном а потом уже с ним всех остальных сравнивать. Кстати, в последних версиях zabbix сервера, в дефолтных шаблонах для linux уже есть функционал мониторинга за временем. Так что статья не актуальна. Нет смысла городить свои костыли.
Здравствуйте.
Конечно не в тему, но у меня вот такой вопрос. Как в письме указать сколько времени проработала машина до отключения?
По идее, это не сложно, но я лично не делал. Агент по-умолчанию собирает информацию об аптайме сервера. Нужно создать отдельный тип оповещения для триггера времени. В этом оповещении в шаблон письма добавить значение итема.
Благодарю, попробую сделать.
По моему если не критично то интервал проверки времени надо увеличить 30 минут или час. А то сервер тратит свои мощности на отписку + служба синхронизации по времени. В винде не спорю там время как угодно может прыгать.
Интервалы выбираются на усмотрение. Можно и раз в сутки запускать. Если производительности сервера хватает, я обычно ставлю почаще. Так просто удобнее.
Хорошая статья
Всё верно.
В шаблоне Template OS Windows по умолчанию нет элемента данных содержащих параметр system.localtime
В шаблоне Template OS Windows, нужно по аналогии создать элемент данных Host local time из шаблона Template OS Linux
Спасибо за информацию. Я, похоже, просто забыл об этом, так как добавил элемент в шаблон давно, а когда писал статью, не вспомнил об этом, поэтому сам с ошибкой не сталкивался.
Походу он просто при сканировании почему-то не создался сам...
Блин, вот только написал проблему, сразу и решил =Р
просто создал новый item с параметром key = system.localtime
теперь всё работает, проверил изменением времени
на win машинках выдает только Cannot evaluate function "fuzzytime(60)": item "hostname:system.localtime" does not exist.
Идентичная проблема.
На клиентах windows получаем ошибку
Cannot evaluate function "fuzzytime(60)": item "PC-01:system.localtime" does not exist.
Ничего не нужно дополнительно ставить на win клиенты (например ntp клиенты какие-нибудь)?
Вроде нет, я ничего не ставил. Первые тесты как раз на win машинах сделал, подергав их время. Установка агента дефолтная.
Добрый день. Получил такую же ошибку на Win-хостах. Причем самое интересное, что в разных офисах, все за zabbox-proxy, одни сервера отдают значение и все работает, а другие нет.
Удалось найти решение?