Мониторинг загрузки процессора в nagios

В состав плагинов nagios уже входит бинарная программа check_load, которая показывает текущую нагрузку на систему (load average). Но кроме того, есть распределение утилизации процессора между user space, system space, ожиданием io и бездействием. Это параметры тоже полезны при анализе нагрузки на сервер.
Готового решения я не нашел, так что сделаем все самостоятельно.

Для решения поставленной задачи нужно решить несколько отдельных подзадач:

  1. Собрать статистику утилизации CPU
  2. Написать скрипт, который будет отдавать эту статистику в формате nagios
  3. Настроить команды и сервисы nagios
  4. Построить красивые графики

Собираем статистику утилизации CPU

Обязательным требованием при сборе любой статистики является время. Т.е. статистику нужно собирать в течение достаточно продолжительного периода времени, чтобы полученные данные отражали реально происходящие процессы, а не какие-то промежуточные состояния при одиночной проверке состояния. Или частота проверки должна примерно соответствовать частоте изменения данных. Для утилизации процессора это выглядит так: частота изменений утилизации процессора составляет доли секунд, частота проверки nagios – несколько минут. Обычный подход nagios “зайти и проверить” не подходит.

Можно подключиться к серверу по ssh/nrpe и запустить проверку, скажем на минуту. Такой вариант отвратителен. Остается другой способ – статистика уже должна быть на сервере, nagios только забирает ее. Для этого замечательно подходит утилита sar. Напишем небольшой скрипт, который будет создавать файл со статистикой. Скрипт запускаем через крон каждую минуту.

#!/bin/bash
LOCKFILE=/var/run/cpu-usage.sh.lock
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
if [ -f $LOCKFILE ]; then
        exit 0;
fi
printf $$ > $LOCKFILE
TIME=55
SARDATA=`sar -u $TIME | fgrep Average | awk '{print "user:" $3 ";system:" $5 ";iowait:" $6 ";idle:" $8}'`
SARFILE=/var/sar-cpu-usage
printf $SARDATA > $SARFILE
rm $LOCKFILE

В результате мы получим текстовый файл. Формат у файла очень простой, плагину nagios нужно будет только прочитать содержимое файла и вывести необходимые данные.
script output

Пишем плагин для nagios

Сам скрипт достаточно прост, его нужно разместить на проверяемой машине.

#!/usr/bin/perl -w
use strict;
my $file = '/var/sar-cpu-usage';
my $line;                       

open FD, $file;
$line = ;
close FD;

my ($user, $system, $iowait, $idle, $nagios_data, $nagios_status, $exit_code);
my @arg;
@arg = split(/;/, $line);

# user
$arg[0] =~ /^user:(.*)$/;
$user = $1;
# system
$arg[1] =~ /^system:(.*)$/;
$system = $1;
# iowait
$arg[2] =~ /^iowait:(.*)$/;
$iowait = $1;
# idle
$arg[3] =~ /^idle:(.*)$/;
$idle = $1;

$nagios_data = sprintf("|user=%f;;; system=%f;;; iowait=%f;;; idle=%f;;; ",$user,$system,$iowait,$idle);
if ( $idle == 0 ) {
        $nagios_status = "CPU status: CRITICAL, idle $idle %";
        $exit_code = 2;
} elsif ( $idle < 5 ) {
        $nagios_status = "CPU status: WARNING, idle $idle %";
        $exit_code = 1;
} else {
        $nagios_status = "CPU status: OK, idle $idle %";
        $exit_code = 0;
}

print $nagios_status . $nagios_data;
exit $exit_code;

В результате получаем вот такой вывод скрипта:
cpu_usage

Настраиваем nrpe и nagios

Первым делом нужно настроить nrpe на проверяемой машине, точнее добавить команду для проверки, так как я предполагаю, что сам nrpe уже был настроен. Добавляем в nrpe.cfg строчку:

command[check_cpu_usage]=/usr/nagios/libexec/check_cpu_usage

