1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178
|
#!@@PERL@@
# -*- cperl -*-
=head1 NAME
apache_volume - Munin plugin to monitor the volume of data sent from Apache servers.
=head1 APPLICABLE SYSTEMS
Apache HTTP servers with C</server-status> 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<different> 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.
It is possible to use HTTPS for accessing the server. You just need to
make sure, that the server certificate is valid (i.e. it is signed by
a locally known CA and it matches the hostname in the URL).
If you really need to connect to an HTTPS URL without a valid
certificate (as described above), then you should try to set one of
the following environment settings in the munin-node plugin
configuration:
env.PERL_LWP_SSL_VERIFY_HOSTNAME 0
env.HTTPS_CA_FILE /etc/ssl/acme-ca.pem
env.HTTPS_CA_DIR /etc/acme-ca-certs/
See https://metacpan.org/pod/LWP::UserAgent for more details.
=head1 INTERPRETATION
The plugin 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
Unknown
=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);
# Convert an URL with the %d placeholder into a string. Allow URL without placeholder.
sub get_url_with_port {
my ($url, $port) = @_;
return ($url =~ /%d/) ? sprintf($url, $port) : $url;
}
if ( defined $ARGV[0] and $ARGV[0] eq "autoconf" )
{
if ($ret)
{
print "no ($ret)\n";
exit 0;
}
my $ua = LWP::UserAgent->new(timeout => 30,
agent => sprintf("munin/%s (libwww-perl/%s)", $Munin::Common::Defaults::MUNIN_VERSION, $LWP::VERSION));
foreach my $port (@PORTS) {
my $url = get_url_with_port($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 Apache volume\n";
print "graph_args --base 1000\n";
print "graph_vlabel bytes per \${graph_period}\n";
print "graph_category apache\n";
foreach my $port (@PORTS) {
print "volume$port.label port $port\n";
print "volume$port.type DERIVE\n";
print "volume$port.max 1000000000\n";
print "volume$port.min 0\n";
print_thresholds("volume$port");
}
exit 0;
}
my $ua = LWP::UserAgent->new(timeout => 30,
agent => sprintf("munin/%s (libwww-perl/%s)", $Munin::Common::Defaults::MUNIN_VERSION, $LWP::VERSION));
foreach my $port (@PORTS) {
my $url = get_url_with_port($URL, $port);
my $response = $ua->request(HTTP::Request->new('GET',$url));
if ($response->content =~ /^Total kBytes:\s+(.+)$/im) {
print "volume$port.value ", int($1*1024), "\n";
} else {
print "volume$port.value U\n";
}
}
# vim:syntax=perl
|