check_apache.pl and apache2
Ben O'Hara
bohara at gmail.com
Wed Mar 15 15:21:55 CET 2006
Cheers Ulrich,
That seems to work a treat for what im trying to check
Ben
On 3/15/06, Ulrich Wisser <liste at publisher.de> wrote:
>
> Hi,
>
> but this is performance check only, no load check.
>
> Ulrich
>
>
> #!/usr/bin/perl
> #
> # (c) 2006 Ulrich Wisser, Relevant Traffic AB
> # ulrich.wisser at relevanttraffic.com
> #
> # Derived work from:
> #
> # (c)2001 Sebastian Hetze, Linux Information Systems AG
> # send bug reports to <S.Hetze at Linux-AG.com>
> #
> # Some fixes by Rob.
> #
> # This program is free software; you can redistribute it and/or
> # modify it under the terms of the GNU General Public License
> # as published by the Free Software Foundation; version 2
> # of the License
> #
> # This program is distributed in the hope that it will be useful,
> # but WITHOUT ANY WARRANTY; without even the implied warranty
> # of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> # GNU General Public License for more details.
> #
> # you should have received a copy of the GNU General Public License
> # along with this program (or with Nagios); if not, write to the
> # Free Software Foundation, Inc., 59 Temple Place - Suite 330,
> # Boston, MA 02111-1307, USA
> #
> #
> # Check apache status information provided by mod_status to find
> # out about the load (number of servers working) and the
> # performance (average response time for recent requests).
> #
> use strict;
> use LWP::UserAgent;
> use URI::URL;
> use Getopt::Long;
> Getopt::Long::Configure('bundling');
> use vars qw($VERSION);
>
> $VERSION=0.01;
>
> my %ERRORS = ('UNKNOWN' , '-1',
> 'OK' , '0',
> 'WARNING', '1',
> 'CRITICAL', '2');
> #
> # global default values
> #
> my $perf_w=500;
> my $perf_c=1000;
> my $load_w=80;
> my $load_c=100;
> my $timeout=15;
> my $autostring="?auto";
> #
> # get command line options the regular way
> #
> my ($opt_V, $opt_h, $opt_l, $opt_w, $opt_c, $opt_H, $opt_u, $verbose);
> GetOptions(
> "V" => \$opt_V, "version" => \$opt_V,
> "h" => \$opt_h, "help" => \$opt_h,
> "v" => \$verbose, "verbose" => \$verbose,
> "w=s" => \$opt_w, "warning=s" => \$opt_w,
> "c=s" => \$opt_c, "critical=s" => \$opt_c,
> "H=s" => \$opt_H, "hostname=s" => \$opt_H,
> "u=s" => \$opt_u, "url=s" => \$opt_u
> );
>
> #
> # handle the verbose stuff first
> #
> if ($opt_V) {
> print "\n";
> print "check_apache_perf nagios plugin version $VERSION\n";
> print "\n";
> print "The nagios plugins come with ABSOLUTELY NO WARRANTY. You may
> redistribute\n";
> print "copies of the plugins under the terms of the GNU General Public
> License.\n";
> print "For more information about these matters, see the file named
> COPYING.\n";
> print "\n";
> exit $ERRORS{'UNKNOWN'};
> }
>
> if ($opt_h) {
> print_help();
> exit $ERRORS{'UNKNOWN'};
> }
>
> #
> # now get options the weired way and set the defaults
> # if nothing else is provided
> #
> if (!$opt_H) {print_usage(); exit $ERRORS{'UNKNOWN'}; };
> if (!$opt_u) {print_usage(); exit $ERRORS{'UNKNOWN'}; };
> my $warn = $1 if ($opt_w =~ /([0-9]+)/);
> my $alert = $1 if ($opt_c =~ /([0-9]+)/);
> if (!$warn) {print_usage(); exit $ERRORS{'UNKNOWN'}; };
> if (!$alert) {print_usage(); exit $ERRORS{'UNKNOWN'}; };
>
>
>
> #
> # dont let us wait forever...
> #
> $SIG{'ALRM'} = sub {
> print ("ERROR: No response from HTTP server (alarm)n");
> exit $ERRORS{"UNKNOWN"};
> };
> alarm($timeout);
> #
> # now we set things up for the real work
> # and fire up the request
> #
> my $ua = new LWP::UserAgent;
> my $url = url("http://" . $opt_H . $opt_u . $autostring);
> my $req = new HTTP::Request 'GET', $url;
> my $res = $ua->request($req);
> #
> # hopefully we´ve got something usefull
> #
> if ($res->is_success) {
> my ($accesses, $kbytes, $load, $uptime, $rps, $bps, $bpr, $busy,
> $idle, $performance, $score);
> $performance = "| ";
> foreach $_ (split /^/m, $res->content) {
> next if /^s*$/;
> #
> # this is the load checking section
> # we parse the whole content, just in case someone
> # wants to use this some day in the future
> #
> if (/^Total Accesses:\s+([0-9.]+)/) { $accesses =
> $1; $performance .= "totalaccess=$accesses "; next; }
> if (/^Total kBytes:\s+([0-9.]+)/) { $kbytes =
> $1; $performance .= "totalkB=".$kbytes." "; next; }
> if (/^CPULoad:\s+([0-9.]+)\s+/) { $load =
> $1; $performance .= "CPUload=".$load." "; next; }
> if (/^CPULoad:\s+[0-9.]+e/) { $load = 'E';
> $performance .= "CPUload=E "; next; }
> if (/^Uptime:\s+([0-9.]+)\s+/) { $uptime =
> $1; $performance .= "Uptime=$uptime "; next; }
> if (/^ReqPerSec:\s+([0-9.]+)\s+/) { $rps =
> $1; $performance .= "ReqPerSec=".$rps." "; next; }
> if (/^ReqPerSec:\s+[0-9.]+e/) { $rps = 'E';
> $performance .= "ReqPerSec=E "; next; }
> if (/^BytesPerSec:\s+([0-9.]+)\s+/) { $bps =
> $1; $performance .= "kBytesPerSec=".($bps/1024)." "; next; }
> if (/^BytesPerSec:\s+[0-9.]+e/) { $bps = 'E';
> $performance .= "kBytesPerSec=E "; next; }
> if (/^BytesPerReq:\s+([0-9.]+)\s+/) { $bpr =
> $1; $performance .= "kBytesPerReq=".($bpr/1024)." "; next; }
> if (/^ReqPerSec:\s+[0-9.]+e/) { $bpr = 'E';
> $performance .= "kBytesPerReq=E "; next; }
> if (/^BusyServers:\s+([0-9.]+)\s+/) { $busy =
> $1; $performance .= "BusyServers=".$busy." "; next; }
> if (/^BusyWorkers:\s+([0-9.]+)\s+/) { $busy =
> $1; $performance .= "BusyServers=".$busy." "; next; }
> if (/^IdleServers:\s+([0-9.]+)\s+/) { $idle =
> $1; $performance .= "IdleServers=".$idle." "; next; }
> if (/^IdleWorkers:\s+([0-9.]+)\s+/) { $idle =
> $1; $performance .= "IdleServers=".$idle." "; next; }
> if (/^Scoreboard:\s+([CSRWKDLG_.]+)\s+/) { $score =
> $1; next; }
> print "Unknown Status: $_\n";
> }
> #
> # now we even parse the whole scoreboard, just for fun
> #
> my %scores;
> $scores{'.'} = 0; # Unused
> $scores{'_'} = 0; # Waiting
> $scores{'S'} = 0; # Starting
> $scores{'R'} = 0; # Reading
> $scores{'W'} = 0; # Writing
> $scores{'K'} = 0; # Keepalive
> $scores{'D'} = 0; # DNS Lookup
> $scores{'L'} = 0; # Logging
> $scores{'G'} = 0; # Going
> $scores{'C'} = 0; # Closing
> foreach my $scorepoint (split //m, $score) { $scores{$scorepoint} +=
> 1; }
> $performance .= "unused=$scores{'.'} wait=$scores{'_'}
> start=$scores{'S'} read=$scores{'R'} write=$scores{'W'}
> keepalive=$scores{'K'} dns=$scores{'D'} log=$scores{'L'} go=$scores{'G'}
> close=$scores{'C'}";
> #
> # compute return code
> #
> my $status = 'OK';
> $status = 'WARNING' if($busy > $warn);
> $status = 'CRITICAL' if($busy > $alert);
> print "HTTPD $status: servers running $busy, idle $idle
> $performance\n";
> exit $ERRORS{$status};
> } else {
> print "HTTP request failed\n";
> exit $ERRORS{"CRITICAL"};
> }
> #
> # ok, now we are almost through
> # These last subroutines do the things for those that do not
> # read source code.
> #
> sub print_usage () {
> print "Usage: $0 [-hV] -H <host> -u <url> -w <warn> -c <crit>\n";
> }
>
> sub print_help () {
> print "\n";
> print "\n";
> print "check_apache nagios plugin version $VERSION\n";
> print "\n";
> print "The nagios plugins come with ABSOLUTELY NO WARRANTY. You may
> redistribute\n";
> print "copies of the plugins under the terms of the GNU General Public
> License.\n";
> print "For more information about these matters, see the file named
> COPYING.\n";
> print "\n";
> print "Copyright (c) 2001 Sebastian Hetze Linux Information Systems
> AG\n";
> print "\n";
> print "\n";
> print "This plugin checks the apache HTTP service on the specified
> host.\n";
> print "It uses the mod_status facilities provided by the apache
> server.\n";
> print "The monitoring server must be authorized in httpd.conf.\n";
> print "\n";
> print "\n";
> print_usage();
> print "\n";
> print "Options:\n";
> print " -c, --critical=INTEGER\n";
> print " performance level at which a critical message will be
> gererated.\n";
> print " -H, --hostname=ADDRESS\n";
> print " host name argument for server.\n";
> print " -h, --help\n";
> print " print detailed help screen.\n";
> print " -u, --url=PATH\n";
> print " location to call mod_status.\n";
> print " -V, --version\n";
> print " print version information.\n";
> print " -w, --warning=INTEGER\n";
> print " performance level at which a warning message will be
> gererated.\n";
> print "\n";
> print "\n";
> }
> #
> # the end
> #
>
>
>
--
"A Scientist will earn a living by taking a really difficult problem and
spends many years solving it, an engineer earns a living by finding really
difficult problems and side stepping them"
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://www.monitoring-lists.org/archive/users/attachments/20060315/7e7e9ace/attachment.html>
More information about the Users
mailing list