Мониторинг температуры в серверной

Материал из RSU WiKi
Перейти к: навигация, поиск
Внешний вид платы мониторинга с выносным температурным датчиком
Мониторинг температуры осуществляется путем снятия показаний с выносных температурных датчиков ИБП APC SmartUPS по SNMP. Показания будут сниматься perl-скриптом по крону и складываться в базу данных RRD.

Скрипты работают на Веб-сервере Apache 2 под управлением SLES 11 (ppc64), статистика собирается с температурных датчиков плат "UPS Network Management Card" ИБП APC Smart-UPS 3000 RM.

Листинг скрипта для cron'a:

/usr/local/bin/ups_temp.pl

#!/usr/bin/perl
 
use RRDs;
use Net::SNMP;
 
# define location of rrdtool databases
my $rrd = '/var/lib/rrd';
# define location of images
my $img = '/srv/www/htdocs/upstemp';
 
&ProcessUPS("hostname1", "SmartUPS Temperature,C");
&ProcessUPS("hostname2", "SmartUPS Temperature,C");
&ProcessUPS("hostname3", "SmartUPS Temperature,C");
 
 
sub ProcessUPS
{
	($session,$error) = Net::SNMP->session(Hostname => $_[0], Community => "public"); die "session error: $error" unless ($session); 
	$result = $session->get_request(".1.3.6.1.4.1.318.1.1.10.2.3.2.1.4.1"); die "request error: ".$session->error unless (defined $result); $session->close;
	my $temp=$result->{".1.3.6.1.4.1.318.1.1.10.2.3.2.1.4.1"}."\n";
	# remove eol chars and white space
	$temp =~ s/[\n ]//g;
 
	print "$_[0] temp: $temp degrees C\n";
 
	# if rrdtool database doesn't exist, create it
	if (! -e "$rrd/$_[0].rrd")
	{
		print "creating rrd database for $_[0]...\n";
		RRDs::create "$rrd/$_[0].rrd",
			"-s 300",
			"DS:temp:GAUGE:600:0:100",
			"RRA:AVERAGE:0.5:1:576",
			"RRA:AVERAGE:0.5:6:672",
			"RRA:AVERAGE:0.5:24:732",
			"RRA:AVERAGE:0.5:144:1460";
	}
 
	# insert value into rrd
	RRDs::update "$rrd/$_[0].rrd",
		"-t", "temp",
		"N:$temp";
 
	# create graphs
	&CreateGraph($_[0], "day", $_[1]);
	&CreateGraph($_[0], "week", $_[1]);
	&CreateGraph($_[0], "month", $_[1]);
	&CreateGraph($_[0], "year", $_[1]);
 
}
 
sub CreateGraph
{
	RRDs::graph "$img/UPS_Temperature-$_[1].png",
		"--lazy",
		"-s -1$_[1]",
		"-t ups temperature :: APC Smart-UPS's",
		"-h", "80", "-w", "600",
		"-a", "PNG",
		"-v degrees C",
		"--slope-mode",
		"DEF:ups1=$rrd/172.16.0.234.rrd:temp:AVERAGE",
		"DEF:ups2=$rrd/172.16.0.235.rrd:temp:AVERAGE",
		"DEF:ups3=$rrd/172.16.0.236.rrd:temp:AVERAGE",
		"LINE2:ups1#00FF00:APC SMART-UPS1		",
		"GPRINT:ups1:MIN:  Min\\: %2.lf",
		"GPRINT:ups1:MAX: Max\\: %2.lf",
		"GPRINT:ups1:AVERAGE: Avg\\: %4.1lf",
		"GPRINT:ups1:LAST: Current\\: %2.lf degrees C\\n",
		"LINE2:ups2#CC00CC:APC SMART-UPS2		",
		"GPRINT:ups2:MIN:  Min\\: %2.lf",
		"GPRINT:ups2:MAX: Max\\: %2.lf",
		"GPRINT:ups2:AVERAGE: Avg\\: %4.1lf",
		"GPRINT:ups2:LAST: Current\\: %2.lf degrees C\\n",
		"LINE2:ups3#00BBCC:APC SMART-UPS3		",
		"GPRINT:ups3:MIN:  Min\\: %2.lf",
		"GPRINT:ups3:MAX: Max\\: %2.lf",
		"GPRINT:ups3:AVERAGE: Avg\\: %4.1lf",
		"GPRINT:ups3:LAST: Current\\: %2.lf degrees C\\n";
 
 
	if ($ERROR = RRDs::error) { print "$0: unable to generate $_[1] graph: $ERROR\n"; }
}

