From 0e02edec196a8f3cf866279c5609138db14ec931 Mon Sep 17 00:00:00 2001
From: Sebastian Harl <sh@teamix.net>
Date: Thu, 7 Apr 2011 18:09:33 +0200
Subject: check_dbi: Check and report the time used by the query.


diff --git a/plugins/check_dbi.c b/plugins/check_dbi.c
index d4ac4e3..f59d7c4 100644
--- a/plugins/check_dbi.c
+++ b/plugins/check_dbi.c
@@ -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, ...)
 {
-- 
cgit v0.10-9-g596f

