in Профессиональное

Тестер 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

Write a Comment

Comment

*

Webmentions

  • Austin Fire Damage Restoration Service

    Austin Fire Damage Restoration Service

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