Когда-то я уже писал про инструмент для мониторинга серверов под названием munin. В тот раз я не затрагивал плагины, а сейчас можно это сделать. Плагины для munin надо искать тут, один из полезных найденных мной плагинов называется apache_activity, он должен сканировать вывод апачевского mod_status’а и выдавать результат в виде графика. Проблема заключается в том, что сам плагин написан видимо под какую-то странную юниксу, поскольку под Центосом он не работает и в коде видно, что он там пытается делать что-то не то. Сам код написан на мерзотном перле, в котором проще по новой написать, чем разобраться, поэтому родилась идея сделать такой же, но работающий плагин и на пхп. До кучи, кроме обычных запросов, которые вообще то раз в 5 минут смотреть бессмысленно, поскольку в одну секунду может быть 200 запросов, а в следующую – 0, мой плагин мониторит “длинные” запросы “W”, которые выполняются дольше 20 секунд и которые как правило и отжирают основные ресурсы сервера.

Код плагина под катом, для работы надо поменять урл по которому сервер показывает выдачу мод статуса:

#!/usr/bin/php -dsafe_mode=Off
<?php
$url ='http://your.server.status.com/';

$letters = array();
// $letters['_'] ='Waiting for Connection'; // useless
$letters['S'] ='Starting up';
$letters['R'] ='Reading Request';
$letters['W'] ='Sending Reply';
$letters['K'] ='Keepalive (read)';
$letters['D'] ='DNS Lookup';
$letters['C'] ='Closing connection';
$letters['L'] ='Logging';
$letters['G'] ='Gracefully finishing';
$letters['I'] ='Idle cleanup of worker';
//$letters['.'] ='Open slot with no current process'; // useless

function getarg($arn)
{
    if (!isset($_SERVER['argv']))
        return FALSE;
    $a = $_SERVER['argv'];
    if (!isset($a[$arn]))
        return FALSE;
    return $a[$arn];
}

$arg1 = getarg(1);
if ('config'== $arg1)
{
    print "graph_title Apache status
graph_args --base 1000 -l 0
graph_category apache
graph_vlabel processes
";
    foreach ($letters as $lett => $val)
    {
        print "astatus_80_$lett.label $lett $val\n";
        print "astatus_80_$lett.type GAUGE\n";
    }
    print "astatus_80_WL.label Long W\n";
    print "astatus_80_WL.type GAUGE\n";
    exit;
}

$html = @file_get_contents($url);
if (100 > strlen($html))
{
    print "error [$html]";
    exit;
}

ApStGetLetters($html);
ApStGetLongW($html, 20);

function ApStGetLongW($html, $wsec)
{
    $ar1 = explode('<b>W</b>', $html);
    $ret =0;
    foreach ($ar1 as $val)
    {
        $ar2 = explode('</td><td>', $val);
        $i =2;
        if (isset($ar2[$i]))
        {
            $val = $ar2[$i];
            if (is_numeric($val))
            {
                if ($val >= $wsec)
                    $ret++;
            }
        }
    }
    print "astatus_80_WL.value $ret\n";
}

function ApStGetLetters($html)
{
    GLOBAL $letters;
    $ar1 = explode('</dl><pre>', $html);
    $ar2 = explode('</pre>', $ar1[1]);
    $str = $ar2[0];
    foreach ($letters as $lett => $val)
    {
        $num = substr_count($str, $lett);
        print "astatus_80_$lett.value $num\n";
    }
}

?>

Для установки плагина, надо скопировать его в файл /usr/share/munin/plugins/apache_status-v1, потом надо создать линк на файл в директории
/etc/munin/plugins (юникс такой юникс):
ln -s /usr/share/munin/plugins/apache_status-v1 apache_status-v1

Потом надо запустить конфигуратор мунина:
munin-run df config
И потом перезапустить ноду:
service munin-node restart

После этого плагин должен начать работать и в отчёте мунина появится новый набор графиков для статуса. Как я уже написал, самое осмысленное значение это количество долгих запросов, длину можно менять в сырцах плагина, но 20 секунд вроде более-менее нормальное значение. В результате работы плагина, получается примерно такая картинка:

Прикольное видео для непрограммистов:

Похожие посты