aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Sebastian Harl <sh@teamix.net> 2011-04-07 18:09:33 +0200
committerGravatar Sebastian Harl <sh@teamix.net> 2012-06-06 14:10:55 +0200
commit0e02edec196a8f3cf866279c5609138db14ec931 (patch)
treef25b5031c2a901c6437a7a490149ddc657c9f413
parente7dfcd4429b54bd98bac724665d7b5e6e30a7532 (diff)
downloadmonitoring-plugins-0e02edec196a8f3cf866279c5609138db14ec931.tar.gz
check_dbi: Check and report the time used by the query.
-rw-r--r--plugins/check_dbi.c54
1 files changed, 37 insertions, 17 deletions
diff --git a/plugins/check_dbi.c b/plugins/check_dbi.c
index d4ac4e32..f59d7c41 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, ...)
{