Мониторинг задержек при помощи smokeping
Как-то мне (в очередной раз) потребовалось настроить мониторинг доступности клиентского сервиса через интернет. В процессе настройки я обнаружил, что не смотря на существование очень простого, понятного и удобного инструмента под названием SmokePing, по нему практически нет документации на русском (а документация на английском очень ограничена и запрятана в странном месте). Поэтому я решил написать эту небольшую вводную статью.
О чем речь
SmokePing - инструмент для мониторинга задержки во времени ответа. Изначально был написан для проверки качества сети (то есть - для провайдеров) - скачки в задержках и (особенно) потери пакетов демонстрируют потенциальные перебои в работе и вообще ничего хорошего означать не могут. В дальнейшем автор несколько расширил инструмент, и теперь он может следить за задержками, в принципе, в чем угодно, что может быть полезно разработчикам и админам высконагруженного проекта, который должен отвечать за заданный промежуток времени. Автор инструмента - широко известный в сисадминских кругах Тоби Этикер, тот самый, что придумал RRD (и следом - RRDTool), а затем - MRTG. Эти два инструмента используются, наверное, в 90% всех провайдерах услуг связи.
Терминология и схема работы
Сам по себе SmokePing устроен очень просто, если не сказать - примитивно. Изначально стартует один демон, который управляет всеми процедурами проверок. Для каждого способа проверки (название в терминах SP - Probe) стартует своя копия демона, которая отвечает за проверки именно этим способом. Раз в 5 минут демон проводит серию измерений и записывает результаты. Все результаты в “сыром виде” записываются в стандартный RRD (по одной RRD на каждый объект). Также в комплект поставки входит вебморда, которая отвечает за рисование графиков. Графики строго одиночные (комбинировать задержку с трех хостов на один график не дадут), но их можно масштабировать и двигаться в них по времени. Веб-интерфейс использует старый-добрый CGI, и вся эта конструкция написана на perl. SmokePing позволяет проводить измерения с нескольких разных машин (в терминах SP - Slave), но данные сгружать в одну точку для анализа. На борту имеется служба уведомлений, но все-таки это ‘не мониторинг’, это именно статистика качества ответов (как быстро пришел ответ и какой разлет в показателях).
Установка
В данном примере я рассматриваю Debian Linux, но SmokePing уверенно работает на практически любой ОС (требуется perl, librrd, желательно - fping, curl и dig). Установка стандартная:
apt-get install smokeping
Если у вас еще нет вебсервера, нужен соответствующий, с поддержкой CGI. Я использовал lighttpd:
apt-get install lighttpd
Все настройки находятся в /etc/smokeping/config.d/
- Alerts - уведомления
- Database - место хранения данных. Трогать аккуратно!
- General - основные
- Presentation - внешний вид веб-морды (путь к шаблону веб-страницы, размеры графиков по умолчанию и тому подобное)
- Probes - способы мониторинга, подробнее ниже
- Slaves - дочерние зонды, которые позволяют мониторить загрузку из нескольких точек
- Targets - цели, которые мы мониторим
Сначала настроим основы. Самая важная настройка - предпоследняя. Если неправильно настроить URL - картинок с графиком не будет:
#/etc/smokeping/config.d/General
*** General ***
owner = Paul 'Logan' Rudnitskiy
contact = admin@DOMAIN
mailhost = mail.DOMAIN
cgiurl = httpa://monitoring.domain/smokeping/smokeping.cgi
syslogfacility = local0
Теперь настроим зонды (способы проверки):
#/etc/smokeping/config.d/Probes
*** Probes ***
+ FPing
binary = /usr/bin/fping
++ FPingNormal
offset = 0%
++ FPingLarge
packetsize = 5000
offset = 50%
В данном случае мы настроили две способа проверки одним зондом (FPing). Мы заранее определили путь к программе, которая проводит проверку (/usr/bin/fping), и можем проверять простыми пакетами или большими. графа offset нужна, чтобы не проверять один хост одновременно обычными и большими пакетами (это искажает результаты). Offset всегда в процентах и считается от начала цикла проверки.
Добавим еще способов:
#/etc/smokeping/config.d/Probes
[...]
+ FPing6
binary = /usr/bin/fping6
+ DNS
binary = /usr/bin/dig
lookup = name.example
pings = 3
step = 60
offset = 10%
timeout = 2
+ Curl
binary = /usr/bin/curl
step = 60
timeout = 5
urlformat = http://%host%/
Теперь поподробнее, что тут появилось:
- pings - количество запросов за цикл проверки. По умолчанию 5, но это число можно менять
- step - длительность цикла проверки. Все проверки должны быть завершены за один цикл и записаны в базу. По умолчанию - 300sec (5 минуту)
- offset нам уже знаком
- timeout - тайм-аут в секундах
- lookup - специфичный параметр для плагина dig - какое имя нужно запрашивать на DNS
- urlformat - специфичный параметр для плагина curl. Подходит любой URL, который curl может обработать
Важно! Если вы меняете pings или step - вам прийдется пересоздать RRD-базу, так как изменить формат хранения данных в базе невозможно - он задается единожды и не может быть отредактирован. Соответственно, при изменении этой настройки вы потеряете статистику.
Вооружившись probe-ами, создадим цели мониторинга:
#/etc/smokeping/config.d/Targets
*** Targets ***
#зонд из прошлого конфига
probe = FPingNormal
#верхушка меню. Меню поддерживают иерархию, очень удобно
+ network
menu = Network reachability
title = Network reachability (ICMP)
++ work
menu = Work
title = Work
+++ web1
menu = web1
title = web1
host = 10.0.0.1
+++ web2
menu = web2
title = web2
host = 10.0.0.2
#здесь мы будем мониторить время ответа веб-сервера
#зонд можно задать как для пункта меню (он наследуется по иерархии)
#и даже для отдельного хоста
#но нужно сначала задать зонд, и только потом - его настройки.
+ WEB
menu = web
title = web
probe = Curl
++ web1
menu = web1
title = web1
host = 10.0.0.1
# а это уже меню, потому, что мы проверяем не только HTTP
++ web2
menu = web2
title = web2
+++ web2www
menu = www
title = www
host = 10.0.0.2
+++ web2ftp
menu = www
title = www
host = 10.0.0.2
urlformat = ftp://%host%/pub/
Можно запускать smokeping, он уже будет собирать данные и сохранять статистику. Теперь хорошо бы на нее посмотреть. Настроим Lighttpd:
#/etc/lighttpd/conf-enabled/10-cgi.conf
server.modules += ( "mod_cgi" )
server.modules += ( "mod_setenv" )
$HTTP["url"] =~ "^/smokeping" {
alias.url = (
"/smokeping/smokeping.cgi" => "/usr/lib/cgi-bin/smokeping.cgi"
"/smokeping" => "/usr/share/smokeping/www/",
)
server.indexfiles = ("smokeping.cgi")
#чтобы статистика была доступна только тем, кому можно ее смореть:
auth.backend = "htpasswd"
auth.backend.htpasswd.userfile = "/var/www/.htpasswd"
auth.require = ( "" => (
"method" => "basic",
"realm" => "icinga",
"require" => "valid-user"
) )
}
После перезапуска lighttpd можно открывать http://monitoring.domain/smokeping и смотреть графики. В идеале надо подождать минут 30 (хотя бы), чтобы smping успел наполнить базу хоть какой-то статистикой.
Вот так выглядит нормальный график:
А это график -курильщика- сервера, которому явно нехорошо