diff options
author | Tobi Oetiker <tobi@oetiker.ch> | 2007-01-15 17:25:13 +0100 |
---|---|---|
committer | Tobi Oetiker <tobi@oetiker.ch> | 2007-01-15 17:25:13 +0100 |
commit | 7ec773d7d21690744619f364855dd02e04949d4d (patch) | |
tree | 497a14e356960d391ee819baca15b95d79f7c4e3 /lib/Smokeping | |
parent | c13a80d2aa273f42d6c3f67f384ed3c7fd1d969a (diff) | |
download | smokeping-7ec773d7d21690744619f364855dd02e04949d4d.tar.gz smokeping-7ec773d7d21690744619f364855dd02e04949d4d.tar.xz |
smokeping charts added -- first drop
Diffstat (limited to 'lib/Smokeping')
-rw-r--r-- | lib/Smokeping/probes/FPing.pm | 2 | ||||
-rw-r--r-- | lib/Smokeping/sorters/Loss.pm | 82 | ||||
-rw-r--r-- | lib/Smokeping/sorters/Max.pm | 81 | ||||
-rw-r--r-- | lib/Smokeping/sorters/Median.pm | 83 | ||||
-rw-r--r-- | lib/Smokeping/sorters/StdDev.pm | 92 | ||||
-rw-r--r-- | lib/Smokeping/sorters/base.pm | 149 |
6 files changed, 488 insertions, 1 deletions
diff --git a/lib/Smokeping/probes/FPing.pm b/lib/Smokeping/probes/FPing.pm index c3f76fc..a8035d6 100644 --- a/lib/Smokeping/probes/FPing.pm +++ b/lib/Smokeping/probes/FPing.pm @@ -60,7 +60,7 @@ sub new($$$) my $testhost = $self->testhost; my $return = `$binary -C 1 $testhost 2>&1`; $self->{enable}{S} = (`$binary -h 2>&1` =~ /\s-S\s/); - carp "NOTE: your fping binary doesn't support source address setting (-S), I will ignore any sourceaddress configurations - see http://bugs.debian.org/198486.\n" if !$self->{enable}{S}; + warn "NOTE: your fping binary doesn't support source address setting (-S), I will ignore any sourceaddress configurations - see http://bugs.debian.org/198486.\n" if !$self->{enable}{S}; croak "ERROR: fping ('$binary -C 1 $testhost') could not be run: $return" if $return =~ m/not found/; croak "ERROR: FPing must be installed setuid root or it will not work\n" diff --git a/lib/Smokeping/sorters/Loss.pm b/lib/Smokeping/sorters/Loss.pm new file mode 100644 index 0000000..427d8cb --- /dev/null +++ b/lib/Smokeping/sorters/Loss.pm @@ -0,0 +1,82 @@ +package Smokeping::sorters::Loss; + +=head1 NAME + +Smokeping::sorters::Loss - Order the target charts by loss + +=head1 OVERVIEW + +Find the charts with the highest loss. + +=head1 DESCRIPTION + +Call the sorter in the charts section of the config file + + + charts + menu = Charts + title = The most interesting destinations + + ++ loss + sorter = Loss(entries=>10) + title = The Loosers + menu = Loss + format = Packets Lost %f + +=head1 COPYRIGHT + +Copyright (c) 2007 by OETIKER+PARTNER AG. All rights reserved. + +=head1 LICENSE + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +=head1 AUTHOR + +Tobias Oetiker <tobi@oetiker.ch> + +=cut + +use strict; +use base qw(Smokeping::sorters::base); +use vars qw($VERSION); +$VERSION = 1.0; +use Carp; + +# how many values does the matcher need to do it's magic + +sub new(@) { + my $class = shift; + my $rules = { + entries => '\d+' + }; + my $self = $class->SUPER::new( $rules, @_ ); + return $self; +} + +sub Desc ($) { + return "The Median sorter sorts the targets by Median RTT."; +} + +sub CalcValue($) { + my $self = shift; + my $info = shift; + # $info = { uptime => w, + # loss => x, + # median => y, + # alert => z, (0/1) + # pings => [qw(a b c d)] + # + return $info->{loss} ? $info->{loss} : -1; +} diff --git a/lib/Smokeping/sorters/Max.pm b/lib/Smokeping/sorters/Max.pm new file mode 100644 index 0000000..a0b5dae --- /dev/null +++ b/lib/Smokeping/sorters/Max.pm @@ -0,0 +1,81 @@ +package Smokeping::sorters::Max; + +=head1 NAME + +Smokeping::sorters::Max - Order the target charts by Max RTT + +=head1 OVERVIEW + +Find the charts with the highest round trip time. + +=head1 DESCRIPTION + +Call the sorter in the charts section of the config file + + + charts + menu = Charts + title = The most interesting destinations + + ++ max + sorter = Max(entries=>10) + title = Sorted by Max Roundtrip Time + menu = by Max + format = Max Roundtrip Time %f seconds + +=head1 COPYRIGHT + +Copyright (c) 2007 by OETIKER+PARTNER AG. All rights reserved. + +=head1 LICENSE + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +=head1 AUTHOR + +Tobias Oetiker <tobi@oetiker.ch> + +=cut + +use strict; +use base qw(Smokeping::sorters::base); +use vars qw($VERSION); +$VERSION = 1.0; +use Carp; + +sub new(@) { + my $class = shift; + my $rules = { + entries => '\d+' + }; + my $self = $class->SUPER::new( $rules, @_ ); + return $self; +} + +sub Desc ($) { + return "The Max sorter sorts the targets by Max RTT."; +} + +sub CalcValue($) { + my $self = shift; + my $info = shift; + # $info = { uptime => w, + # loss => x, + # median => y, + # alert => z, (0/1) + # pings => [qw(a b c d)] + # + my $max = (sort { $b <=> $a } grep { defined $_ } @{$info->{pings}})[0]; + return $max ? $max : -1; +} diff --git a/lib/Smokeping/sorters/Median.pm b/lib/Smokeping/sorters/Median.pm new file mode 100644 index 0000000..0657e12 --- /dev/null +++ b/lib/Smokeping/sorters/Median.pm @@ -0,0 +1,83 @@ +package Smokeping::sorters::Median; + +=head1 NAME + +Smokeping::sorters::Median - Order the target charts by Median RTT + +=head1 OVERVIEW + +Find the charts with the highest Median round trip time. + +=head1 DESCRIPTION + +Call the sorter in the charts section of the config file + + + charts + menu = Charts + title = The most interesting destinations + + ++ median + sorter = Median(entries=>10) + title = Top Median round trip time + menu = Median RTT + format = Median round trip time %f seconds + + +=head1 COPYRIGHT + +Copyright (c) 2007 by OETIKER+PARTNER AG. All rights reserved. + +=head1 LICENSE + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +=head1 AUTHOR + +Tobias Oetiker <tobi@oetiker.ch> + +=cut + +use strict; +use base qw(Smokeping::sorters::base); +use vars qw($VERSION); +$VERSION = 1.0; +use Carp; + +# how many values does the matcher need to do it's magic + +sub new(@) { + my $class = shift; + my $rules = { + entries => '\d+' + }; + my $self = $class->SUPER::new( $rules, @_ ); + return $self; +} + +sub Desc ($) { + return "The Median sorter sorts the targets by Median RTT."; +} + +sub CalcValue($) { + my $self = shift; + my $info = shift; + # $info = { uptime => w, + # loss => x, + # median => y, + # alert => z, (0/1) + # pings => [qw(a b c d)] + # + return $info->{median} ? $info->{median} : -1; +} diff --git a/lib/Smokeping/sorters/StdDev.pm b/lib/Smokeping/sorters/StdDev.pm new file mode 100644 index 0000000..fc97446 --- /dev/null +++ b/lib/Smokeping/sorters/StdDev.pm @@ -0,0 +1,92 @@ +package Smokeping::sorters::StdDev; + +=head1 NAME + +Smokeping::sorters::StdDev - Order the target charts by StdDev + +=head1 OVERVIEW + +Find the charts with the highest standard deviation among the Pings sent to +a single target. The more smoke - higher the standard deviation. + +=head1 DESCRIPTION + +Call the sorter in the charts section of the config file + + + charts + menu = Charts + title = The most interesting destinations + + ++ stddev + sorter = StdDev(entries=>4) + title = Top StdDev + menu = Std Deviation + format = Stdandard Deviation %f + +=head1 COPYRIGHT + +Copyright (c) 2007 by OETIKER+PARTNER AG. All rights reserved. + +=head1 LICENSE + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +=head1 AUTHOR + +Tobias Oetiker <tobi@oetiker.ch> + +=cut + +use strict; +use base qw(Smokeping::sorters::base); +use vars qw($VERSION); +$VERSION = 1.0; +use Carp; + +# how many values does the matcher need to do it's magic + +sub new(@) { + my $class = shift; + my $rules = { + entries => '\d+' + }; + my $self = $class->SUPER::new( $rules, @_ ); + return $self; +} + +sub Desc ($) { + return "The Standard Deviation sorter sorts the targets by Standard Deviation."; +} + +sub CalcValue($) { + my $self = shift; + my $info = shift; + # $info = { uptime => w, + # loss => x, + # median => y, + # alert => z, (0/1) + # pings => [qw(a b c d)] + # + my $avg = 0; + my $cnt = 0; + my @values = grep { defined $_ } @{$info->{pings}}; + for (@values){ $avg += $_; $cnt++}; + return -1 if $cnt == 0; + $avg = $avg / $cnt; + my $dev = 0; + for (@values){ $dev += ($_ - $avg)**2}; + $dev = sqrt($dev / $cnt); + return $dev; +} diff --git a/lib/Smokeping/sorters/base.pm b/lib/Smokeping/sorters/base.pm new file mode 100644 index 0000000..73d9551 --- /dev/null +++ b/lib/Smokeping/sorters/base.pm @@ -0,0 +1,149 @@ +package Smokeping::sorters::base; + +=head1 NAME + +Smokeping::sorters::base - Base Class for implementing SmokePing Sorters + +=head1 OVERVIEW + +Sorters are at the core of the SmokePing Charts feature, where the most +interesting graphs are presented on a single page. The Sorter decides which +graphs are considerd interesting. + +Every sorter must inherit from the base class and provide it's own +methods for the 'business' logic. + +In order to maintain a decent performance the sorters activity is split into +two parts. + +The first part is active while the smokeping daemon gathers its data. +Whenever data is received, the sorter is called to calculate a 'value' for +the present data. On every 'query round' this information is stored in the +sorter store directory. Each smokeping process stores it's own information. +Since smokeping can run in multiple instances at the same time, the data may +be split over several files + +The second part of the sorter is called from smokeping.cgi. It loads all the +information from the sorter store and integrates it into a single 'tree'. It +then calls each sorter with the pre-calculated data to get it sorted and to +and to select the interesting information. + +=head1 DESCRIPTION + +Every sorter must provide the following methods: + +=cut + +use vars qw($VERSION); +use Carp; + +$VERSION = 1.0; + +use strict; + +=head2 new + +The new method expects hash elements as an argument +eg new({x=>'\d+',y=>'\d+'},x=>1,y=>2). The first part is +a syntax rule for the arguments it should expect and the second part +are the arguments itself. The first part will be supplied +by the child class as it calls the parent method. + +=cut + +sub new(@) +{ + my $this = shift; + my $class = ref($this) || $this; + my $rules = shift; + my $self = { param => { @_ } }; + foreach my $key (keys %{$self->{param}}){ + my $regex = $rules->{$key}; + croak "key '$key' is not known by this sorter" unless defined $rules->{$key}; + croak "key '$key' contains invalid data: '$self->{param}{$key}'" unless $self->{param}{$key} =~ m/^$regex$/; + } + bless $self, $class; + return $self; +} + +=head2 Desc + +Simply return the description of the function. This method must +be overwritten by a children of the base class. + +=cut + +sub Desc ($) { + croak "Sorter::Desc must be overridden by the subclass"; +} + +=head2 SortTree + +Returns an array of 'targets'. It is up to the sorter to decide how many +entries the list should contain. If the list is empty, the whole entry will +be supressed in the webfrontend. + +The methode gets access to all the targets in the system, together with the +last data set acquired for each target. + +=cut + +sub SortTree($$) { + my $self = shift; + my $target = shift @{$self->{targets}}; + my $cache = shift; + my $entries = $self->{param}{entries} || 3; + my $sorted = [ + map { $entries-- > 0 ? { open => [ split '/', $_ ], value => $cache->{$_} } : () } + sort { $cache->{$b} <=> $cache->{$a} } keys %$cache ]; + return $sorted; +} + +=head2 CalcValues + +Figure out the curent sorting value using te following input. + + $info = { uptime => w, + loss => x, + median => y, + alert => z, # (0/1) + pings => [qw(a b c d)] } + +The output can have any structure you want. It will be returned to the +sorter method for further processng. + +=cut + +sub CalcValue($) { + my $self = shift; + my $info = shift; + croak "CalcValue must be overridden by the subclass"; + return ( { any=>'structure' } ); +} + + +=head1 COPYRIGHT + +Copyright (c) 2007 by OETIKER+PARTNER AG. All rights reserved. + +=head1 LICENSE + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +=head1 AUTHOR + +Tobias Oetiker <tobi@oetiker.ch> + +=cut |