summaryrefslogtreecommitdiffstats
path: root/collectors/plugins.d/pluginsd_parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'collectors/plugins.d/pluginsd_parser.c')
-rw-r--r--collectors/plugins.d/pluginsd_parser.c99
1 files changed, 57 insertions, 42 deletions
diff --git a/collectors/plugins.d/pluginsd_parser.c b/collectors/plugins.d/pluginsd_parser.c
index 22b77362..f014a29d 100644
--- a/collectors/plugins.d/pluginsd_parser.c
+++ b/collectors/plugins.d/pluginsd_parser.c
@@ -125,26 +125,36 @@ PARSER_RC pluginsd_dimension_action(void *user, RRDSET *st, char *id, char *name
UNUSED(algorithm);
RRDDIM *rd = rrddim_add(st, id, name, multiplier, divisor, algorithm_type);
- rrddim_flag_clear(rd, RRDDIM_FLAG_HIDDEN);
+ int unhide_dimension = 1;
+
rrddim_flag_clear(rd, RRDDIM_FLAG_DONT_DETECT_RESETS_OR_OVERFLOWS);
if (options && *options) {
if (strstr(options, "obsolete") != NULL)
rrddim_is_obsolete(st, rd);
else
rrddim_isnot_obsolete(st, rd);
- if (strstr(options, "hidden") != NULL) {
- rrddim_flag_set(rd, RRDDIM_FLAG_HIDDEN);
- (void) sql_set_dimension_option(&rd->state->metric_uuid, "hidden");
- }
- else
- (void) sql_set_dimension_option(&rd->state->metric_uuid, NULL);
+
+ unhide_dimension = !strstr(options, "hidden");
+
if (strstr(options, "noreset") != NULL)
rrddim_flag_set(rd, RRDDIM_FLAG_DONT_DETECT_RESETS_OR_OVERFLOWS);
if (strstr(options, "nooverflow") != NULL)
rrddim_flag_set(rd, RRDDIM_FLAG_DONT_DETECT_RESETS_OR_OVERFLOWS);
- } else {
- (void) sql_set_dimension_option(&rd->state->metric_uuid, NULL);
+ } else
rrddim_isnot_obsolete(st, rd);
+
+ if (likely(unhide_dimension)) {
+ rrddim_flag_clear(rd, RRDDIM_FLAG_HIDDEN);
+ if (rrddim_flag_check(rd, RRDDIM_FLAG_META_HIDDEN)) {
+ (void)sql_set_dimension_option(&rd->state->metric_uuid, NULL);
+ rrddim_flag_clear(rd, RRDDIM_FLAG_META_HIDDEN);
+ }
+ } else {
+ rrddim_flag_set(rd, RRDDIM_FLAG_HIDDEN);
+ if (!rrddim_flag_check(rd, RRDDIM_FLAG_META_HIDDEN)) {
+ (void)sql_set_dimension_option(&rd->state->metric_uuid, "hidden");
+ rrddim_flag_set(rd, RRDDIM_FLAG_META_HIDDEN);
+ }
}
return PARSER_RC_OK;
}
@@ -725,6 +735,11 @@ PARSER_RC metalog_pluginsd_host(char **words, void *user, PLUGINSD_ACTION *plug
return PARSER_RC_OK;
}
+static void pluginsd_process_thread_cleanup(void *ptr) {
+ PARSER *parser = (PARSER *)ptr;
+ parser_destroy(parser);
+}
+
// New plugins.d parser
inline size_t pluginsd_process(RRDHOST *host, struct plugind *cd, FILE *fp, int trust_durations)
@@ -743,50 +758,50 @@ inline size_t pluginsd_process(RRDHOST *host, struct plugind *cd, FILE *fp, int
}
clearerr(fp);
- PARSER_USER_OBJECT *user = callocz(1, sizeof(*user));
- ((PARSER_USER_OBJECT *) user)->enabled = cd->enabled;
- ((PARSER_USER_OBJECT *) user)->host = host;
- ((PARSER_USER_OBJECT *) user)->cd = cd;
- ((PARSER_USER_OBJECT *) user)->trust_durations = trust_durations;
-
- PARSER *parser = parser_init(host, user, fp, PARSER_INPUT_SPLIT);
-
- if (unlikely(!parser)) {
- error("Failed to initialize parser");
- cd->serial_failures++;
- return 0;
- }
-
- parser->plugins_action->begin_action = &pluginsd_begin_action;
- parser->plugins_action->flush_action = &pluginsd_flush_action;
- parser->plugins_action->end_action = &pluginsd_end_action;
- parser->plugins_action->disable_action = &pluginsd_disable_action;
- parser->plugins_action->variable_action = &pluginsd_variable_action;
- parser->plugins_action->dimension_action = &pluginsd_dimension_action;
- parser->plugins_action->label_action = &pluginsd_label_action;
- parser->plugins_action->overwrite_action = &pluginsd_overwrite_action;
- parser->plugins_action->chart_action = &pluginsd_chart_action;
- parser->plugins_action->set_action = &pluginsd_set_action;
-
- user->parser = parser;
+ PARSER_USER_OBJECT user = {
+ .enabled = cd->enabled,
+ .host = host,
+ .cd = cd,
+ .trust_durations = trust_durations
+ };
+
+ PARSER *parser = parser_init(host, &user, fp, PARSER_INPUT_SPLIT);
+
+ // this keeps the parser with its current value
+ // so, parser needs to be allocated before pushing it
+ netdata_thread_cleanup_push(pluginsd_process_thread_cleanup, parser);
+
+ parser->plugins_action->begin_action = &pluginsd_begin_action;
+ parser->plugins_action->flush_action = &pluginsd_flush_action;
+ parser->plugins_action->end_action = &pluginsd_end_action;
+ parser->plugins_action->disable_action = &pluginsd_disable_action;
+ parser->plugins_action->variable_action = &pluginsd_variable_action;
+ parser->plugins_action->dimension_action = &pluginsd_dimension_action;
+ parser->plugins_action->label_action = &pluginsd_label_action;
+ parser->plugins_action->overwrite_action = &pluginsd_overwrite_action;
+ parser->plugins_action->chart_action = &pluginsd_chart_action;
+ parser->plugins_action->set_action = &pluginsd_set_action;
+ parser->plugins_action->clabel_commit_action = &pluginsd_clabel_commit_action;
+ parser->plugins_action->clabel_action = &pluginsd_clabel_action;
+
+ user.parser = parser;
while (likely(!parser_next(parser))) {
if (unlikely(netdata_exit || parser_action(parser, NULL)))
break;
}
- info("PARSER ended");
-
- parser_destroy(parser);
- cd->enabled = ((PARSER_USER_OBJECT *) user)->enabled;
- size_t count = ((PARSER_USER_OBJECT *) user)->count;
+ // free parser with the pop function
+ netdata_thread_cleanup_pop(1);
- freez(user);
+ cd->enabled = user.enabled;
+ size_t count = user.count;
if (likely(count)) {
cd->successful_collections += count;
cd->serial_failures = 0;
- } else
+ }
+ else
cd->serial_failures++;
return count;