X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Futils_threshold.c;h=fa8c8f9fde2522c2114a41206311254bcd01c529;hb=bacc5b925ea8c63eb57dc4b55f4b4abbe1b1d07c;hp=d51789db22ace6273d7eaf5b47d59c44aa59fed1;hpb=1f6c7a61f6984dc1734838508ed385e92cafc000;p=collectd.git 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;