From 0701716aeedbcfaccf29b3e0c7d2371055f84df9 Mon Sep 17 00:00:00 2001 From: Aaron Brady Date: Wed, 2 Mar 2011 23:10:26 +0000 Subject: [PATCH] Added "PersistOK" option to threshold to send notifications, even for OKAYs. --- src/collectd-threshold.pod | 7 +++++++ src/threshold.c | 14 +++++++++----- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/collectd-threshold.pod b/src/collectd-threshold.pod index 5d1a645c..02e41b8b 100644 --- a/src/collectd-threshold.pod +++ b/src/collectd-threshold.pod @@ -154,6 +154,13 @@ This applies to missing values, too: If set to B a notification about a missing value is generated once every B seconds. If set to B only one such notification is generated until the value appears again. +=item B B|B + +Sets how OKAY notifications act. If set to B one notification will be +generated for each value that is in the acceptable range. If set to B +(the default) then a notification is only generated if a value is in range but +the previous value was not. + =item B B|B If set to B, the minimum and maximum values given are interpreted as diff --git a/src/threshold.c b/src/threshold.c index 342d08ac..d4cfd6ea 100644 --- a/src/threshold.c +++ b/src/threshold.c @@ -39,6 +39,7 @@ #define UT_FLAG_PERSIST 0x02 #define UT_FLAG_PERCENTAGE 0x04 #define UT_FLAG_INTERESTING 0x08 +#define UT_FLAG_PERSIST_OK 0x10 typedef struct threshold_s { char host[DATA_MAX_NAME_LEN]; @@ -378,6 +379,8 @@ static int ut_config_type (const threshold_t *th_orig, oconfig_item_t *ci) status = cf_util_get_flag (option, &th.flags, UT_FLAG_INVERT); else if (strcasecmp ("Persist", option->key) == 0) status = cf_util_get_flag (option, &th.flags, UT_FLAG_PERSIST); + else if (strcasecmp ("PersistOK", option->key) == 0) + status = cf_util_get_flag (option, &th.flags, UT_FLAG_PERSIST_OK); else if (strcasecmp ("Percentage", option->key) == 0) status = cf_util_get_flag (option, &th.flags, UT_FLAG_PERCENTAGE); else if (strcasecmp ("Hits", option->key) == 0) @@ -543,8 +546,9 @@ static int ut_report_state (const data_set_t *ds, if ( (th->hits != 0) ) { int hits = uc_get_hits(ds,vl); - /* The STATE_OKAY always reset hits, or if hits reaise the limit */ - if ( (state == STATE_OKAY) || (hits > th->hits) ) + /* STATE_OKAY resets hits unless PERSIST_OK flag is set. Hits resets if + * threshold is hit. */ + if ( ( (state == STATE_OKAY) && ((th->flags & UT_FLAG_PERSIST_OK) == 0) ) || (hits > th->hits) ) { DEBUG("ut_report_state: reset uc_get_hits = 0"); uc_set_hits(ds,vl,0); /* reset hit counter and notify */ @@ -557,13 +561,13 @@ static int ut_report_state (const data_set_t *ds, state_old = uc_get_state (ds, vl); - /* If the state didn't change, only report if `persistent' is specified and - * the state is not `okay'. */ + /* If the state didn't change, report if `persistent' is specified. If the + * state is `okay', then only report if `persist_ok` flag is set. */ if (state == state_old) { if ((th->flags & UT_FLAG_PERSIST) == 0) return (0); - else if (state == STATE_OKAY) + else if ( (state == STATE_OKAY) && ((th->flags & UT_FLAG_PERSIST_OK) == 0) ) return (0); } -- 2.30.2