Тестер http-статус кода для munin

Мелочевка в копилку. Как оказалось, может быть полезно. Сразу оговорюсь, решение не гениальное, но забавное ;)

Итак, постановка задачи.

Требуется периодически мониторить статус веб-сервера. Т.е. не полноценный тест, а просто проверка, живо ли приложение (именно приложение, а не apache и иже с ними). Будем запрашивать главную страницу и проверять код ответа. 1xx, 2xx, 3xxx считаем нормой, 4xx – WARNING, 5xx – CRITICAL. В качестве окружения – CentOS сервер с установленным munin-node (один из нодов в общем мониторинге).

Плагин будет состоять из 2х частей.

- Простенький таск на PHP (symfony), который получает статус-коды
- Собственно плагин на bash

Таск на symfony (подробно процесс создания таска описан тут http://www.symfony-project.org/cookbook/1_2/en/tasks):

- создаем класс

#lib/task/testSitesResponseTask.class.php
class testSitesResponseTask extends sfBaseTask
{
}

Таск будет принимать один параметр – список сайтов, разделенный запятыми.

protected function configure()
{
  //....
  $this->addArgument('sites', sfCommandArgument::REQUIRED, 'Sites URLs comma separated. E.g. "www.site1.ru,www.site2.ru"');
}

Тело таска:

protected function execute($arguments = array(), $options = array())
{
  $sites_array = explode( ',', $arguments['sites'] );
  foreach( $sites_array as $site )
  {
    $code = $this->tester( $site );
    $site_string = str_replace( array('.','/'), '_', $site ); // заменяем точки и слеши на подчерк (создаем уникальную переменную для сайта)
    echo "$site_string.value $coden"; // это важная строка! вывод значения для munin в виде variable_name.value NNN
  }
}

И простенький тестер на базе CURL:

protected function tester( $url )
{
  $ch = curl_init();
  curl_setopt( $ch, CURLOPT_URL, $url );
  curl_setopt( $ch, CURLOPT_HEADER, true );
  curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
  curl_exec( $ch );
  $result = curl_getinfo( $ch, CURLINFO_HTTP_CODE ); // Cохраняем HTTP статус-код в переменную
  curl_close($ch);
  return $result;
}

Запускается таск таким образом:

bash-3.2$ php symfony namespace:test-sites-response www.site1.ru,www.site2.ru
www_site1_ru.value 0
www_site2_ru.value 200

Теперь на базе этого таска можно написать плагинчик, который будет тестировать наши сайты.
Munin хранит плагины в /usr/share/munin/plugins/ (хотя в общем-то можно наш плагинчик положить сразу в /etc/munin/plugins/).
Наш плагин состоит из 2х частей. Конфигуратора и собственно запуска плагина.

# vim /usr/share/munin/plugins/sites
#!/bin/bash
# конфигуратор, запускается munin c параметром config. Показывает конфигурацию и выключается.
# заголовок графика
graph_title Sites status test
# подпись по оси Y
graph_vlabel status code
# категория
graph_category misc
# Описание под графиком
graph_info Sites status code
# псевдонимы
www_site1_ru.label site1
www_site2_ru.label site2
# лимиты для нотификации
www_site1_ru.warning 400
www_site1_ru.critical 500
www_site2_ru.warning 400
www_site2_ru.critical 500
# подписи для графиков
site1.info Status of the site1
site2.info Status of the site2
# запуск плагина
/path/to/symfony/symfony namespace:test-sites-response www.site1.ru,www.site2.ru

Вот почти все ;) Теперь делаем файл исполняемым и симлинк на него:

# chmod +x /usr/share/munin/plugins/sites
# ln -s /usr/share/munin/plugins/sites /etc/munin/plugins/sites

Протестируем плагин:

# /usr/sbin/munin-run sites

и конфигурацию

# /usr/sbin/munin-run sites config

Если все работает, перезапускаем munin-node:

# /etc/init.d/munin-node restart

И наблюдаем за построением графика.
p.s. о создании плагинов для munin подробнее тут: http://munin.projects.linpro.no/wiki/HowToWritePlugins

This entry was posted in Профессиональное and tagged , , , , . Bookmark the permalink. Post a comment or leave a trackback: Trackback URL.

Post a Comment

Your email is never published nor shared. Required fields are marked *

*
*

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">