Теперь нужно настроить сервер nagios. Нужно добавить команду для проверки и сервис для проверяемого хоста.
Добавляем в описание команды и сервиса:

define command {
command_name check_nrpe_cpu_usage
command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -p 5666 -t 60 -c check_cpu_usage
}

define service{
use template
host_name server.host-name.ru
service_description cpu usage
check_command check_nrpe_cpu_usage
}

На этом настройка nagios закончена. Напомню только, что use template требует определения шаблона под именем template. Но не спешите перегружать nagios.

Строим графики при помощи pnp4nagios

Я долгое время использовал nagios исключительно, как средство мониторинга текущего состояния, но в какой-то момент понял, что иногда хочу узнать что было с серверов в 5 часов утра. Из всех средств nagios предоставлял только логи алертов, чего, мягко говоря, мало. Пересмотрев несколько решений и попробовав написать свое, я остановился на php4nagios. Настройку его я пропущу здесь, расскажу только про настройку под рассматриваемую задачу.
Первым делом нужно создать файл настройки rrd базы, которую создаст php4nagios по данным от плагинов nagios. pnp ищет настройки в каталоге /etc/pnp/check_commands/ (так на gentoo). Файл настройки называется по имени команды (command_name) в настройках nagios. В нашем случае это check_nrpe_cpu_usage. Так что файл конфигурации будет называться /etc/pnp/check_commands/check_nrpe_cpu_usage.cfg :

CUSTOM_TEMPLATE = 0
DATATYPE = GAUGE,GAUGE,GAUGE,GAUGE

CUSTOM_TEMPLATE – определяет имя темплейта для построения графика из rrd файла. Цифры определяют имя темплейта. 0 – имя команды проверки, 1 – первый параметр команды. 2 – второй и так далее. Указываются через запятую.

CUSTOM_TEMPLATE=0,1,2

DATATYPE – определяет тип счетчика rrd, Счетчики передаются плагином nagios после пайпа (|)

|user=15.810000;;; system=1.430000;;; iowait=1.380000;;; idle=81.380000;;;

user – первый счетчик, system – второй и так далее. Плагин может возвращать данные и в таком формате user=15.810000;60;90;. 60 – значение для статуса проверки WARNING, 90 – для CRITICAL. Эти значения тоже могут быть использованы при построения графиков. Возвращаясь к DATATYPE. Каждое значение DATATYPE, которое тоже указывается через запятую, определяет один за другим типы счетчиков.

DATATYPE = GAUGE,GAUGE,GAUGE,GAUGE

В нашем случае все счетчики имеют тип GAUGE (подробнее про типа тут). Первый шаг сделан. Теперь нужно создать темплейт для отображения. Темплейты – это php файлы, в которых описаны команды, передаваемые rrdtool для генерации графиков. Для Gentoo они находятся в каталоге /usr/share/pnp/templates . Имя темплейта определяется по имени команды для проверки в настройках nagios, в нашем случае это будет опять check_nrpe_cpu_usage, и полный путь до файла будет /usr/share/pnp/templates/check_nrpe_cpu_usage.php. Рассказывать про rrdtool я не буду, так как это совсем отдельная тема, приведу файл, который использую я:

<?php
$opt[1] = "--slope-mode --vertical-label % --title \"CPU usage for $hostname\"";

$def[1] = "DEF:var1=$rrdfile:$DS[1]:AVERAGE " ;
$def[1] .= "DEF:var2=$rrdfile:$DS[2]:AVERAGE " ;
$def[1] .= "DEF:var3=$rrdfile:$DS[3]:AVERAGE " ;
$def[1] .= "DEF:var4=$rrdfile:$DS[4]:AVERAGE " ;

$def[1] .= "AREA:var4#00FF00:\"idle  \" ";
$def[1] .= "GPRINT:var4:MAX:\"\t%.1lf  max \" ";
$def[1] .= "GPRINT:var4:AVERAGE:\"%.1lf  average \" ";
$def[1] .= "GPRINT:var4:LAST:\"%.1lf  last \\n\" ";