Если необходимо отрисовывать графики дополнительных устройств, в секцию CreateGraph нужно добавить дополнительные блоки:

		"LINE2:ups3#00BBCC:APC SMART-UPSx		",
		"GPRINT:upsx:MIN:  Min\\: %2.lf",
		"GPRINT:upsx:MAX: Max\\: %2.lf",
		"GPRINT:upsx:AVERAGE: Avg\\: %4.1lf",
		"GPRINT:upsx:LAST: Current\\: %2.lf degrees C\\n";

Данный скрипт будет запускаться по крону каждые 5 минут. Делаем соответствующую запись в /etc/cron.d:

*/5 * * * * root /usr/local/bin/ups_temp.pl 1> /dev/null 2>&1

Настраиваем Apache для отображения наших графиков на странице %HOSTNAME%/upstemp:

<Directory "/srv/www/htdocs/upstemp/">
    AllowOverride All
    Options None
    Order allow,deny
    Allow from all
    Options FollowSymLinks ExecCGI
</Directory>

Листинг cgi-скрипта:

/srv/www/cgi-bin/upstemp.cgi

#!/usr/bin/perl
#
# copyright Martin Pot 2003
# http://martybugs.net/linux/hddtemp.cgi
#
# modifications RSU Network Team 2011
# http://wiki.rsu.edu.ru/
# upstemp.cgi
 
my @graphs;
my ($name, $descr);
 
# define ups to display (add/remove as required)
push (@graphs, "UPS_Temperature");
 
# get the server name (or you could hard code some description here)
my $svrname = $ENV{'SERVER_NAME'};
my $imgsrc ="/upstemp/";
 
# get url parameters
my @values = split(/&/, $ENV{'QUERY_STRING'});
foreach my $i (@values) 
{
	($varname, $mydata) = split(/=/, $i);
	if ($varname eq 'trend')
	{
		$name = $mydata;
	}
}
 
if ($name eq '')
{ 
	$descr = "summary"; 
}
else
{ 
	$descr = "/dev/$name"; 
}
 
print "Content-type: text/html;\n\n";
print <<END
<html>
<head>
  <TITLE>Server Room &#0176;C</TITLE>
  <META HTTP-EQUIV="Refresh" CONTENT="300">
  <META HTTP-EQUIV="Cache-Control" content="no-cache">
  <META HTTP-EQUIV="Pragma" CONTENT="no-cache">
  <style>
    body { font-family: Verdana,Tahoma,Arial,Helvetica; font-size:9pt}
    .header { font-size: 16pt; font-weight: 900; }
  </style>
</head>
<body topMargin='5'>
<center>
<span class='header'>B1F3A40 Server room temperature (&#0176;C)</span>
<br><br>
END
;
 
if ($name eq '')
{
	print "Daily Graphs (5 minute averages)";
	print "<br>";
 
	foreach $graph (@graphs)
	{
		print "<a href='?trend=$graph'><img src='$imgsrc$graph-day.png' border='0'></a>";
		print "<br>";
	}
}
else
{
	print <<END
Daily Graph (5 minute averages)
<br>
<img src='$imgsrc$name-day.png'>
<br>
Weekly Graph (30 minute averages)
<br>
<img src='$imgsrc$name-week.png'>
<br>
Monthly Graph (2 hour averages)
<br>
<img src='$imgsrc$name-month.png'>
<br>
Yearly Graph (12 hour averages)
<br>
<img src='$imgsrc$name-year.png'>
END
;
}
print <<END
</center>
</body>
</html>
END
;


Пример работающей системы: http://ns.rsu.edu.ru/cgi-bin/upstemp.cgi?trend=UPS_Temperature

Примечания


См. также

Ссылки

Личные инструменты
Пространства имён

Варианты
Действия
Навигация
Инструменты