summaryrefslogtreecommitdiffstats
path: root/health
diff options
context:
space:
mode:
authorEmmanuel Vasilakis <mrzammler@mm.st>2023-02-08 15:12:00 +0200
committerGitHub <noreply@github.com>2023-02-08 15:12:00 +0200
commit18655e8f9552f70ad79cb44cc658a736239296ed (patch)
treea0853ee974393d71a6465e189b17ac4f7ff8a7a1 /health
parent5521e5be71023bec34d7a39dcd959fefedef4f9b (diff)
Only load required charts for rrdvars (#14443)
* store only rrdvars health needs * make it simpler * only set * fix codacy
Diffstat (limited to 'health')
-rw-r--r--health/health.c32
-rw-r--r--health/health.h1
-rw-r--r--health/health_config.c54
3 files changed, 65 insertions, 22 deletions
diff --git a/health/health.c b/health/health.c
index b34f54ab50..8dc76e3100 100644
--- a/health/health.c
+++ b/health/health.c
@@ -17,6 +17,11 @@
#error WORKER_UTILIZATION_MAX_JOB_TYPES has to be at least 10
#endif
+unsigned int default_health_enabled = 1;
+char *silencers_filename;
+SIMPLE_PATTERN *conf_enabled_alarms = NULL;
+DICTIONARY *health_rrdvars;
+
static bool prepare_command(BUFFER *wb,
const char *exec,
const char *recipient,
@@ -157,10 +162,6 @@ static bool prepare_command(BUFFER *wb,
return true;
}
-unsigned int default_health_enabled = 1;
-char *silencers_filename;
-SIMPLE_PATTERN *conf_enabled_alarms = NULL;
-
// the queue of executed alarm notifications that haven't been waited for yet
static struct {
ALARM_ENTRY *head; // oldest
@@ -925,19 +926,6 @@ static void health_execute_delayed_initializations(RRDHOST *host) {
worker_is_busy(WORKER_HEALTH_JOB_DELAYED_INIT_RRDSET);
- if(!st->rrdfamily)
- st->rrdfamily = rrdfamily_add_and_acquire(host, rrdset_family(st));
-
- if(!st->rrdvars)
- st->rrdvars = rrdvariables_create();
-
- rrddimvar_index_init(st);
-
- rrdsetvar_add_and_leave_released(st, "last_collected_t", RRDVAR_TYPE_TIME_T, &st->last_collected_time.tv_sec, RRDVAR_FLAG_NONE);
- rrdsetvar_add_and_leave_released(st, "green", RRDVAR_TYPE_CALCULATED, &st->green, RRDVAR_FLAG_NONE);
- rrdsetvar_add_and_leave_released(st, "red", RRDVAR_TYPE_CALCULATED, &st->red, RRDVAR_FLAG_NONE);
- rrdsetvar_add_and_leave_released(st, "update_every", RRDVAR_TYPE_INT, &st->update_every, RRDVAR_FLAG_NONE);
-
rrdcalc_link_matching_alerts_to_rrdset(st);
rrdcalctemplate_link_matching_templates_to_rrdset(st);
@@ -948,19 +936,19 @@ static void health_execute_delayed_initializations(RRDHOST *host) {
worker_is_busy(WORKER_HEALTH_JOB_DELAYED_INIT_RRDDIM);
- rrddimvar_add_and_leave_released(rd, RRDVAR_TYPE_CALCULATED, NULL, NULL, &rd->last_stored_value, RRDVAR_FLAG_NONE);
- rrddimvar_add_and_leave_released(rd, RRDVAR_TYPE_COLLECTED, NULL, "_raw", &rd->last_collected_value, RRDVAR_FLAG_NONE);
- rrddimvar_add_and_leave_released(rd, RRDVAR_TYPE_TIME_T, NULL, "_last_collected_t", &rd->last_collected_time.tv_sec, RRDVAR_FLAG_NONE);
-
RRDCALCTEMPLATE *rt;
foreach_rrdcalctemplate_read(host, rt) {
if(!rt->foreach_dimension_pattern)
continue;
- if(rrdcalctemplate_check_rrdset_conditions(rt, st, host))
+ if(rrdcalctemplate_check_rrdset_conditions(rt, st, host)) {
rrdcalctemplate_check_rrddim_conditions_and_link(rt, st, rd, host);
+ }
}
foreach_rrdcalctemplate_done(rt);
+
+ if(health_variable_check(health_rrdvars, st, rd))
+ rrdvar_store_for_chart(host, st);
}
rrddim_foreach_done(rd);
}
diff --git a/health/health.h b/health/health.h
index 50c3e34528..902e36c622 100644
--- a/health/health.h
+++ b/health/health.h
@@ -32,6 +32,7 @@ extern unsigned int default_health_enabled;
extern char *silencers_filename;
extern SIMPLE_PATTERN *conf_enabled_alarms;
+extern DICTIONARY *health_rrdvars;
void health_init(void);
diff --git a/health/health_config.c b/health/health_config.c
index 55d5e10ebd..1d2b2da297 100644
--- a/health/health_config.c
+++ b/health/health_config.c
@@ -185,6 +185,51 @@ static inline int health_parse_repeat(
return 1;
}
+static inline int isvariableterm(const char s) {
+ if(isalnum(s) || s == '.' || s == '_')
+ return 0;
+
+ return 1;
+}
+
+static inline void parse_variables_and_store_in_health_rrdvars(char *value, size_t len) {
+ const char *s = value;
+ char buffer[RRDVAR_MAX_LENGTH];
+
+ // $
+ while (*s) {
+ if(*s == '$') {
+ size_t i = 0;
+ s++;
+
+ if(*s == '{') {
+ // ${variable_name}
+
+ s++;
+ while (*s && *s != '}' && i < len)
+ buffer[i++] = *s++;
+
+ if(*s == '}')
+ s++;
+ }
+ else {
+ // $variable_name
+
+ while (*s && !isvariableterm(*s) && i < len)
+ buffer[i++] = *s++;
+ }
+
+ buffer[i] = '\0';
+
+ //TODO: check and try to store only variables
+ STRING *name_string = rrdvar_name_to_string(buffer);
+ rrdvar_add("health", health_rrdvars, name_string, RRDVAR_TYPE_CALCULATED, RRDVAR_FLAG_CONFIG_VAR, NULL);
+ string_freez(name_string);
+ } else
+ s++;
+ }
+}
+
/**
* Health pattern from Foreach
*
@@ -769,6 +814,7 @@ static int health_readfile(const char *filename, void *data) {
error("Health configuration at line %zu of file '%s' for alarm '%s' at key '%s' has unparse-able expression '%s': %s at '%s'",
line, filename, rrdcalc_name(rc), key, value, expression_strerror(error), failed_at);
}
+ parse_variables_and_store_in_health_rrdvars(value, HEALTH_CONF_MAX_LINE);
}
else if(hash == hash_warn && !strcasecmp(key, HEALTH_WARN_KEY)) {
alert_cfg->warn = string_strdupz(value);
@@ -779,6 +825,7 @@ static int health_readfile(const char *filename, void *data) {
error("Health configuration at line %zu of file '%s' for alarm '%s' at key '%s' has unparse-able expression '%s': %s at '%s'",
line, filename, rrdcalc_name(rc), key, value, expression_strerror(error), failed_at);
}
+ parse_variables_and_store_in_health_rrdvars(value, HEALTH_CONF_MAX_LINE);
}
else if(hash == hash_crit && !strcasecmp(key, HEALTH_CRIT_KEY)) {
alert_cfg->crit = string_strdupz(value);
@@ -789,6 +836,7 @@ static int health_readfile(const char *filename, void *data) {
error("Health configuration at line %zu of file '%s' for alarm '%s' at key '%s' has unparse-able expression '%s': %s at '%s'",
line, filename, rrdcalc_name(rc), key, value, expression_strerror(error), failed_at);
}
+ parse_variables_and_store_in_health_rrdvars(value, HEALTH_CONF_MAX_LINE);
}
else if(hash == hash_exec && !strcasecmp(key, HEALTH_EXEC_KEY)) {
alert_cfg->exec = string_strdupz(value);
@@ -1031,6 +1079,7 @@ static int health_readfile(const char *filename, void *data) {
error("Health configuration at line %zu of file '%s' for template '%s' at key '%s' has unparse-able expression '%s': %s at '%s'",
line, filename, rrdcalctemplate_name(rt), key, value, expression_strerror(error), failed_at);
}
+ parse_variables_and_store_in_health_rrdvars(value, HEALTH_CONF_MAX_LINE);
}
else if(hash == hash_warn && !strcasecmp(key, HEALTH_WARN_KEY)) {
alert_cfg->warn = string_strdupz(value);
@@ -1041,6 +1090,7 @@ static int health_readfile(const char *filename, void *data) {
error("Health configuration at line %zu of file '%s' for template '%s' at key '%s' has unparse-able expression '%s': %s at '%s'",
line, filename, rrdcalctemplate_name(rt), key, value, expression_strerror(error), failed_at);
}
+ parse_variables_and_store_in_health_rrdvars(value, HEALTH_CONF_MAX_LINE);
}
else if(hash == hash_crit && !strcasecmp(key, HEALTH_CRIT_KEY)) {
alert_cfg->crit = string_strdupz(value);
@@ -1051,6 +1101,7 @@ static int health_readfile(const char *filename, void *data) {
error("Health configuration at line %zu of file '%s' for template '%s' at key '%s' has unparse-able expression '%s': %s at '%s'",
line, filename, rrdcalctemplate_name(rt), key, value, expression_strerror(error), failed_at);
}
+ parse_variables_and_store_in_health_rrdvars(value, HEALTH_CONF_MAX_LINE);
}
else if(hash == hash_exec && !strcasecmp(key, HEALTH_EXEC_KEY)) {
alert_cfg->exec = string_strdupz(value);
@@ -1185,6 +1236,9 @@ void health_readdir(RRDHOST *host, const char *user_path, const char *stock_path
stock_path = user_path;
}
+ if (!health_rrdvars)
+ health_rrdvars = health_rrdvariables_create();
+
recursive_config_double_dir_load(user_path, stock_path, subpath, health_readfile, (void *) host, 0);
log_health("[%s]: Read health configuration.", rrdhost_hostname(host));
sql_store_hashes = 0;