Как-то мне (в очередной раз) потребовалось настроить мониторинг доступности клиентского сервиса через интернет. В процессе настройки я обнаружил, что не смотря на существование очень простого, понятного и удобного инструмента под названием 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  = [email protected]
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 успел наполнить базу хоть какой-то статистикой.

Вот так выглядит нормальный график:

График

А это график -курильщика- сервера, которому явно нехорошо

График курильщика