#!/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 0; } 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 0; } 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 webserver\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"; } }