$def[1] .= "AREA:var3#FF0000:\"iowait\" ";
$def[1] .= "GPRINT:var3:MAX:\"\t%.1lf  max \" ";
$def[1] .= "GPRINT:var3:AVERAGE:\"%.1lf  average \" ";
$def[1] .= "GPRINT:var3:LAST:\"%.1lf  last \\n\" ";

$def[1] .= "AREA:var1#FFFF00:\"user  \" ";
$def[1] .= "GPRINT:var1:MAX:\"\t%.1lf  max \" ";
$def[1] .= "GPRINT:var1:AVERAGE:\"%.1lf  average \" ";
$def[1] .= "GPRINT:var1:LAST:\"%.1lf  last \\n\" ";

$def[1] .= "AREA:var2#0000FF:\"system\" ";
$def[1] .= "GPRINT:var2:MAX:\"\t%.1lf  max \" ";
$def[1] .= "GPRINT:var2:AVERAGE:\"%.1lf  average \" ";
$def[1] .= "GPRINT:var2:LAST:\"%.1lf  last \\n\" ";

$def[1] .= "LINE1:var4#00FF00: ";
$def[1] .= "LINE1:var1#FFFF00: ";
$def[1] .= "LINE1:var2#0000FF: ";
$def[1] .= "LINE1:var3#FF0000: ";
?>

Теперь перезапускаем nrpe на проверяемой машине и nagios на сервера мониторинга, ждем какое-то время. В результате получается вот такая картинка:

cpu_usage_graph


Tags: , ,

Воскресенье, Февраль 22nd, 2009 Статьи

