From bacc5b925ea8c63eb57dc4b55f4b4abbe1b1d07c Mon Sep 17 00:00:00 2001 From: Florian Forster Date: Mon, 6 Jul 2009 18:57:54 +0200 Subject: [PATCH] src/utils_threshold.c: Change the percentage code so it works with the DataSource option. The percentage code used to *always* check the first data source. With this patch, the code honors the `DataSource' option again, checking only the configured data sources if applicable. --- src/utils_threshold.c | 43 ++++++++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/src/utils_threshold.c b/src/utils_threshold.c index d51789db..fa8c8f9f 100644 --- a/src/utils_threshold.c +++ b/src/utils_threshold.c @@ -769,36 +769,49 @@ static int ut_check_one_threshold (const data_set_t *ds, int ret = -1; int ds_index = -1; int i; + gauge_t values_copy[ds->ds_num]; - if ((th->flags & UT_FLAG_PERCENTAGE) == UT_FLAG_PERCENTAGE) - { + memcpy (values_copy, values, sizeof (values_copy)); + if ((th->flags & UT_FLAG_PERCENTAGE) != 0) + { + int num = 0; gauge_t sum=0.0; - gauge_t percentage; + if (ds->ds_num == 1) + { + WARNING ("ut_check_one_threshold: The %s type has only one data " + "source, but you have configured to check this as a percentage. " + "That doesn't make much sense, because the percentage will always " + "be 100%%!", ds->type); + } + + /* Prepare `sum' and `num'. */ for (i = 0; i < ds->ds_num; i++) if (!isnan (values[i])) + { + num++; sum += values[i]; + } - if (sum == 0.0) + if ((num == 0) /* All data sources are undefined. */ + || (sum == 0.0)) /* Sum is zero, cannot calculate percentage. */ { - WARNING ("Values sum for percentage sums up to zero"); - return(STATE_WARNING); + for (i = 0; i < ds->ds_num; i++) + values_copy[i] = NAN; } - - percentage = 100.0 * values[0] / sum; - - if (ret_ds_index != NULL) - *ret_ds_index = 0; - - return ut_check_one_data_source (NULL, vl, th, &percentage, 0); - } + else /* We can actually calculate the percentage. */ + { + for (i = 0; i < ds->ds_num; i++) + values_copy[i] = 100.0 * values[i] / sum; + } + } /* if (UT_FLAG_PERCENTAGE) */ for (i = 0; i < ds->ds_num; i++) { int status; - status = ut_check_one_data_source (ds, vl, th, values, i); + status = ut_check_one_data_source (ds, vl, th, values_copy, i); if (ret < status) { ret = status; -- 2.30.2