[monitoring-plugins] check_dbi: more refactoring for coherence and ...

Lorenz Kästle git at monitoring-plugins.org
Fri Nov 7 14:20:12 CET 2025


 Module: monitoring-plugins
 Branch: master
 Commit: 0c70af5fef8bd7cbbad107224fd283f69ae0416a
 Author: Lorenz Kästle <12514511+RincewindsHat at users.noreply.github.com>
   Date: Thu Oct 30 23:58:38 2025 +0100
    URL: https://www.monitoring-plugins.org/repositories/monitoring-plugins/commit/?id=0c70af5f

check_dbi: more refactoring for coherence and simplification

---

 plugins/check_dbi.c          | 121 ++++++++++++++++++++++---------------------
 plugins/check_dbi.d/config.h |  27 +++++-----
 2 files changed, 75 insertions(+), 73 deletions(-)

diff --git a/plugins/check_dbi.c b/plugins/check_dbi.c
index 286635cc..9bc68eb3 100644
--- a/plugins/check_dbi.c
+++ b/plugins/check_dbi.c
@@ -34,6 +34,7 @@ const char *copyright = "2011-2024";
 const char *email = "devel at monitoring-plugins.org";
 
 #include "../lib/monitoringplug.h"
+#include "thresholds.h"
 #include "perfdata.h"
 #include "output.h"
 #include "states.h"
@@ -66,7 +67,6 @@ typedef struct {
 } check_dbi_config_wrapper;
 
 static check_dbi_config_wrapper process_arguments(int /*argc*/, char ** /*argv*/);
-static check_dbi_config_wrapper validate_arguments(check_dbi_config_wrapper /*config_wrapper*/);
 void print_usage(void);
 static void print_help(void);
 
@@ -82,7 +82,8 @@ typedef struct {
 	const char *error_string;
 	mp_state_enum query_processing_status;
 } do_query_result;
