Мелочевка в копилку. Как оказалось, может быть полезно. Сразу оговорюсь, решение не гениальное, но забавное 😉
Итак, постановка задачи.
Требуется периодически мониторить статус веб-сервера. Т.е. не полноценный тест, а просто проверка, живо ли приложение (именно приложение, а не 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
Webmentions
Austin Fire Damage Restoration Service
Тестер http-статус кода для munin