diff --git a/plugins/other/apache_watch_ b/plugins/other/apache_watch_ new file mode 100755 index 00000000..c4e216c6 --- /dev/null +++ b/plugins/other/apache_watch_ @@ -0,0 +1,126 @@ +#!/usr/bin/perl +# +# Parameters supported: +# +# config +# autoconf +# +# Configurable variables +# +# url - Override default status-url +# +# Must be symlinked to what the graph should monitor. Run with --suggest +# to see valid targets - or just run munin-node-configure --shell +# +# Written by Bjørn Ruberg 2006-2007 +# +# Magic markers: +#%# family=auto +#%# capabilities=autoconf suggest + +my $ret = undef; +if (!eval "require LWP::UserAgent;") { + $ret = "LWP::UserAgent not found"; +} + +# watch-list exists on localhost +# watch-info does not + +my %plugs = ( + 'bytes' => 'Input/output (bytes)', + 'requests' => 'Requests', + 'documents' => 'Documents served', + ); + +my $URL = exists $ENV{'url'} ? $ENV{'url'} : "http://localhost:%d/watch-list"; +my @PORTS = exists $ENV{'ports'} ? split(' ', $ENV{'ports'}) : (80); +my $type = "throughput"; + +if (exists $ARGV[0] and $ARGV[0] eq "autoconf") { + if ($ret) { + print "no ($ret)\n"; + exit 1; + } + my $ua = LWP::UserAgent->new (timeout => 30); + my @badports; + + foreach my $port (@PORTS) { + my $url = sprintf $URL, $port; + my $response = $ua->request (HTTP::Request->new('GET', $url)); + push @badports, $port unless $response->is_success; + } + + if (@badports) { + print "no (no mod_watch exists on ports @badports)\n"; + exit 1; + } else { + print "yes\n"; + exit 0; + } +} + +if (exists $ARGV[0] and $ARGV[0] eq "suggest") { + while (my ($key, undef) = each %plugs) { + print "$key\n"; + } + exit 0; +} + +my @servers = (); +my @data; +foreach my $port (@PORTS) { + my $ua = LWP::UserAgent->new (timeout => 30); + my $url = sprintf $URL, $port; + my $response = $ua->request (HTTP::Request->new ('GET', $url)); + foreach my $string (split (/\n/, $response->content)) { + my ($server, undef, $ifInOctets, $ifOutOctets, $ifRequests, + $ifDocuments) = split (/\s/, $string, 6); + push @servers, $server unless $server eq "SERVER"; + push @data, "$server $ifInOctets $ifOutOctets $ifRequests $ifDocuments" + unless $server eq "SERVER"; + } +} + +# From here and out, the plugin must be run with a symlinked service. +my $check = join ("|", keys %plugs); +die ("Plugin must be symlinked to aspect to be monitored") + unless $0 =~ /\_($check)$/; + +my $action = $1; + +if (exists $ARGV[0] and $ARGV[0] eq "config") { + print "graph_title Apache $plugs{$action}\n"; + print "graph_args --base 1000 -l 0\n"; + print "graph_category apache\n"; + print "graph_vlabel activity\n"; + my $i = 0; + foreach my $server (sort (@servers)) { + (my $txtserver = $server) =~ s/(-|\.)/\_/g; + my $draw = ($i==0) ? 'AREA' : 'STACK'; + if ($action eq "bytes") { + print "${txtserver}.label $server\n"; + print "${txtserver}.draw $draw\n"; + print "${txtserver}.type COUNTER\n"; + } else { + print "${txtserver}.label $server\n"; + print "${txtserver}.draw $draw\n"; + print "${txtserver}.type COUNTER\n"; + } + $i++; + } + exit 0; +} + +foreach my $string (sort (@data)) { + my ($server, $ifInOctets, $ifOutOctets, $ifRequests, $ifDocuments) = + split (/\s/, $string); + (my $txtserver = $server) =~ s/(-|\.)/\_/g; + if ($action eq "documents") { + print "${txtserver}.value $ifDocuments\n"; + } elsif ($action eq "requests") { + print "${txtserver}.value $ifRequests\n"; + } elsif ($action eq "bytes") { + print "${txtserver}.value " . ($ifInOctets + $ifOutOctets) . "\n"; + } +} +