-static do_query_result do_query(dbi_conn conn, mp_dbi_metric metric, mp_dbi_type type, char *query);
+static do_query_result do_query(dbi_conn conn, check_dbi_metric metric, check_dbi_type type,
+								char *query);
 
 int main(int argc, char **argv) {
 	setlocale(LC_ALL, "");
@@ -228,8 +229,8 @@ int main(int argc, char **argv) {
 	pd_conn_duration = mp_set_pd_value(pd_conn_duration, conn_time);
 
 	if (config.metric == METRIC_CONN_TIME) {
-		// TODO set pd thresholds
-		mp_state_enum status = get_status(conn_time, config.dbi_thresholds);
+		pd_conn_duration = mp_pd_set_thresholds(pd_conn_duration, config.thresholds);
+		mp_state_enum status = mp_get_pd_status(pd_conn_duration);
 		sc_connection_time = mp_set_subcheck_state(sc_connection_time, status);
 		if (status != STATE_OK) {
 			xasprintf(&sc_connection_time.output, "%s violates thresholds",
@@ -250,7 +251,11 @@ int main(int argc, char **argv) {
 	xasprintf(&sc_server_version.output, "Connected to server version %u", server_version);
 
 	if (config.metric == METRIC_SERVER_VERSION) {
-		mp_state_enum status = get_status(server_version, config.dbi_thresholds);
+		mp_perfdata pd_server_version = perfdata_init();
+		pd_server_version = mp_set_pd_value(pd_server_version, server_version);
+		pd_server_version = mp_pd_set_thresholds(pd_server_version, config.thresholds);
+		mp_state_enum status = mp_get_pd_status(pd_server_version);
+		mp_add_perfdata_to_subcheck(&sc_server_version, pd_server_version);
 
 		sc_server_version = mp_set_subcheck_state(sc_server_version, status);
 
@@ -262,17 +267,16 @@ int main(int argc, char **argv) {
 	mp_add_subcheck_to_check(&overall, sc_server_version);
 
 	/* select a database */
-	if (config.dbi_database) {
+	if (config.database) {
 		if (verbose > 1) {
-			printf("Selecting database '%s'\n", config.dbi_database);
+			printf("Selecting database '%s'\n", config.database);
 		}
 
 		mp_subcheck sc_select_db = mp_subcheck_init();
 		sc_select_db = mp_set_subcheck_default_state(sc_select_db, STATE_OK);
 
-		if (dbi_conn_select_db(conn, config.dbi_database)) {
-			np_dbi_print_error(conn, "UNKNOWN - failed to select database '%s'",
-							   config.dbi_database);
+		if (dbi_conn_select_db(conn, config.database)) {
+			np_dbi_print_error(conn, "UNKNOWN - failed to select database '%s'", config.database);
 			exit(STATE_UNKNOWN);
 		} else {
 			mp_add_subcheck_to_check(&overall, sc_select_db);
@@ -280,12 +284,12 @@ int main(int argc, char **argv) {
 	}
 
 	// Do a query (if configured)
-	if (config.dbi_query) {
+	if (config.query) {
 		mp_subcheck sc_query = mp_subcheck_init();
 		sc_query = mp_set_subcheck_default_state(sc_query, STATE_UNKNOWN);
 
 		/* execute query */
-		do_query_result query_res = do_query(conn, config.metric, config.type, config.dbi_query);
+		do_query_result query_res = do_query(conn, config.metric, config.type, config.query);
 
 		if (query_res.error_code != 0) {
 			xasprintf(&sc_query.output, "Query failed: %s", query_res.error_string);
@@ -299,7 +303,7 @@ int main(int argc, char **argv) {
 			sc_query = mp_set_subcheck_state(sc_query, query_res.query_processing_status);
 		} else {
 			// query succeeded in general
-			xasprintf(&sc_query.output, "Query '%s' succeeded", config.dbi_query);
+			xasprintf(&sc_query.output, "Query '%s' succeeded", config.query);
 
 			// that's a OK by default now
 			sc_query = mp_set_subcheck_default_state(sc_query, STATE_OK);
@@ -309,7 +313,7 @@ int main(int argc, char **argv) {
 			pd_query_duration = mp_set_pd_value(pd_query_duration, query_res.query_duration);
 			pd_query_duration.label = "querytime";
 			if (config.metric == METRIC_QUERY_TIME) {
-				// TODO set thresholds
+				pd_query_duration = mp_pd_set_thresholds(pd_query_duration, config.thresholds);
 			}
 
 			mp_add_perfdata_to_subcheck(&sc_query, pd_query_duration);
@@ -362,19 +366,20 @@ int main(int argc, char **argv) {
 						// so we expected a number
 						// this is a CRITICAL
 						xasprintf(&sc_query.output, "Query '%s' result is not numeric",
-								  config.dbi_query);
+								  config.query);
 						sc_query = mp_set_subcheck_state(sc_query, STATE_CRITICAL);
 
 					} else {
-						mp_state_enum query_numerical_result =
-							get_status(query_res.result_number, config.dbi_thresholds);
-						sc_query = mp_set_subcheck_state(sc_query, query_numerical_result);
 
 						mp_perfdata pd_query_val = perfdata_init();
 						pd_query_val = mp_set_pd_value(pd_query_val, query_res.result_number);
 						pd_query_val.label = "query";
+						pd_query_val = mp_pd_set_thresholds(pd_query_val, config.thresholds);
+
 						mp_add_perfdata_to_subcheck(&sc_query, pd_query_val);
+						mp_state_enum query_numerical_result = mp_get_pd_status(pd_query_val);
 
+						sc_query = mp_set_subcheck_state(sc_query, query_numerical_result);
 						// TODO set pd thresholds
 						// if (config.dbi_thresholds->warning) {
 						// pd_query_val.warn= config.dbi_thresholds->warning
@@ -393,8 +398,7 @@ int main(int argc, char **argv) {
 					}
 				}
 			} else if (config.metric == METRIC_QUERY_TIME) {
-				mp_state_enum query_time_status =
-					get_status(query_res.query_duration, config.dbi_thresholds);
+				mp_state_enum query_time_status = mp_get_pd_status(pd_query_duration);
 				mp_set_subcheck_state(sc_query, query_time_status);
 
 				if (query_time_status == STATE_OK) {
@@ -464,14 +468,22 @@ check_dbi_config_wrapper process_arguments(int argc, char **argv) {
 			print_revision(progname, NP_VERSION);
 			exit(STATE_UNKNOWN);
 
-		case 'c': /* critical range */
-			result.config.critical_range = optarg;
+		case 'c': /* critical range */ {
+			mp_range_parsed tmp = mp_parse_range_string(optarg);
+			if (tmp.error != MP_PARSING_SUCCES) {
+				die(STATE_UNKNOWN, "failed to parse critical threshold");
+			}
+			result.config.thresholds = mp_thresholds_set_crit(result.config.thresholds, tmp.range);
 			result.config.type = TYPE_NUMERIC;
-			break;
-		case 'w': /* warning range */
-			result.config.warning_range = optarg;
+		} break;
+		case 'w': /* warning range */ {
+			mp_range_parsed tmp = mp_parse_range_string(optarg);
+			if (tmp.error != MP_PARSING_SUCCES) {
+				die(STATE_UNKNOWN, "failed to parse warning threshold");
+			}
+			result.config.thresholds = mp_thresholds_set_warn(result.config.thresholds, tmp.range);
 			result.config.type = TYPE_NUMERIC;
-			break;
+		} break;
 		case 'e':
 			result.config.expect = optarg;
 			result.config.type = TYPE_STRING;
@@ -559,10 +571,10 @@ check_dbi_config_wrapper process_arguments(int argc, char **argv) {
 			new->value = value;
 		} break;
 		case 'q':
-			result.config.dbi_query = optarg;
+			result.config.query = optarg;
 			break;
 		case 'D':
-			result.config.dbi_database = optarg;
+			result.config.database = optarg;
 			break;
 		case output_format_index: {
 			parsed_output_format parser = mp_parse_output_format(optarg);
@@ -579,57 +591,48 @@ check_dbi_config_wrapper process_arguments(int argc, char **argv) {
 		}
 	}
 
-	set_thresholds(&result.config.dbi_thresholds, result.config.warning_range,
-				   result.config.critical_range);
-
-	return validate_arguments(result);
-}
-
-check_dbi_config_wrapper validate_arguments(check_dbi_config_wrapper config_wrapper) {
-	if (!config_wrapper.config.dbi_driver) {
+	if (!result.config.dbi_driver) {
 		usage("Must specify a DBI driver");
 	}
 
-	if (((config_wrapper.config.metric == METRIC_QUERY_RESULT) ||
-		 (config_wrapper.config.metric == METRIC_QUERY_TIME)) &&
-		(!config_wrapper.config.dbi_query)) {
+	if (((result.config.metric == METRIC_QUERY_RESULT) ||
+		 (result.config.metric == METRIC_QUERY_TIME)) &&
+		(!result.config.query)) {
 		usage("Must specify a query to execute (metric == QUERY_RESULT)");
 	}
 
-	if ((config_wrapper.config.metric != METRIC_CONN_TIME) &&
-		(config_wrapper.config.metric != METRIC_SERVER_VERSION) &&
-		(config_wrapper.config.metric != METRIC_QUERY_RESULT) &&
-		(config_wrapper.config.metric != METRIC_QUERY_TIME)) {
+	if ((result.config.metric != METRIC_CONN_TIME) &&
+		(result.config.metric != METRIC_SERVER_VERSION) &&
+		(result.config.metric != METRIC_QUERY_RESULT) &&
+		(result.config.metric != METRIC_QUERY_TIME)) {
 		usage("Invalid metric specified");
 	}
 
-	if (config_wrapper.config.expect &&
-		(config_wrapper.config.warning_range || config_wrapper.config.critical_range ||
-		 config_wrapper.config.expect_re_str)) {
+	if (result.config.expect &&
+		(result.config.thresholds.warning_is_set || result.config.thresholds.critical_is_set ||
+		 result.config.expect_re_str)) {
 		usage("Do not mix -e and -w/-c/-r/-R");
 	}
 
-	if (config_wrapper.config.expect_re_str &&
-		(config_wrapper.config.warning_range || config_wrapper.config.critical_range ||
-		 config_wrapper.config.expect)) {
+	if (result.config.expect_re_str &&
+		(result.config.thresholds.warning_is_set || result.config.thresholds.critical_is_set ||
+		 result.config.expect)) {
 		usage("Do not mix -r/-R and -w/-c/-e");
 	}
 
-	if (config_wrapper.config.expect && (config_wrapper.config.metric != METRIC_QUERY_RESULT)) {
+	if (result.config.expect && (result.config.metric != METRIC_QUERY_RESULT)) {
 		usage("Option -e requires metric QUERY_RESULT");
 	}
 
-	if (config_wrapper.config.expect_re_str &&
-		(config_wrapper.config.metric != METRIC_QUERY_RESULT)) {
+	if (result.config.expect_re_str && (result.config.metric != METRIC_QUERY_RESULT)) {
 		usage("Options -r/-R require metric QUERY_RESULT");
 	}
 
-	if (config_wrapper.config.type == TYPE_STRING) {
-		assert(config_wrapper.config.expect || config_wrapper.config.expect_re_str);
+	if (result.config.type == TYPE_STRING) {
+		assert(result.config.expect || result.config.expect_re_str);
 	}
 
-	config_wrapper.errorcode = OK;
-	return config_wrapper;
+	return result;
 }
 
 void print_help(void) {
@@ -735,7 +738,7 @@ void print_usage(void) {
 	printf(" [-e <string>] [-r|-R <regex>]\n");
 }
 
-const char *get_field_str(dbi_result res, mp_dbi_metric metric, mp_dbi_type type) {
+const char *get_field_str(dbi_result res, check_dbi_metric metric, check_dbi_type type) {
 	const char *str = dbi_result_get_string_idx(res, 1);
 	if ((!str) || (strcmp(str, "ERROR") == 0)) {
 		if (metric != METRIC_QUERY_RESULT) {
@@ -755,7 +758,7 @@ typedef struct {
 	int error_code;
 	int dbi_error_code; // not sure if useful
 } get_field_wrapper;
-get_field_wrapper get_field(dbi_result res, mp_dbi_metric metric, mp_dbi_type type) {
+get_field_wrapper get_field(dbi_result res, check_dbi_metric metric, check_dbi_type type) {
 
 	unsigned short field_type = dbi_result_get_field_type_idx(res, 1);
 	get_field_wrapper result = {
@@ -815,7 +818,7 @@ get_field_wrapper get_field(dbi_result res, mp_dbi_metric metric, mp_dbi_type ty
 	return result;
 }
 
-static do_query_result do_query(dbi_conn conn, mp_dbi_metric metric, mp_dbi_type type,
+static do_query_result do_query(dbi_conn conn, check_dbi_metric metric, check_dbi_type type,
 								char *query) {
 	assert(query);
 
diff --git a/plugins/check_dbi.d/config.h b/plugins/check_dbi.d/config.h
index 09aa67da..25d74a12 100644
--- a/plugins/check_dbi.d/config.h
+++ b/plugins/check_dbi.d/config.h
@@ -3,18 +3,19 @@
 #include "../../config.h"
 #include <stddef.h>
 #include "../../lib/monitoringplug.h"
+#include "thresholds.h"
 
 typedef enum {
 	METRIC_CONN_TIME,
 	METRIC_SERVER_VERSION,
 	METRIC_QUERY_RESULT,
 	METRIC_QUERY_TIME,
-} mp_dbi_metric;
+} check_dbi_metric;
 
 typedef enum {
 	TYPE_NUMERIC,
 	TYPE_STRING,
-} mp_dbi_type;
+} check_dbi_type;
 
 typedef struct {
 	char *key;
@@ -24,19 +25,19 @@ typedef struct {
 typedef struct {
 	char *dbi_driver;
 	char *host;
+
 	driver_option_t *dbi_options;
 	size_t dbi_options_num;
-	char *dbi_database;
-	char *dbi_query;
+
+	char *database;
+	char *query;
 
 	char *expect;
 	char *expect_re_str;
 	int expect_re_cflags;
-	mp_dbi_metric metric;
-	mp_dbi_type type;
-	char *warning_range;
-	char *critical_range;
-	thresholds *dbi_thresholds;
+	check_dbi_metric metric;
+	check_dbi_type type;
+	mp_thresholds thresholds;
 
 	bool output_format_is_set;
 	mp_output_format output_format;
@@ -48,8 +49,8 @@ check_dbi_config check_dbi_config_init() {
 		.host = NULL,
 		.dbi_options = NULL,
 		.dbi_options_num = 0,
-		.dbi_database = NULL,
-		.dbi_query = NULL,
+		.database = NULL,
+		.query = NULL,
 
 		.expect = NULL,
 		.expect_re_str = NULL,
@@ -57,9 +58,7 @@ check_dbi_config check_dbi_config_init() {
 		.metric = METRIC_QUERY_RESULT,
 		.type = TYPE_NUMERIC,
 
-		.warning_range = NULL,
-		.critical_range = NULL,
-		.dbi_thresholds = NULL,
+		.thresholds = mp_thresholds_init(),
 
 		.output_format_is_set = false,
 	};



More information about the Commits mailing list