Code

check_dbi: Check and report the time used by the query.
authorSebastian Harl <sh@teamix.net>
Thu, 7 Apr 2011 16:09:33 +0000 (18:09 +0200)
committerSebastian Harl <sh@teamix.net>
Thu, 7 Apr 2011 16:09:33 +0000 (18:09 +0200)
plugins/check_dbi.c

index d4ac4e3223b6fd47c4b7c07357ffaeb60633f53f..f59d7c41655f54a950a2a49c709eed3d3032ceb5 100644 (file)
@@ -69,9 +69,11 @@ int validate_arguments (void);
 void print_usage (void);
 void print_help (void);
 
+double timediff (struct timeval, struct timeval);
+
 void np_dbi_print_error (dbi_conn, char *, ...);
 
-int do_query (dbi_conn, double *);
+int do_query (dbi_conn, double *, double *);
 
 int
 main (int argc, char **argv)
@@ -85,7 +87,8 @@ main (int argc, char **argv)
        dbi_conn conn;
 
        struct timeval start_timeval, end_timeval;
-       double elapsed_time;
+       double conn_time = 0.0;
+       double query_time = 0.0;
 
        double query_val = 0.0;
 
@@ -190,17 +193,12 @@ main (int argc, char **argv)
        }
 
        gettimeofday (&end_timeval, NULL);
-       while (start_timeval.tv_usec > end_timeval.tv_usec) {
-               --end_timeval.tv_sec;
-               end_timeval.tv_usec += 1000000;
-       }
-       elapsed_time = (double)(end_timeval.tv_sec - start_timeval.tv_sec)
-               + (double)(end_timeval.tv_usec - start_timeval.tv_usec) / 1000000.0;
+       conn_time = timediff (start_timeval, end_timeval);
 
        if (verbose)
-               printf("Time elapsed: %f\n", elapsed_time);
+               printf("Time elapsed: %f\n", conn_time);
 
-       conntime_status = get_status (elapsed_time, conntime_thresholds);
+       conntime_status = get_status (conn_time, conntime_thresholds);
 
        /* select a database */
        if (np_dbi_database) {
@@ -215,7 +213,7 @@ main (int argc, char **argv)
        }
 
        /* execute query */
-       status = do_query (conn, &query_val);
+       status = do_query (conn, &query_val, &query_time);
        if (status != STATE_OK)
                /* do_query prints an error message in this case */
                return status;
@@ -234,14 +232,15 @@ main (int argc, char **argv)
        else
                exit_status = status;
 
-       printf ("%s - %s: connection time: %fs, %s: '%s' returned %f",
+       printf ("%s - %s: connection time: %fs, %s: '%s' returned %f in %fs",
                        state_text (exit_status),
-                       state_text (conntime_status), elapsed_time,
-                       state_text (status), np_dbi_query, query_val);
-       printf (" | conntime=%fs;%s;%s;0 query=%f;%s;%s;0\n", elapsed_time,
+                       state_text (conntime_status), conn_time,
+                       state_text (status), np_dbi_query, query_val, query_time);
+       printf (" | conntime=%fs;%s;%s;0 query=%f;%s;%s;0 querytime=%fs;;;0\n", conn_time,
                        conntime_warning_range ? conntime_warning_range : "",
                        conntime_critical_range ? conntime_critical_range : "",
-                       query_val, warning_range ? warning_range : "", critical_range ? critical_range : "");
+                       query_val, warning_range ? warning_range : "", critical_range ? critical_range : "",
+                       query_time);
        return exit_status;
 }
 
@@ -486,16 +485,20 @@ get_field (dbi_conn conn, dbi_result res, unsigned short *field_type)
 }
 
 int
-do_query (dbi_conn conn, double *res_val)
+do_query (dbi_conn conn, double *res_val, double *res_time)
 {
        dbi_result res;
 
        unsigned short field_type;
        double val = 0.0;
 
+       struct timeval timeval_start, timeval_end;
+
        if (verbose)
                printf ("Executing query '%s'\n", np_dbi_query);
 
+       gettimeofday (&timeval_start, NULL);
+
        res = dbi_conn_query (conn, np_dbi_query);
        if (! res) {
                np_dbi_print_error (conn, "CRITICAL - failed to execute query '%s'", np_dbi_query);
@@ -531,6 +534,9 @@ do_query (dbi_conn conn, double *res_val)
        if (field_type != DBI_TYPE_ERROR)
                val = get_field (conn, res, &field_type);
 
+       gettimeofday (&timeval_end, NULL);
+       *res_time = timediff (timeval_start, timeval_end);
+
        if (field_type == DBI_TYPE_ERROR) {
                np_dbi_print_error (conn, "CRITICAL - failed to fetch data");
                return STATE_CRITICAL;
@@ -542,6 +548,20 @@ do_query (dbi_conn conn, double *res_val)
        return STATE_OK;
 }
 
+double
+timediff (struct timeval start, struct timeval end)
+{
+       double diff;
+
+       while (start.tv_usec > end.tv_usec) {
+               --end.tv_sec;
+               end.tv_usec += 1000000;
+       }
+       diff = (double)(end.tv_sec - start.tv_sec)
+               + (double)(end.tv_usec - start.tv_usec) / 1000000.0;
+       return diff;
+}
+
 void
 np_dbi_print_error (dbi_conn conn, char *fmt, ...)
 {