You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
133 lines
4.2 KiB
Perl
133 lines
4.2 KiB
Perl
#!/usr/bin/perl
|
|
#
|
|
# check_apache_watch - Apache mod_watch monitoring plugin
|
|
# version 3.1 17.06.2016
|
|
# by Mikanoshi - iam@mikanoshi.name, http://code.highspec.ru/Mikanoshi/check_apache_watch
|
|
#
|
|
# Collectd output uses "apache" value format, add this to your types.db:
|
|
############################################
|
|
# apache docs:GAUGE:0:U, reqs:GAUGE:0:U
|
|
############################################
|
|
#
|
|
# This plugin is a free software and comes with ABSOLUTELY NO WARRANTY.
|
|
# It may be used, redistributed and/or modified under the terms of the
|
|
# GNU General Public Licence Version 3 (see https://www.gnu.org/licenses/gpl.txt).
|
|
|
|
use Sys::Hostname;
|
|
use Term::ANSIColor;
|
|
|
|
my %exit_codes = ('UNKNOWN', 3, 'OK', 0, 'WARNING', 1, 'CRITICAL', 2);
|
|
|
|
my $ret = undef;
|
|
if (!eval "require LWP::UserAgent;") {
|
|
$ret = "LWP::UserAgent not found";
|
|
}
|
|
|
|
if (@ARGV < 2) {
|
|
print "Usage: check_apache_watch
|
|
|
|
".colored("[Required] watch-list URL, e.g. http://login:pass\@example.org:80/watch-list?auto", "grey6")."
|
|
|
|
".colored("[Required] Comma-separated list of domains to monitor (used as type-instances for collectd and as \"domain\" tag for influxlp)", "grey6")."
|
|
|
|
".colored("[Optional] Output format - nagios, collectd, influxlp (defaults to nagios)", "grey6")."
|
|
|
|
".colored("Collectd format:", "underline")."
|
|
|
|
".colored("[Optional] Hostname (defaults to current system hostname)", "grey6")."
|
|
|
|
".colored("[Optional] Plugin name (defaults to apachewatch)", "grey6")."
|
|
<300>
|
|
".colored("[Optional] Interval (defaults to 60 sec)", "grey6")."
|
|
|
|
".colored("Influx Line-Protocol format:", "underline")."
|
|
|
|
".colored("[Optional] Measurement name (defaults to apachewatch)", "grey6")."\n";
|
|
exit $exit_codes{'UNKNOWN'};
|
|
}
|
|
|
|
my $URL = $ARGV[0];
|
|
my @domains = split(',', $ARGV[1]);
|
|
my $is_collectd = exists $ARGV[2] && $ARGV[2] eq "collectd";
|
|
my $is_influxlp = exists $ARGV[2] && $ARGV[2] eq "influxlp";
|
|
my $hostname = hostname();
|
|
my $plugin = "apachewatch";
|
|
my $type = "apache";
|
|
my $interval = 60;
|
|
|
|
if ($is_collectd) {
|
|
if (exists $ARGV[3]) { $hostname = $ARGV[3] }
|
|
if (exists $ARGV[4]) { $plugin = $ARGV[4] }
|
|
if (exists $ARGV[5]) { $interval = $ARGV[5] }
|
|
}
|
|
|
|
if ($is_influxlp) {
|
|
if (exists $ARGV[3]) { $plugin = $ARGV[3] }
|
|
}
|
|
|
|
my $message = "";
|
|
sub doprint {
|
|
$msg = shift;
|
|
if ($is_influxlp) {
|
|
return;
|
|
} elsif ($is_collectd) {
|
|
$message .= $msg;
|
|
} else {
|
|
print $msg;
|
|
}
|
|
}
|
|
|
|
my @servers = ();
|
|
my @data;
|
|
|
|
my $timestamp = time();
|
|
my $ua = LWP::UserAgent->new (timeout => 5);
|
|
my $response = $ua->request (HTTP::Request->new ('GET', $URL));
|
|
|
|
my $severity = "failure";
|
|
my $status = $exit_codes{'UNKNOWN'};
|
|
if ($response->is_success) {
|
|
if ($response->code == 200) {
|
|
doprint "OK - Data received";
|
|
$severity = "okay";
|
|
$status = $exit_codes{'OK'};
|
|
} else {
|
|
doprint "CRITICAL - Response code: ", $response->code, "\n";
|
|
exit $exit_codes{'CRITICAL'};
|
|
}
|
|
} else {
|
|
doprint "CRITICAL - Cannot open watch-list url\n";
|
|
exit $exit_codes{'CRITICAL'};
|
|
}
|
|
|
|
foreach my $string (split (/\n/, $response->content)) {
|
|
my ($server, undef, $ifInOctets, $ifOutOctets, $ifRequests, $ifDocuments) = split (/\s/, $string, 6);
|
|
push @servers, $server unless $server eq "SERVER";
|
|
push @data, "$server $ifRequests $ifDocuments" unless $server eq "SERVER";
|
|
}
|
|
|
|
my $msgout = "";
|
|
if ($is_collectd) {
|
|
$msgout = ($severity eq "okay") ? "" : "PUTNOTIF time=".$timestamp." severity=".$severity." host=".$hostname." plugin=".$plugin." type=".$type." message=\"".$message."\"\n";
|
|
}
|
|
|
|
doprint " |";
|
|
foreach my $string (sort (@data)) {
|
|
my ($server, $ifRequests, $ifDocuments) = split (/\s/, $string);
|
|
if (grep $_ eq $server, @domains) {
|
|
(my $txtserver = $server) =~ s/(-|\.)/\_/g;
|
|
doprint " ${txtserver}::docs=".$ifDocuments."c;;; ${txtserver}::reqs=".$ifRequests."c;;;";
|
|
if ($is_influxlp) {
|
|
$msgout .= $plugin.",domain=".$server." docs=".$ifDocuments.",reqs=".$ifRequests." ".($timestamp * 1000000000)."\n";
|
|
} elsif ($is_collectd) {
|
|
$msgout .= "PUTVAL ".$hostname."/".$plugin."/".$type."-".$txtserver." interval=".$interval." ".$timestamp.":".$ifDocuments.":".$ifRequests."\n";
|
|
}
|
|
}
|
|
}
|
|
doprint "\n";
|
|
|
|
if ($is_collectd || $is_influxlp) {
|
|
print $msgout;
|
|
}
|
|
|
|
exit $status; |