#!/usr/bin/perl # # # # This file is distributed as part of the MariaDB Corporation MaxScale. It 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. # # 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; if not, write to the Free Software Foundation, Inc., 51 # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # # Copyright MariaDB Corporation Ab 2013-2015 # # # # @file check_maxscale_monitors.pl - Nagios plugin for MaxScale monitors # # Revision History # # Date Who Description # 06-03-2015 Massimiliano Pinto Initial implementation # #use strict; #use warnings; use Getopt::Std; my %opts; my $TIMEOUT = 15; # we don't want to wait long for a response my %ERRORS = ('UNKNOWN' , '3', 'OK', '0', 'WARNING', '1', 'CRITICAL', '2'); my $curr_script = "$0"; $curr_script =~ s{.*/}{}; sub usage { my $rc = shift; print <<"EOF"; MaxScale monitor checker plugin for Nagios Usage: $curr_script [-r ] [-H ] [-P ] [-u ] [-p ] [-m ] [-h] Options: -r = monitors -h = provide this usage message -H = which host to connect to -P = port to use -u = username to connect as -p = password to use for at -m = /path/to/maxadmin EOF exit $rc; } %opts =( 'r' => 'monitors', # default maxscale resource to show 'h' => '', # give help 'H' => 'localhost', # host 'u' => 'root', # username 'p' => '', # password 'P' => 6603, # port 'm' => '/usr/local/mariadb-maxscale/bin/maxadmin', # maxadmin ); my $MAXADMIN_DEFAULT = $opts{'m'}; getopts('r:hH:u:p:P:m:', \%opts) or usage( $ERRORS{"UNKNOWN"} ); usage( $ERRORS{'OK'} ) if $opts{'h'}; my $MAXADMIN_RESOURCE = $opts{'r'}; my $MAXADMIN = $opts{'m'}; if (!defined $MAXADMIN || length($MAXADMIN) == 0) { $MAXADMIN = $MAXADMIN_DEFAULT; } -x $MAXADMIN or die "$curr_script: Failed to find required tool: $MAXADMIN. Please install it or use the -m option to point to another location."; # Just in case of problems, let's not hang Nagios $SIG{'ALRM'} = sub { print ("UNKNOWN: No response from MaxScale server (alarm)\n"); exit $ERRORS{"UNKNOWN"}; }; alarm($TIMEOUT); my $command = $MAXADMIN . ' -h ' . $opts{'H'} . ' -u ' . $opts{'u'} . ' -p "' . $opts{'p'} . '" -P ' . $opts{'P'} . ' ' . "show " . $MAXADMIN_RESOURCE; # # print "maxadmin command: $command\n"; # open (MAXSCALE, "$command 2>&1 |") or die "can't get data out of Maxscale: $!"; my $hostname = qx{hostname}; chomp $hostname; my $waiting_backend = 0; my $start_output = 0; my $n_monitors = 0; my $performance_data=""; my $resource_type = $MAXADMIN_RESOURCE; chop($resource_type); my $resource_match = ucfirst("$resource_type Name"); my $this_key; my %monitor_data; while ( ) { chomp; if ( /(Failed|Unable) to connect to MaxScale/ ) { printf "CRITICAL: $_\n"; close(MAXSCALE); exit(2); } if ( /^Monitor\:/ ) { $n_monitors++; $this_key = 'monitor' . $n_monitors; $monitor_data{$this_key} = { '1name'=> '', '2state' => '', '3servers' => '', '4interval' => '', '5repl_lag' => '' }; next; } next if (/--/ || $_ eq ''); if ( /\s+Name/) { my $str; my $perf_line; my @data_row = split(':', $_); my $name = $data_row[1]; $name =~ s/^\s+|\s+$//g; $monitor_data{$this_key}{'1name'}=$name; } if (/(\s+Monitor )(.*)/) { $monitor_data{$this_key}{'2state'}=$2; } if ( /Monitored servers\:/ ) { my $server_list; my @data_row = split(':', $_); shift(@data_row); foreach my $name (@data_row) { $name =~ s/^\s+|\s+$//g; $name =~ s/ //g; $server_list .= $name . ":"; } chop($server_list); $monitor_data{$this_key}{'3servers'}=$server_list; } if ( /(Sampling interval\:)\s+(\d+) milliseconds/ ) { $monitor_data{$this_key}{'4interval'}=$2; } if ( /Replication lag\:/ ) { my @data_row = split(':', $_); my $name = $data_row[1]; $name =~ s/^\s+|\s+$//g; $monitor_data{$this_key}{'5repl_lag'}=$name; } } for my $key ( sort(keys %monitor_data) ) { my $local_hash = {}; $performance_data .= " $key="; $local_hash = $monitor_data{$key}; my %new_hash = %$local_hash; foreach my $key (sort (keys (%new_hash))) { $performance_data .= $new_hash{$key} . ";"; } chop($performance_data); } if ($n_monitors) { printf "OK: %d monitors found |%s\n", $n_monitors, $performance_data; close(MAXSCALE); exit 0; } else { printf "WARNING: 0 monitors found\n"; close(MAXSCALE); exit 1; }