8 комментариевto Мониторинг загрузки процессора в nagios

  • Konstantin Kondakov пишет:

    Очень интересная и полезная статья !!! А можно ли собирать статистику по другим сервисам? Например, мне нужно знать, сколько было запущено процессов апаче в 5 утра или вчера в 22.00. Нагрузка выглдятит примерно так –

    root@master:~# dssh “ps -ef | grep apache | wc -l | sort ”

    server1 13
    server2 191
    server 3 256
    server 4 258
    server 5 251

    root@master:~# dssh “ps -ef | grep apache | wc -l | sort ”

    server1 14
    server2 191
    server3 266
    server4 259
    server5 257

    Вот Нагиос их показывает прямо сейчас, а как со статистикой???
    Спасибо!!

  • constantine.malov пишет:

    Статистику nagios тоже собирает, вот например
    ./check_ping -H 93.158.134.8 -w 500,5% -c 1000,10%
    PING OK – Packet loss = 0%, RTA = 2.01 ms|rta=2.007000ms;500.000000;1000.000000;0.000000 pl=0%;5;10;0

    Все, что до | (pipe) будет показано в nagios в качестве сообщения, все, что после – записано в указанный в конфигах файл, примерно что-то такое
    DATATYPE::SERVICEPERFDATA TIMET::1242286500 HOSTNAME::some.server.ru SERVICEDESC::http SERVICEPERFDATA::time=1.318199s;5.000000;10.000000;0.000000 size=24897B;;;0 SERVICECHECKCOMMAND::check_http!/ HOSTSTATE::UP HOSTSTATETYPE::HARD SERVICESTATE::OK SERVICESTATETYPE::HARD

    После из этого файла по записям можно восстановить состояние службы на какой-то момент времени, собственно что и делает pnp4nagios.
    Сохранять или нет статистику настраивается в nagios.conf, вот пример куска конфига

    service_perfdata_file=/var/nagios/service-perfdata
    Задаем имя файла
    service_perfdata_file_template=DATATYPE::SERVICEPERFDATA\tTIMET::$TIMET$\tHOSTNAME::$HOSTNAME$\tSERVICEDESC::$SERVICEDESC$\tSERVICEPERFDATA::$SERVICEPERFDATA$\tSERVICECHECKCOMMAND::$SERVICECHECKCOMMAND$\tHOSTSTATE::$HOSTSTATE$\tHOSTSTATETYPE::$HOSTSTATETYPE$\tSERVICESTATE::$SERVICESTATE$\tSERVICESTATETYPE::$SERVICESTATETYPE$
    Задаем формат

    service_perfdata_file_mode=w
    Тип записи (перезаписывать или добавлять записи, здесь перезаписываются)

    service_perfdata_file_processing_interval=60
    Интервал обработки файла, т.е. как часто будет запускаться команда для обработки файла

    service_perfdata_file_processing_command=process-service-perfdata-file
    Имя команды, это обычная команда, как и те, что используются для проверки хостов и служб. Собственно кратко об этом рассказано в документации к pnp4nagios.

  • Konstantin Kondakov пишет:

    Спасибо Вам большое. Я попробую это решение..

  • Konstantin Kondakov пишет:

    Я настроил систему, но вот некоторые плагины (check_by_ssh) не передают на выход pipe – то есть , вместо того, что надо –

    “/usr/lib/nagios/plugins/check_load -w 30 -c 90″
    OK – load average: 0.03, 0.09, 0.03|load1=0.030;30.000;90.000;0; load5=0.090;30.000;90.000;0; load15=0.030;30.000;90.000;0;

    на выходе check_by_ssh – вот что –

    ./check_by_ssh -H 192.168.20.200 -t 90 -l nagios -i /var/log/nagios/.ssh/id_dsa -C “/usr/lib/nagios/plugins/check_procs -w 2:200 -c 1:210 -C httpd”
    PROCS OK: 82 processes with command name ‘httpd’

    и все!!! неужели придется переписывать плагин ?!?!?

  • constantine.malov пишет:

    Думаю, как раз тут нужно посмотреть устройство check_procs (если это конечно не бинарник). Вообще писать плагины для nagios очень просто. Вот простой пример (пишу псевдокодом, так как нормальный код писать лень)

    W = 10;
    C = 15;

    COUNT = get_num_of_apache();

    if ( COUNT < W ) {
    echo "Status: OK, COUNT processes|proc=COUNT,W,C;"
    exit 0;
    }

    if ( COUNT > W and COUNT < C ) {
    echo "Status: WARNING, COUNT processes|proc=COUNT,W,C;"
    exit 1;
    }

    if ( COUNT > C ) {
    echo “Status: CRITICAL, COUNT processes|proc=COUNT,W,C;”
    exit 2;
    }

  • Konstantin Kondakov пишет:

    разобрался с check_procs- там нужен всего лишь простенький wrapper –

    #!/bin/bash
    LINE=`/usr/lib/nagios/plugins/check_procs $*`
    RC=$?
    COUNT=`echo $LINE | awk ‘{print $3}’`
    echo $LINE \| procs=$COUNT
    exit $RC

    сейчас попробую установить Вами написанный плагин для sar

    Еще у меня установлена очень интересная штука nexsm – которая незаменима, если число серверов больше 100, так как презентация их средствами Naigos -не очень удобна

    http://nexsm.gridshield.net/wiki/index.php/Main_Page

  • Konstantin Kondakov пишет:

    Можно попросить Вас проверить синтаксис плагина?
    У меня дает такую ошибку –

    syntax error at /usr/lib/nagios/plugins/check_sars line 6, near “=;”
    Execution of /usr/lib/nagios/plugins/check_sars aborted due to compilation errors.

    А шестая строчка это инициализация “пустой” переменной –

    #!/usr/bin/perl -w
    use strict;
    my $file = “/var/log/sar-cpu-usage”;
    my $line;
    open FD,$file;
    $line =;
    close FD;

  • constantine.malov пишет:

    $line =; – вот это perl не может переварить, присваивание без значения.
    Наверное вы хотели что-то такое написать
    $line = $_;

  • Leave a Reply

    Вы должны войти чтобы оставить комментарий.

    Cheap Retro Replica NFL NBA MLB Throwback Football Basketball Jerseys | hp printer ink cartridges refills| Jewelry Making Supplies | Thumb Joint Pain | Dog Health Problems |Tinkerbell Personal Checks |Garden Planters