59 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			59 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
#!/usr/bin/perl
 | 
						|
use strict;
 | 
						|
use warnings;
 | 
						|
use LWP::Simple;
 | 
						|
use Data::Dump qw(dump);    #libdata-dump-perl
 | 
						|
use Web::Scraper;           #libweb-scraper-perl
 | 
						|
use Monitoring::Plugin;	    #libmonitoring-plugin-perl
 | 
						|
 | 
						|
my $np = Monitoring::Plugin->new(
 | 
						|
    usage => '',
 | 
						|
    plugin => $0,
 | 
						|
    shortname => "Balancer Members",
 | 
						|
    blurb => 'Apache 2 Load Balancer Manager Members',
 | 
						|
    timeout => 10
 | 
						|
);
 | 
						|
 | 
						|
$np->add_arg(
 | 
						|
    spec => 'hostname|h=s',
 | 
						|
    help => 'hostname of the apache server',
 | 
						|
    required => 1
 | 
						|
);
 | 
						|
 | 
						|
$np->add_arg(
 | 
						|
    spec => 'path|p=s',
 | 
						|
    help => 'path to the balancer url',
 | 
						|
    required => 1
 | 
						|
);
 | 
						|
 | 
						|
$np->getopts;
 | 
						|
 | 
						|
my $response = get("http://".$np->opts->hostname."/".$np->opts->path);
 | 
						|
my $s = scraper {
 | 
						|
    process 'table:nth-of-type(2) tr', 'members[]' => scraper {
 | 
						|
        process 'td:nth-of-type(1)', 'worker' => 'TEXT';
 | 
						|
        process 'td:nth-of-type(6)', 'status' => 'TEXT';
 | 
						|
        process 'td:nth-of-type(7)', 'elected' => 'TEXT';
 | 
						|
        process 'td:nth-of-type(8)', 'busy' => 'TEXT';
 | 
						|
        process 'td:nth-of-type(9)', 'load' => 'TEXT';
 | 
						|
        process 'td:nth-of-type(10)', 'to' => 'TEXT';
 | 
						|
        process 'td:nth-of-type(11)', 'from' => 'TEXT';
 | 
						|
    }
 | 
						|
};
 | 
						|
 | 
						|
my $results = $s->scrape($response);
 | 
						|
my @problemMembers = ();
 | 
						|
my $at_least_one_is_ok = 0;
 | 
						|
 | 
						|
foreach my $member (@{$results->{'members'}})
 | 
						|
{
 | 
						|
    next unless $member->{'worker'};
 | 
						|
    push @problemMembers, $member->{'worker'} if $member->{'status'} =~ /Err/i;
 | 
						|
    $at_least_one_is_ok = 1 if $member->{'status'} =~ /Ok\s?$/;
 | 
						|
    $np->add_perfdata(label => "elected-$member->{'worker'}", value => $member->{'elected'}, uom => 'c');
 | 
						|
    $np->add_perfdata(label => "busy-$member->{'worker'}", value => $member->{'busy'}, uom => 'rqts');
 | 
						|
}
 | 
						|
 | 
						|
$np->nagios_exit('CRITICAL', "No members are Ok; there is a problem") unless $at_least_one_is_ok;
 | 
						|
$np->nagios_exit('CRITICAL', "Members have errors: " . join (", ", @problemMembers)) if (@problemMembers > 0);
 | 
						|
$np->nagios_exit('OK', "All members functioning correctly");
 |