diff options
Diffstat (limited to 'health/health_json.c')
-rw-r--r-- | health/health_json.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/health/health_json.c b/health/health_json.c index e923b05c..f6ff1b1a 100644 --- a/health/health_json.c +++ b/health/health_json.c @@ -231,6 +231,43 @@ static inline void health_rrdcalc2json_nolock(RRDHOST *host, BUFFER *wb, RRDCALC // //} +void health_aggregate_alarms(RRDHOST *host, BUFFER *wb, BUFFER* contexts, RRDCALC_STATUS status) { + RRDCALC *rc; + int numberOfAlarms = 0; + char *tok = NULL; + char *p = NULL; + + rrdhost_rdlock(host); + + if (contexts) { + p = (char*)buffer_tostring(contexts); + while(p && *p && (tok = mystrsep(&p, ", |"))) { + if(!*tok) continue; + + for(rc = host->alarms; rc ; rc = rc->next) { + if(unlikely(!rc->rrdset || !rc->rrdset->last_collected_time.tv_sec)) + continue; + if(unlikely(rc->rrdset && rc->rrdset->hash_context == simple_hash(tok) + && !strcmp(rc->rrdset->context, tok) + && ((status==RRDCALC_STATUS_RAISED)?(rc->status >= RRDCALC_STATUS_WARNING):rc->status == status))) + numberOfAlarms++; + } + } + } + else { + for(rc = host->alarms; rc ; rc = rc->next) { + if(unlikely(!rc->rrdset || !rc->rrdset->last_collected_time.tv_sec)) + continue; + + if(unlikely((status==RRDCALC_STATUS_RAISED)?(rc->status >= RRDCALC_STATUS_WARNING):rc->status == status)) + numberOfAlarms++; + } + } + + buffer_sprintf(wb, "%d", numberOfAlarms); + rrdhost_unlock(host); +} + void health_alarms2json(RRDHOST *host, BUFFER *wb, int all) { int i; |