File: [local] / nagios / check_rrd / bin / average_rrd (download)
Revision 1.2, Mon May 8 22:22:19 2006 UTC (18 years, 4 months ago) by andrew
Branch: MAIN
Changes since 1.1: +10 -1 lines
Add collection of max and min values
|
#!/usr/bin/perl -T
# $RedRiver: average_rrd,v 1.1 2006/05/08 19:52:53 andrew Exp $
use strict;
use warnings;
use RRDs;
#use Data::Dumper;
use constant VERBOSE => 0;
my $file = shift || '/var/www/wstationinfo/rrlhcwap3056/rrlhcwap3056-id_6-RSSI.rrd';
my %TIMES = (
FIVE_MINUTES => 5 * 60,
ONE_HOUR => 1 * 60 * 60,
ONE_DAY => 1 * 24 * 60 * 60,
);
my $info = RRDs::info($file);
#print Dumper $info;
#exit;
my $resolution = $info->{'step'};
my $last = $info->{'last_update'};
my $end = int($last / $resolution) * $resolution;
my $start = int( ($end - $TIMES{'ONE_DAY'}) / $resolution) * $resolution;
my ($first, $step, $names, $data) = RRDs::fetch(
$file,
'AVERAGE',
'-r', $resolution,
'-s', $start,
'-e', $end
);
#print Dumper $first, $step, $names, $data;
#exit;
if (VERBOSE) {
print "Last: ", scalar localtime($last), " ($last)\n";
print "Start: ", scalar localtime($start), " ($start)\n";
print "End: ", scalar localtime($end), " ($end)\n";
print "First: ", scalar localtime($first), " ($first)\n";
print "Step size: $step seconds\n";
print "DS names: ", join (", ", @$names)."\n";
print "Data points: ", $#$data + 1, "\n";
print "Data:\n";
}
my %totals;
foreach my $line (@$data) {
print " ", scalar localtime($start), " ($start) " if VERBOSE;
foreach my $i (0 .. $#{ $line }) {
printf "%12.1f ", $line->[$i] if VERBOSE;
next unless defined $line->[$i];
foreach my $key (keys %TIMES) {
if ($end - $TIMES{$key} < $start) {
foreach ('max', 'min') {
$totals{ $names->[$i] }{$key}{$_} = $line->[$i]
unless defined $totals{ $names->[$i] }{$key}{$_};
}
no warnings q/uninitialized/;
$totals{ $names->[$i] }{$key}{'count'}++;
$totals{ $names->[$i] }{$key}{'total'} += $line->[$i];
$totals{ $names->[$i] }{$key}{'max'} = $line->[$i]
if $totals{ $names->[$i] }{$key}{'max'} < $line->[$i];
$totals{ $names->[$i] }{$key}{'min'} = $line->[$i]
if $totals{ $names->[$i] }{$key}{'min'} > $line->[$i];
}
}
}
print "\n" if VERBOSE;
$start += $step;
}
foreach my $key (keys %totals) {
foreach my $length (keys %{ $totals{$key} }) {
$totals{$key}{$length}{'average'} =
$totals{$key}{$length}{'total'} /
$totals{$key}{$length}{'count'}
if $totals{$key}{$length}{'count'};
}
}
foreach my $key (keys %totals) {
print $key, ": ";
print join ", ",
$totals{$key}{'FIVE_MINUTES'}{'average'},
$totals{$key}{'ONE_HOUR'}{'average'},
$totals{$key}{'ONE_DAY'}{'average'};
print "\n";
}
#print Dumper \%totals;