diff --git a/plugins/apache/apache_average_requests b/plugins/apache/apache_average_requests deleted file mode 100755 index e61eb6f9..00000000 --- a/plugins/apache/apache_average_requests +++ /dev/null @@ -1,128 +0,0 @@ -#!/usr/bin/perl -# -*- cperl -*- - -=head1 NAME - -apache_average_request - Munin plugin to monitor the average request to -Apache servers. It handles a list of ports passed in from a plugin -configuration file. - -=head1 APPLICABLE SYSTEMS - -Apache HTTP servers with C enabled. - -=head1 CONFIGURATION - -Enable stats in apache first!: - - - - SetHandler server-status - AuthUserFile /route/to/auth.file - AuthName Login-Stats - AuthType Basic - require valid-user - - - -And now in munin conf: - -[apache_*] -env.url http://USER:PASS@127.0.0.1/server-status?auto -env.ports 80 - -=head1 AUTHOR - -Ricardo Fraile -Unknown - -=head1 LICENSE - -GPLv2 - -=head1 MAGIC MARKERS - - #%# family=auto - #%# capabilities=autoconf - -=cut - -use strict; -use warnings; -use Munin::Plugin; - -my $ret = undef; - -if (! eval "require LWP::UserAgent;") -{ - $ret = "LWP::UserAgent not found"; - if ( ! defined $ARGV[0] ) { - die $ret; - } -} - -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 0; - } - - my $ua = LWP::UserAgent->new(timeout => 30); - - foreach my $port (@PORTS) { - my $url = sprintf $URL, $port; - my $response = $ua->request(HTTP::Request->new('GET',$url)); - if ($response->is_success) { - if ($response->content =~ /^Total Accesses:/im ){ - next; - } - else { - print "no (ExtendedStatus option for apache" - . " mod_status is missing on port $port)\n"; - exit 0; - } - } - elsif ($response->code == 404) { - print "no (apache server-status not found. check if mod_status is enabled)\n"; - exit 0; - } - else { - print "no (Port $port: ". $response->message .")\n"; - exit 0; - } - } - print "yes\n"; - exit 0; -} - -if ( defined $ARGV[0] and $ARGV[0] eq "config" ) -{ - - print "graph_title Average apache request\n"; - print "graph_title Average apache Requests per second\n"; - print "graph_vlabel average reqs/sec\n"; - print "graph_scale no\n"; - print "graph_category apache\n"; - print "request.label Average apache reqs/sec\n"; - exit 0; - -} - -my $ua = LWP::UserAgent->new(timeout => 30); - -foreach my $port (@PORTS) { - my $url = sprintf $URL, $port; - my $response = $ua->request(HTTP::Request->new('GET',$url)); - if ($response->content =~ /^ReqPerSec:\s+(.+)$/im) { - print "request.value $1\n"; - } else { - print "request.value U\n"; - } -} - -# vim:syntax=perl diff --git a/plugins/apache/apache_request_rate b/plugins/apache/apache_request_rate deleted file mode 100755 index 11ec7343..00000000 --- a/plugins/apache/apache_request_rate +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env ruby -require 'rubygems' -require 'json' -require 'open-uri' - -if ARGV.first == 'config' - puts 'graph_category Apache' - puts 'graph_title Requests per second' - puts 'graph_vlabel reqs/sec' - puts 'graph_scale no' - puts 'requests_per_second.label Apache reqs/sec' - exit 0 -end - -STATUS_URL = 'http://localhost/server-status?auto' -TMPFILE = '/tmp/apache-status-monitor' -SECONDS_BEFORE_STALE = 900 - -begin - previous_sample = File.exists?(TMPFILE) ? JSON.parse(File.open(TMPFILE, 'r').read) : {} - output = {} - - apache_status = open(STATUS_URL).read - new_total_requests = apache_status.match(/Total Accesses: (\d+)$/)[1].to_i #subtract one to account for request we just made! - sample_duration = previous_sample['updated_at'] ? Time.now - Time.at(previous_sample['updated_at'].to_i) : nil - - if sample_duration && sample_duration < SECONDS_BEFORE_STALE - output['requests_per_second'] = "%0.2f" % ((new_total_requests - 1 - previous_sample['total_requests'].to_i) / sample_duration.to_f) - else - output = {} - end - - # Write back to tmpfile - new_tmp_data = {'total_requests' => new_total_requests, 'updated_at' => Time.now.to_i} - File.open(TMPFILE, 'w') { |f| f.puts(new_tmp_data.to_json)} - - puts "requests_per_second.value #{output['requests_per_second']}" -rescue Exception => e - puts "Exception: #{e.message}" - exit -1 -end \ No newline at end of file diff --git a/plugins/apache/apache_status b/plugins/apache/apache_status new file mode 100755 index 00000000..b310f0e1 --- /dev/null +++ b/plugins/apache/apache_status @@ -0,0 +1,289 @@ +#!/usr/bin/env perl +# -*- cperl -*- + +=head1 NAME + +apache_status - Munin multigraph plugin to monitor Apache statistics. + +=head1 NOTES + +This plugin will produce multiple graphs showing: + + - the number of accesses to Apache servers; + - the number of apache processes running on the machine; + - the volume of data sent from Apache servers; + - the average requests per second to Apache servers. + +=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_status] + 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_status] + env.url http://munin:spamalot@localhost/server-status?auto + +This will provide for HTTP basic authentication. + +=head1 INTERPRETATION + +=head2 APACHE ACCESES + +The graph shows the number of accesses (pages and other items served) +globally on the Apache server. + +=head2 APACHE PROCESSES + +The graph 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. + +=head2 APACHE VOLUME + +The graph shows the Apache HTTP servers global data volume in +bytes. I.e. how many bytes the server has served. + +If there is a flat ceiling effect on the graph you may have reached +some kind of bandwidth limit on your outgoing connection. + +=head1 MAGIC MARKERS + + #%# family=auto + #%# capabilities=autoconf + +=head1 BUGS + +Does not support digest authentication. + +=head1 AUTHOR + +Rewritten by Diego Elio Pettenò based upon +original apache_accesses, apache_processes and apache_volume plugins +of unknown origin. + +=head1 LICENSE + +GPLv2 + +=cut + +use strict; +use warnings; +use Munin::Plugin; + +my $ret = undef; + +if (! eval "require LWP::UserAgent;") { + $ret = "LWP::UserAgent not found"; + if ( ! defined $ARGV[0] ) { + die $ret; + } +} + +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); +my $UA = LWP::UserAgent->new(timeout => 30, + agent => sprintf("munin/%s (libwww-perl/%s)", $Munin::Common::Defaults::MUNIN_VERSION, $LWP::VERSION)); + +if ( defined $ARGV[0] and $ARGV[0] eq "autoconf" ) { + if ($ret) { + print "no ($ret)\n"; + exit 0; + } + + foreach my $port (@PORTS) { + my $url = sprintf $URL, $port; + my $response = $UA->request(HTTP::Request->new('GET',$url)); + if ($response->is_success) { + if ($response->content =~ /^Total Accesses:/im ) { + next; + } else { + print "no (ExtendedStatus option for apache" + . " mod_status is missing on port $port)\n"; + exit 0; + } + } elsif ($response->code == 404) { + print "no (apache server-status not found. check if mod_status is enabled)\n"; + exit 0; + } else { + print "no (Port $port: ". $response->message .")\n"; + exit 0; + } + } + print "yes\n"; + exit 0; +} + +if ( defined $ARGV[0] and $ARGV[0] eq "config" ) { + print < "multigraph apache_accesses\n", + processes => "multigraph apache_processes\n", + volume => "multigraph apache_volume\n", + average => "multigraph apache_average_requests\n" + ); + +foreach my $port (@PORTS) { + my $url = sprintf $URL, $port; + my $response = $UA->request(HTTP::Request->new('GET',$url)); + + if ($response->content =~ /^Total Accesses:\s+(.+)$/im) { + $multigraphs{accesses} .= "accesses$port.value $1\n"; + } else { + $multigraphs{accesses} .= "accesses$port.value U\n"; + } + + if ($response->content =~ /^Busy(?:Servers|Workers):\s+(.+)$/im) { + $multigraphs{processes} .= "busy$port.value $1\n"; + } else { + $multigraphs{processes} .= "busy$port.value U\n"; + } + if ($response->content =~ /^Idle(?:Servers|Workers):\s+(.+)$/im) { + $multigraphs{processes} .= "idle$port.value $1\n"; + } else { + $multigraphs{processes} .= "idle$port.value U\n"; + } + if ($response->content =~ /^(Scoreboard: .*)$/m) { + my $count = () = $1 =~ /\./g; + $multigraphs{processes} .= "free$port.value $count\n"; + } else { + $multigraphs{processes} .= "free$port.value U\n"; + } + + if ($response->content =~ /^Total kBytes:\s+(.+)$/im) { + $multigraphs{volume} .= "volume$port.value $1\n"; + } else { + $multigraphs{volume} .= "volume$port.value U\n"; + } + + if ($response->content =~ /^ReqPerSec:\s+(.+)$/im) { + $multigraphs{average} .= "average$port.value $1\n"; + } else { + $multigraphs{average} .= "average$port.value U\n"; + } +} + +foreach my $graph (keys %multigraphs) { + print $multigraphs{$graph}; +} + +# vim:syntax=perl