Code

Alert on amount of time a slave is behind (Steven Kreuzer)
authorTon Voon <tonvoon@users.sourceforge.net>
Wed, 15 Mar 2006 19:54:32 +0000 (19:54 +0000)
committerTon Voon <tonvoon@users.sourceforge.net>
Wed, 15 Mar 2006 19:54:32 +0000 (19:54 +0000)
git-svn-id: https://nagiosplug.svn.sourceforge.net/svnroot/nagiosplug/nagiosplug/trunk@1324 f882894a-f735-0410-b71e-b25c423dba1c

THANKS.in
plugins/check_mysql.c
plugins/t/check_mysql.t

index 3aff4bfdd980619bb9584f402e8db02d61e1f6b4..1373142be7133a75245a99c3e43f41c851d15de8 100644 (file)
--- a/THANKS.in
+++ b/THANKS.in
@@ -175,3 +175,4 @@ Serhan Kiymaz
 Gerhard Lausser
 Jon Vandegrift
 Jason Crawford
+Steven Kreuzer
index 45f86a9c6319e49e88f4f152f5824f73ea4d2f2e..92ac7ff00f3b8b3002ef9f5f5a94d5c96b2506a1 100644 (file)
@@ -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:
 
 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\
index e961106b3cbaffa974d8305390b33f71187c2adf..78413c6e88d63938b91ea87269df7898a352b2e1 100644 (file)
@@ -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");
 }