#!/usr/bin/perl # # Magic markers: #%# family=auto #%# capabilities=autoconf # # Parameters supported: # # config # autoconf =head1 NAME apache_processes - Munin plugin to monitor the number of apache-processes running on the machine. =head1 APPLICABLE SYSTEMS Apache HTTP servers with C enabled. =head1 CONFIGURATION The plugin needs access to http://localhost/server-status?auto (or modify the URL for another host). See your Apache documentation on how to set up this URL in your httpd.conf. Apache needs ExtendedStatus enabled for this plugin to work. Tip: To see if it's already set up correctly, just run this plugin with the parameter "autoconf". If you get a "yes", everything should work like a charm already. This configuration section shows the defaults of the plugin: [apache_*] env.url http://127.0.0.1:%d/server-status?auto env.ports 80 The %d in the url will be replaced with the port. The default port is 80 as shown. The port list is a space separated list of ports. NOTE that one single Apache can have several open ports, and the plugin needs only to contact one to get the servers global status. The list of ports is only needed if you have several B Apaches configured on your host. If you need authenticated access to the URL you can specify the username and password in the URL. For example: [apache_volume] env.url http://munin:spamalot@localhost/server-status?auto This will provide for HTTP basic authentication. =head1 INTERPRETATION The plugin shows the number of Apache processes running on the machine, and in addition separate "busy" and "idle" servers count. If there is a flat ceiling effect on the graph where the number of servers does not increase any more, in spite of no idle servers, then the server has probably reached its C setting. In this case it's very likely that some clients are getting connection refused or some other problem when connecting to your server. In this case increase the C setting. Unless there is also no more free memory. =head1 VERSION $Id: apache_processes.in 1488 2008-02-20 19:11:33Z matthias $ =head1 BUGS Does not support digest authentication. =head1 AUTHOR Unknown =head1 LICENSE GPLv2 =cut my $ret = undef; if (! eval "require LWP::UserAgent;") { $ret = "LWP::UserAgent not found"; } my $URL = exists $ENV{'url'} ? $ENV{'url'} : "http://127.0.0.1:%d/server-status?auto"; my @PORTS = exists $ENV{'ports'} ? split(' ', $ENV{'ports'}) : (80); if ( defined $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 and $response->content =~ /Idle(?:Servers|Workers)/im; } if (@badports) { print "no (no apache server-status on ports @badports)\n"; exit 1; } else { print "yes\n"; exit 0; } } if ( defined $ARGV[0] and $ARGV[0] eq "config" ) { print "graph_title Apache processes\n"; print "graph_args --base 1000 -l 0\n"; print "graph_category apache\n"; print "graph_order "; foreach my $port (@PORTS) { print "busy$port idle$port "; } print "\n"; print "graph_vlabel processes\n"; print "graph_total total\n"; foreach my $port (@PORTS) { print "busy$port.label busy servers $port\n"; if (@PORTS == 1) { print "busy$port.draw AREA\n"; } else { print "busy$port.draw LINE2\n"; } print "idle$port.label idle servers $port\n"; print "idle$port.draw STACK\n"; } exit 0; } 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)); if ($response->content =~ /^Busy(?:Servers|Workers):\s+(.+)$/im) { print "busy$port.value $1\n"; } else { print "busy$port.value U\n"; } if ($response->content =~ /^Idle(?:Servers|Workers):\s+(.+)$/im) { print "idle$port.value $1\n"; } else { print "idle$port.value U\n"; } } # vim:syntax=perl