Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change

Temperature monitoring, again

by bronto (Priest)
on Jan 04, 2005 at 15:49 UTC ( #419271=CUFP: print w/replies, xml ) Need Help??

Same problem again. But this time it was just a bit more complex. This time the platform to be monitored is a Sun Fire 12K. Even for a small configuration like ours, the command showenvironment -p temps returned 198 temperatures from different sensors! Since there are many sensors on the same board, we needed to aggregate the temperatures and report the resulting minimum and maximum.

But wait, there is more :-) showenvironment also returns a status code, that indicates if the parameter is in a safe range or if you should start worrying -or if it wasn't simply possible to read the temperature at all.

So I came out with the following script, that does the job. Luckily Unfortunately I don't know what comes out in case an INVALID status is returned, so I just had to guess. Since we are going to send alerts around if an INVALID pops up, it is not a big problem if it returns crap instead of temperatures, anyway if you know the output format in that case, please send a patch and I'll be happy to apply it!

The code reads the output of showenvironment -p temps from standard input and outputs in a format suitable for the monitoring tool we currently use. The code could be neither beautiful nor elegant, but I wrote it in a very short time. Feel free to improve it and publish your improvements on PM!

Enough talking, here is the code!

#!/usr/local/bin/perl # $Id:,v 1.1 2005/01/04 15:32:50 bronto Exp bronto $ use strict ; use warnings ; my %locations ; my %levels = ( OK => 0, LOW_WARN => 10, HIGH_WARN => 10, LOW_CRIT => 20, HIGH_CRIT => 20, OVERLIMIT => 100, INVALID => 500, ) ; while (<>) { my ($location,$device,$sensor,$value,$age,$status) = /^(\S+ at \S+)\s+(\S+)\s+(\S+) Temp\s+(\S+)\s+C\s+(\S+)\s+sec\s+(\ +S+)/ ; unless (defined $location or defined $value or defined $status) { next ; } unless (exists $locations{$location}) { $locations{$location}{min} = $value ; $locations{$location}{max} = $value ; $locations{$location}{status} = $status ; } unless ($status eq 'INVALID') { $locations{$location}{min} = $value if $locations{$location}{min} > $value ; $locations{$location}{max} = $value if $locations{$location}{max} < $value ; } if ($levels{$status} > $levels{$locations{$location}{status}}) { $locations{$location}{status} = $status ; } } print "TABLE temperature\nSTART_SAMPLE_PERIOD\n" ; my @samples ; foreach my $loc (sort keys %locations) { push @samples,"location=$loc\nmin=$locations{$loc}{min}\nmax=$locati +ons{$loc}{max}\nstatus=$locations{$loc}{status}\n" ; } print join ("NEXT_SAMPLE\n",@samples),"END_SAMPLE_PERIOD\nEND_TABLE\nS +LEEP\n" ;


In theory, there is no difference between theory and practice. In practice, there is.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: CUFP [id://419271]
Approved by Limbic~Region
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others taking refuge in the Monastery: (6)
As of 2017-02-25 13:46 GMT
Find Nodes?
    Voting Booth?
    Before electricity was invented, what was the Electric Eel called?

    Results (365 votes). Check out past polls.