<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>mysyslog.ru &#187; nrpe</title>
	<atom:link href="http://mysyslog.ru/posts/tag/nrpe/feed" rel="self" type="application/rss+xml" />
	<link>http://mysyslog.ru</link>
	<description>Всякая IT всячина</description>
	<lastBuildDate>Sat, 17 Mar 2012 17:39:43 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Мониторинг загрузки процессора в nagios</title>
		<link>http://mysyslog.ru/posts/108</link>
		<comments>http://mysyslog.ru/posts/108#comments</comments>
		<pubDate>Sat, 21 Feb 2009 22:53:48 +0000</pubDate>
		<dc:creator>constantine.malov</dc:creator>
				<category><![CDATA[Статьи]]></category>
		<category><![CDATA[nagios]]></category>
		<category><![CDATA[nrpe]]></category>
		<category><![CDATA[pnp4nagios]]></category>

		<guid isPermaLink="false">http://mysyslog.ru/?p=108</guid>
		<description><![CDATA[В состав плагинов nagios уже входит бинарная программа check_load, которая показывает текущую нагрузку на систему (load average). Но кроме того, есть распределение утилизации процессора между user space, system space, ожиданием io и бездействием. Это параметры тоже полезны при анализе нагрузки на сервер.
Готового решения я не нашел, так что сделаем все самостоятельно.

Для решения поставленной задачи нужно [...]]]></description>
			<content:encoded><![CDATA[<p>В состав плагинов nagios уже входит бинарная программа check_load, которая показывает текущую нагрузку на систему (load average). Но кроме того, есть распределение утилизации процессора между user space, system space, ожиданием io и бездействием. Это параметры тоже полезны при анализе нагрузки на сервер.<br />
Готового решения я не нашел, так что сделаем все самостоятельно.<br />
<span id="more-108"></span><br />
Для решения поставленной задачи нужно решить несколько отдельных подзадач:</p>
<ol>
<li>Собрать статистику утилизации CPU</li>
<li>Написать скрипт, который будет отдавать эту статистику в формате nagios</li>
<li>Настроить команды и сервисы nagios</li>
<li>Построить красивые графики</li>
</ol>
<div style="float:left; width:265px; height:265px;">
<script type="text/javascript"><!--
google_ad_client = "pub-5926413875763738";
/* wp-post-250x250 */
google_ad_slot = "6534377323";
google_ad_width = 250;
google_ad_height = 250;
//-->
</script><br />
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</div>
<h3>Собираем статистику утилизации CPU</h3>
<p>Обязательным требованием при сборе любой статистики является время. Т.е. статистику нужно собирать в течение достаточно продолжительного периода времени, чтобы полученные данные отражали реально происходящие процессы, а не какие-то промежуточные состояния при одиночной проверке состояния. Или частота проверки должна примерно соответствовать частоте изменения данных. Для утилизации процессора это выглядит так: частота изменений утилизации процессора составляет доли секунд, частота проверки nagios &#8211; несколько минут. Обычный подход nagios &#8220;зайти и проверить&#8221; не подходит.</p>
<p>Можно подключиться к серверу по ssh/nrpe и запустить проверку, скажем на минуту. Такой вариант отвратителен. Остается другой способ &#8211; статистика уже должна быть на сервере, nagios только забирает ее. Для этого замечательно подходит утилита sar. Напишем небольшой скрипт, который будет создавать файл со статистикой. Скрипт запускаем через крон каждую минуту.</p>
<pre lang="bash">#!/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 $$ &gt; $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 &gt; $SARFILE
rm $LOCKFILE</pre>
<p>В результате мы получим текстовый файл. Формат у файла очень простой, плагину nagios нужно будет только прочитать содержимое файла и вывести необходимые данные.<br />
<a href="http://mysyslog.ru/wp-content/uploads/2009/02/1.png"><img class="alignnone size-full wp-image-119" title="script output" src="http://mysyslog.ru/wp-content/uploads/2009/02/1.png" alt="script output" width="327" height="51" /></a></p>
<h3>Пишем плагин для nagios</h3>
<p>Сам скрипт достаточно прост, его нужно разместить на проверяемой машине.</p>
<pre lang="perl">#!/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 &lt; 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;</pre>
<p>В результате получаем вот такой вывод скрипта:<br />
<a href="http://mysyslog.ru/wp-content/uploads/2009/02/cpu_usage.png"><img class="alignleft size-full wp-image-137" title="cpu_usage" src="http://mysyslog.ru/wp-content/uploads/2009/02/cpu_usage.png" alt="cpu_usage" width="723" height="36" /></a></p>
<h3>Настраиваем nrpe и nagios</h3>
<p>Первым делом нужно настроить nrpe на проверяемой машине, точнее добавить команду для проверки, так как я предполагаю, что сам nrpe уже был настроен. Добавляем в nrpe.cfg строчку:</p>
<pre>command[check_cpu_usage]=/usr/nagios/libexec/check_cpu_usage</pre>
<p>Теперь нужно настроить сервер nagios. Нужно добавить команду для проверки и сервис для проверяемого хоста.<br />
Добавляем в описание команды и сервиса:</p>
<pre>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
}</pre>
<p>На этом настройка nagios закончена. Напомню только, что <strong>use  template</strong> требует определения шаблона под именем template. Но не спешите перегружать nagios.</p>
<h3>Строим графики при помощи pnp4nagios</h3>
<p>Я долгое время использовал nagios исключительно, как средство мониторинга текущего состояния, но в какой-то момент понял, что иногда хочу узнать что было с серверов в 5 часов утра. Из всех средств nagios предоставлял только логи алертов, чего, мягко говоря, мало. Пересмотрев несколько решений и попробовав написать свое, я остановился на php4nagios. Настройку его я пропущу здесь, расскажу только про настройку под рассматриваемую задачу.<br />
Первым делом нужно создать файл настройки 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 :</p>
<pre>CUSTOM_TEMPLATE = 0
DATATYPE = GAUGE,GAUGE,GAUGE,GAUGE</pre>
<p>CUSTOM_TEMPLATE &#8211; определяет имя темплейта для построения графика из rrd файла. Цифры определяют имя темплейта. 0 &#8211; имя команды проверки, 1 &#8211; первый параметр команды. 2 &#8211; второй и так далее. Указываются через запятую.</p>
<pre>CUSTOM_TEMPLATE=0,1,2</pre>
<p>DATATYPE &#8211; определяет тип счетчика rrd, Счетчики передаются плагином nagios после пайпа (|)</p>
<pre>|user=15.810000;;; system=1.430000;;; iowait=1.380000;;; idle=81.380000;;;</pre>
<p>user &#8211; первый счетчик, system &#8211; второй и так далее. Плагин может возвращать данные и в таком формате <strong>user=15.810000;60;90;</strong>. 60 &#8211; значение для статуса проверки WARNING, 90 &#8211; для CRITICAL. Эти значения тоже могут быть использованы при построения графиков. Возвращаясь к DATATYPE. Каждое значение DATATYPE, которое тоже указывается через запятую,  определяет один за другим типы счетчиков.</p>
<pre>DATATYPE = GAUGE,GAUGE,GAUGE,GAUGE</pre>
<p>В нашем случае все счетчики имеют тип GAUGE (подробнее про типа <a href="http://bozza.ru/?c=230&amp;p=content">тут</a>). Первый шаг сделан. Теперь нужно создать темплейт для отображения. Темплейты &#8211; это php файлы, в которых описаны команды, передаваемые rrdtool для генерации графиков. Для Gentoo они находятся в каталоге /usr/share/pnp/templates . Имя темплейта определяется по имени команды для проверки в настройках nagios, в нашем случае это будет опять check_nrpe_cpu_usage, и полный путь до файла будет /usr/share/pnp/templates/check_nrpe_cpu_usage.php. Рассказывать про rrdtool я не буду, так как это совсем отдельная тема, приведу файл, который использую я:</p>
<pre lang="php">&lt;?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: ";
?&gt;</pre>
<p>Теперь перезапускаем nrpe на проверяемой машине и nagios на сервера мониторинга, ждем какое-то время. В результате получается вот такая картинка:</p>
<p style="text-align: center;"><a href="http://mysyslog.ru/wp-content/uploads/2009/02/cpu_usage_graph.png"><img class="size-medium wp-image-152 aligncenter" title="cpu_usage_graph" src="http://mysyslog.ru/wp-content/uploads/2009/02/cpu_usage_graph-300x111.png" alt="cpu_usage_graph" width="300" height="111" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://mysyslog.ru/posts/108/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>

