Repository
Munin (2.0)
Last change
2020-04-27
Graph Categories
Family
auto
Capabilities
Language
Perl
License
GPL-2.0-only

apache_accesses

Name

apache_accesses - Munin plugin to monitor the number of accesses to Apache servers. It handles a list of ports passed in from a plugin configuration file.

Applicable Systems

Apache HTTP servers with /server-status enabled.

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 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.

Interpretation

The plugin shows the number of accesses (pages and other items served) globally on the Apache server.

Magic Markers

#%# family=auto
#%# capabilities=autoconf

Bugs

Does not support digest authentication.

Author

Unknown

License

GPLv2

#!@@PERL@@
# -*- cperl -*-

=head1 NAME

apache_accesses - Munin plugin to monitor the number of accesses to
Apache servers. It handles a list of ports passed in from a plugin
configuration file.

=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 number of accesses (pages and other items served)
globally on the Apache server.

=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 accesses\n";
	print "graph_args --base 1000\n";
	print "graph_vlabel accesses / \${graph_period}\n";
	print "graph_category apache\n";
	foreach my $port (@PORTS) {
		print "accesses$port.label port $port\n";
		print "accesses$port.type DERIVE\n";
		print "accesses$port.max 1000000\n";
		print "accesses$port.min 0\n";
		print "accesses$port.info The number of accesses (pages and other items"
		. " served) globally on the Apache server\n";
		print_thresholds("accesses$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 Accesses:\s+(.+)$/im) {
		print "accesses$port.value $1\n";
	} else {
		print "accesses$port.value U\n";
	}
}

# vim:syntax=perl