From 1c229b2c4572f1fcf5e1fe470f49df49111816f5 Mon Sep 17 00:00:00 2001 From: Ton Voon Date: Wed, 15 Mar 2006 19:54:32 +0000 Subject: Alert on amount of time a slave is behind (Steven Kreuzer) git-svn-id: https://nagiosplug.svn.sourceforge.net/svnroot/nagiosplug/nagiosplug/trunk@1324 f882894a-f735-0410-b71e-b25c423dba1c diff --git a/THANKS.in b/THANKS.in index 3aff4bf..1373142 100644 --- a/THANKS.in +++ b/THANKS.in @@ -175,3 +175,4 @@ Serhan Kiymaz Gerhard Lausser Jon Vandegrift Jason Crawford +Steven Kreuzer diff --git a/plugins/check_mysql.c b/plugins/check_mysql.c index 45f86a9..92ac7ff 100644 --- a/plugins/check_mysql.c +++ b/plugins/check_mysql.c @@ -6,7 +6,7 @@ * License: GPL * Copyright (c) 1999 Didi Rieder (adrieder@sbox.tu-graz.ac.at) * portions (c) 2000 Karl DeBisschop (kdebisschop@users.sourceforge.net) -* +* * $Id$ * * Description: @@ -16,10 +16,10 @@ const char *progname = "check_mysql"; const char *revision = "$Revision$"; -const char *copyright = "1999-2004"; +const char *copyright = "1999-2006"; const char *email = "nagiosplug-devel@lists.sourceforge.net"; -#define SLAVERESULTSIZE 40 +#define SLAVERESULTSIZE 70 #include "common.h" #include "utils.h" @@ -33,15 +33,16 @@ char *db_host = NULL; char *db_pass = NULL; char *db = NULL; unsigned int db_port = MYSQL_PORT; -int check_slave = 0; +int check_slave = 0, warn_sec = 0, crit_sec = 0; +int verbose = 0; + +thresholds *my_threshold = NULL; int process_arguments (int, char **); int validate_arguments (void); void print_help (void); void print_usage (void); - - int main (int argc, char **argv) { @@ -137,37 +138,60 @@ main (int argc, char **argv) } else { /* mysql 4.x.x */ - int slave_io_field = -1 , slave_sql_field = -1, i, num_fields; + int slave_io_field = -1 , slave_sql_field = -1, seconds_behind_field = -1, i, num_fields; MYSQL_FIELD* fields; num_fields = mysql_num_fields(res); fields = mysql_fetch_fields(res); - for(i = 0; i < num_fields; i++) - { - if (0 == strcmp(fields[i].name, "Slave_IO_Running")) - { + for(i = 0; i < num_fields; i++) { + if (strcmp(fields[i].name, "Slave_IO_Running") == 0) { slave_io_field = i; continue; } - if (0 == strcmp(fields[i].name, "Slave_SQL_Running")) - { + if (strcmp(fields[i].name, "Slave_SQL_Running") == 0) { slave_sql_field = i; continue; } + if (strcmp(fields[i].name, "Seconds_Behind_Master") == 0) { + seconds_behind_field = i; + continue; + } } - if ((slave_io_field < 0) || (slave_sql_field < 0) || (num_fields == 0)) - { + if ((slave_io_field < 0) || (slave_sql_field < 0) || (num_fields == 0)) { mysql_free_result (res); mysql_close (&mysql); die (STATE_CRITICAL, "Slave status unavailable\n"); } - - snprintf (slaveresult, SLAVERESULTSIZE, "Slave IO: %s Slave SQL: %s", row[slave_io_field], row[slave_sql_field]); + + snprintf (slaveresult, SLAVERESULTSIZE, "Slave IO: %s Slave SQL: %s Seconds Behind Master: %s", row[slave_io_field], row[slave_sql_field], row[seconds_behind_field]); if (strcmp (row[slave_io_field], "Yes") != 0 || strcmp (row[slave_sql_field], "Yes") != 0) { mysql_free_result (res); mysql_close (&mysql); die (STATE_CRITICAL, "%s\n", slaveresult); } + + if (verbose >=3) { + if (seconds_behind_field == -1) { + printf("seconds_behind_field not found\n"); + } else { + printf ("seconds_behind_field(index %d)=%s\n", seconds_behind_field, row[seconds_behind_field]); + } + } + + if ((seconds_behind_field != -1) && (strcmp (row[seconds_behind_field], "NULL") != 0)) { + double value = atof(row[seconds_behind_field]); + int status; + + status = get_status(value, my_threshold); + + if (status == STATE_WARNING) { + printf("SLOW_SLAVE %s: %s\n", _("WARNING"), slaveresult); + exit(STATE_WARNING); + } else if (status == STATE_CRITICAL) { + printf("SLOW_SLAVE %s: %s\n", _("CRITICAL"), slaveresult); + exit(STATE_CRITICAL); + } + } } /* free the result */ @@ -193,6 +217,8 @@ int process_arguments (int argc, char **argv) { int c; + char *warning = NULL; + char *critical = NULL; int option = 0; static struct option longopts[] = { @@ -201,6 +227,8 @@ process_arguments (int argc, char **argv) {"username", required_argument, 0, 'u'}, {"password", required_argument, 0, 'p'}, {"port", required_argument, 0, 'P'}, + {"critical", required_argument, 0, 'c'}, + {"warning", required_argument, 0, 'w'}, {"check-slave", no_argument, 0, 'S'}, {"verbose", no_argument, 0, 'v'}, {"version", no_argument, 0, 'V'}, @@ -212,7 +240,7 @@ process_arguments (int argc, char **argv) return ERROR; while (1) { - c = getopt_long (argc, argv, "hVSP:p:u:d:H:", longopts, &option); + c = getopt_long (argc, argv, "hvVSP:p:u:d:H:c:w:", longopts, &option); if (c == -1 || c == EOF) break; @@ -241,12 +269,21 @@ process_arguments (int argc, char **argv) case 'S': check_slave = 1; /* check-slave */ break; + case 'w': + warning = optarg; + break; + case 'c': + critical = optarg; + break; case 'V': /* version */ print_revision (progname, revision); exit (STATE_OK); case 'h': /* help */ print_help (); exit (STATE_OK); + case 'v': + verbose++; + break; case '?': /* help */ usage2 (_("Unknown argument"), optarg); } @@ -254,6 +291,8 @@ process_arguments (int argc, char **argv) c = optind; + set_thresholds(&my_threshold, warning, critical); + while ( argc > c ) { if (strlen(db_host) == 0) @@ -326,7 +365,11 @@ print_help (void) ==> IMPORTANT: THIS FORM OF AUTHENTICATION IS NOT SECURE!!! <==\n\ Your clear-text password will be visible as a process table entry\n\ -S, --check-slave\n\ - Check if the slave thread is running properly.\n")); + Check if the slave thread is running properly.\n\ + -w, --warning\n\ + Exit with WARNING status if slave server is more then INTEGER seconds behind master\n\ + -c, --critical\n\ + Exit with CRITICAL status if slave server is more then INTEGER seconds behind master\n")); printf (_("\n\ There are no required arguments. By default, the local database with\n\ diff --git a/plugins/t/check_mysql.t b/plugins/t/check_mysql.t index e961106..78413c6 100644 --- a/plugins/t/check_mysql.t +++ b/plugins/t/check_mysql.t @@ -19,7 +19,7 @@ use vars qw($tests); plan skip_all => "check_mysql not compiled" unless (-x "check_mysql"); -plan tests => 7; +plan tests => 10; my $bad_login_output = '/Access denied for user /'; my $mysqlserver = getTestParameter( @@ -58,10 +58,17 @@ SKIP: { } SKIP: { - skip "No mysql server with slaves defined", 2 unless $with_slave; + skip "No mysql server with slaves defined", 5 unless $with_slave; $result = NPTest->testCmd("./check_mysql -H $with_slave $with_slave_login"); cmp_ok( $result->return_code, '==', 0, "Login okay"); $result = NPTest->testCmd("./check_mysql -S -H $with_slave $with_slave_login"); cmp_ok( $result->return_code, "==", 0, "Slaves okay" ); + + $result = NPTest->testCmd("./check_mysql -S -H $with_slave $with_slave_login -w 60"); + cmp_ok( $result->return_code, '==', 0, 'Slaves are not > 60 seconds behind'); + + $result = NPTest->testCmd("./check_mysql -S -H $with_slave $with_slave_login -w 60:"); + cmp_ok( $result->return_code, '==', 1, 'Alert warning if < 60 seconds behind'); + like( $result->output, "/^SLOW_SLAVE WARNING:/", "Output okay"); } -- cgit v0.10-9-g596f