So I decided to buy one of these network temperature sensors from Papouch here to monitor my 19" rack at home. I wanted to graph the temperature variations from it, as it can get quite hot when all the other servers are on.
Setup Apache with mod_php5 + rrd+ php5_cli
There are many articles on setting up apache + mod_php5 + rrdtools + php5_cli, so i won't bother you with the details here.
Create the RRD
One you've installed rrdtool and php5 cli, create the below file and chmod a+x so that it is executable.
Once run, this will create your RRD to input data called temp.rrd
#!/usr/bin/php
<?
echo "Creates blank temp graphs";
$options = array (
"--step", "60", // Use a step-size of 1 minute
"--start", "-1 day", // this rrd started 6 months ago
"DS:temp:GAUGE:100:U:U",
"RRA:MIN:0.5:60:8800",
"RRA:MAX:0.5:60:8800",
"RRA:AVERAGE:0.5:2:328800",
);
$ret = rrd_create("./temp.rrd", $options);
if (! $ret) {
echo "<b>Creation error: </b>".rrd_error()."\n";
}
?>
Create the graphs
This should be your index.php This should be in your /var/www directory
<?
create_graph_temperature("/var/www/temp-hr.gif","-1h","Hourly temperature");
create_graph_temperature("/var/www/temp-2hr.gif","-2h","Bi-Hourly temperature");
create_graph_temperature("/var/www/temp-daily.gif","-23h","Daily temperature");
create_graph_temperature("/var/www/temp-weekly.gif","-1w","Weekly temperature");
create_graph_temperature("/var/www/temp-monthly.gif","-1m","Monthly temperature");
create_graph_temperature("/var/www/temp-yearly.gif","-1y","Yearly temperature");
function create_graph_temperature ($output, $start, $title)
{
$options = array(
"--slope-mode",
"--start", $start,
"--title=$title",
"--vertical-label=Temperature in oC",
"DEF:temp=/mnt/ramdisk/temp.rrd:temp:AVERAGE",
"CDEF:ttemp=temp,1,*",
"CDEF:ttempq=temp,6,/",
"AREA:ttempq#F31616::STACK",
"AREA:ttempq#F03D11::STACK",
"AREA:ttempq#ED650D::STACK",
"AREA:ttempq#EA8D08::STACK",
"AREA:ttempq#E7B504::STACK",
"AREA:ttempq#E5DD00::STACK",
"COMMENT:\\n",
"GPRINT:temp:MAX:Max temp %6.2lf",
"GPRINT:temp:MIN:Min temp %6.2lf",
"GPRINT:temp:AVERAGE:Avg temp %6.2lf",
);
$ret = rrd_graph($output, $options);
if (! $ret) {
echo "<b>Graph error for temp</b>".rrd_error()."\n";
}
}
?>
<img src=temp-hr.gif><img src=temp-2hr.gif></br>
<img src=temp-daily.gif><img src=temp-weekly.gif></br>
<img src=temp-monthly.gif><img src=temp-yearly.gif></br>
Note:you may need to chgrp www-data and chmod g+w on the /var/www directory, so that apache can write the GIFs to there.
Update data into RRD
Do to this, I wrote a small PHP script
#!/usr/bin/php
<?
// Fetch current time
$t = time();
$filename="/mnt/ramdisk/temp.txt";
$handle = fopen($filename, "r");
$contents = fread($handle, filesize($filename));
fclose ($handle);
$contents=(float)$contents/10;
$option = array ("$t:$contents");
echo "$t ,$contents";
$ret = rrd_update("/mnt/ramdisk/temp.rrd", $option);
if (! $ret) {
mail ("blah@gmail.com","temp insert rrd error","trying to insert temp from temp.txt into temp.rrd");
#echo "<b>Graph error: </b>".rrd_error()."\n";
}
?>
Crontab
I've set up my TME_C on IP address 192.168.2.120
Note I've saved the output to a ramdisk (as my machine boots from a USB key)
crontab -e on root
* * * * * /usr/local/bin/update_temp_script.shNote you should be calling a script which does the update, then inserts it into the RRD in sequence. If you don't it maybe updating the RRD with blank values.
update_temp_script.sh
/usr/bin/curl -s http://192.168.2.120/fresh.xml | grep sns | awk '{print $10}' | cut -d "\"" -f 2 > /mnt/ramdisk/temp.txt
/usr/local/bin/update_temp.phpThat's it - it's that simple.
You should have graphs looking similar to this:
Now you can also setup a daily cron job to tar.gz these files to the local file system instead of leaving it on a ramdisk or what not. If you leave it on the ramdisk, you'll lose it if the server powers it off.
part 2 here
NOTE - Have corrected this as i was only storing about 1/5 of the data, so have upped the data storage points on the RR. This was calculated at one data point every 60 seconds. So 60 seconds in 24 hrs = 1440 points.
Hourly points for a year = 366 *24 = 8784 points. I rounded this to 8800
No comments:
Post a Comment