summaryrefslogtreecommitdiffstats
path: root/lib/Smokeping
diff options
context:
space:
mode:
authorTobi Oetiker <tobi@oetiker.ch>2007-01-15 17:25:13 +0100
committerTobi Oetiker <tobi@oetiker.ch>2007-01-15 17:25:13 +0100
commit7ec773d7d21690744619f364855dd02e04949d4d (patch)
tree497a14e356960d391ee819baca15b95d79f7c4e3 /lib/Smokeping
parentc13a80d2aa273f42d6c3f67f384ed3c7fd1d969a (diff)
downloadsmokeping-7ec773d7d21690744619f364855dd02e04949d4d.tar.gz
smokeping-7ec773d7d21690744619f364855dd02e04949d4d.tar.xz
smokeping charts added -- first drop
Diffstat (limited to 'lib/Smokeping')
-rw-r--r--lib/Smokeping/probes/FPing.pm2
-rw-r--r--lib/Smokeping/sorters/Loss.pm82
-rw-r--r--lib/Smokeping/sorters/Max.pm81
-rw-r--r--lib/Smokeping/sorters/Median.pm83
-rw-r--r--lib/Smokeping/sorters/StdDev.pm92
-rw-r--r--lib/Smokeping/sorters/base.pm149
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