summaryrefslogtreecommitdiffstats
path: root/database/rrdcalctemplate.c
diff options
context:
space:
mode:
Diffstat (limited to 'database/rrdcalctemplate.c')
-rw-r--r--database/rrdcalctemplate.c82
1 files changed, 74 insertions, 8 deletions
diff --git a/database/rrdcalctemplate.c b/database/rrdcalctemplate.c
index f7a085561..007b8c5d6 100644
--- a/database/rrdcalctemplate.c
+++ b/database/rrdcalctemplate.c
@@ -4,6 +4,59 @@
#include "rrd.h"
// ----------------------------------------------------------------------------
+
+static int rrdcalctemplate_is_there_label_restriction(RRDCALCTEMPLATE *rt, RRDHOST *host) {
+ if(!rt->labels)
+ return 0;
+
+ errno = 0;
+ struct label *move = host->labels.head;
+ char cmp[CONFIG_FILE_LINE_MAX+1];
+
+ int ret;
+ if(move) {
+ rrdhost_check_rdlock(host);
+ netdata_rwlock_rdlock(&host->labels.labels_rwlock);
+ while(move) {
+ snprintfz(cmp, CONFIG_FILE_LINE_MAX, "%s=%s", move->key, move->value);
+ if (simple_pattern_matches(rt->splabels, move->key) ||
+ simple_pattern_matches(rt->splabels, cmp)) {
+ break;
+ }
+ move = move->next;
+ }
+ netdata_rwlock_unlock(&host->labels.labels_rwlock);
+
+ if(!move) {
+ error("Health template '%s' cannot be applied, because the host %s does not have the label(s) '%s'",
+ rt->name,
+ host->hostname,
+ rt->labels
+ );
+ ret = 1;
+ } else {
+ ret = 0;
+ }
+ } else {
+ ret =0;
+ }
+
+ return ret;
+}
+
+static inline int rrdcalctemplate_test_additional_restriction(RRDCALCTEMPLATE *rt, RRDSET *st) {
+ if (rt->family_pattern && !simple_pattern_matches(rt->family_pattern, st->family))
+ return 0;
+
+ if (rt->module_pattern && !simple_pattern_matches(rt->module_pattern, st->module_name))
+ return 0;
+
+ if (rt->plugin_pattern && !simple_pattern_matches(rt->plugin_pattern, st->plugin_name))
+ return 0;
+
+ return 1;
+}
+
// RRDCALCTEMPLATE management
/**
* RRDCALC TEMPLATE LINK MATCHING
@@ -11,16 +64,21 @@
* @param rt is the template used to create the chart.
* @param st is the chart where the alarm will be attached.
*/
-void rrdcalctemplate_link_matching_test(RRDCALCTEMPLATE *rt, RRDSET *st, RRDHOST *host ) {
- if(rt->hash_context == st->hash_context && !strcmp(rt->context, st->context)
- && (!rt->family_pattern || simple_pattern_matches(rt->family_pattern, st->family))) {
- RRDCALC *rc = rrdcalc_create_from_template(host, rt, st->id);
- if(unlikely(!rc))
- info("Health tried to create alarm from template '%s' on chart '%s' of host '%s', but it failed", rt->name, st->id, host->hostname);
+void rrdcalctemplate_link_matching_test(RRDCALCTEMPLATE *rt, RRDSET *st, RRDHOST *host) {
+ if(rt->hash_context == st->hash_context && !strcmp(rt->context, st->context) &&
+ rrdcalctemplate_test_additional_restriction(rt, st) ) {
+ if (!rrdcalctemplate_is_there_label_restriction(rt, host)) {
+ RRDCALC *rc = rrdcalc_create_from_template(host, rt, st->id);
+ if (unlikely(!rc))
+ info("Health tried to create alarm from template '%s' on chart '%s' of host '%s', but it failed",
+ rt->name, st->id, host->hostname);
#ifdef NETDATA_INTERNAL_CHECKS
- else if(rc->rrdset != st && !rc->foreachdim) //When we have a template with foreadhdim, the child will be added to the index late
- error("Health alarm '%s.%s' should be linked to chart '%s', but it is not", rc->chart?rc->chart:"NOCHART", rc->name, st->id);
+ else if (rc->rrdset != st &&
+ !rc->foreachdim) //When we have a template with foreadhdim, the child will be added to the index late
+ error("Health alarm '%s.%s' should be linked to chart '%s', but it is not",
+ rc->chart ? rc->chart : "NOCHART", rc->name, st->id);
#endif
+ }
}
}
@@ -47,6 +105,12 @@ inline void rrdcalctemplate_free(RRDCALCTEMPLATE *rt) {
freez(rt->family_match);
simple_pattern_free(rt->family_pattern);
+ freez(rt->plugin_match);
+ simple_pattern_free(rt->plugin_pattern);
+
+ freez(rt->module_match);
+ simple_pattern_free(rt->module_pattern);
+
freez(rt->name);
freez(rt->exec);
freez(rt->recipient);
@@ -56,7 +120,9 @@ inline void rrdcalctemplate_free(RRDCALCTEMPLATE *rt) {
freez(rt->info);
freez(rt->dimensions);
freez(rt->foreachdim);
+ freez(rt->labels);
simple_pattern_free(rt->spdim);
+ simple_pattern_free(rt->splabels);
freez(rt);
}