diff options
Diffstat (limited to '')
-rw-r--r-- | src/database/rrdfunctions-exporters.c | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/src/database/rrdfunctions-exporters.c b/src/database/rrdfunctions-exporters.c new file mode 100644 index 000000000..afcdc8a98 --- /dev/null +++ b/src/database/rrdfunctions-exporters.c @@ -0,0 +1,164 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +#define NETDATA_RRD_INTERNALS + +#include "rrdfunctions-internals.h" +#include "rrdfunctions-exporters.h" + +void rrd_chart_functions_expose_rrdpush(RRDSET *st, BUFFER *wb) { + if(!st->functions_view) + return; + + struct rrd_host_function *t; + dfe_start_read(st->functions_view, t) { + if(t->options & RRD_FUNCTION_DYNCFG) continue; + + buffer_sprintf(wb + , PLUGINSD_KEYWORD_FUNCTION " \"%s\" %d \"%s\" \"%s\" "HTTP_ACCESS_FORMAT" %d\n" + , t_dfe.name + , t->timeout + , string2str(t->help) + , string2str(t->tags) + , (HTTP_ACCESS_FORMAT_CAST)t->access + , t->priority + ); + } + dfe_done(t); +} + +void rrd_global_functions_expose_rrdpush(RRDHOST *host, BUFFER *wb, bool dyncfg) { + rrdhost_flag_clear(host, RRDHOST_FLAG_GLOBAL_FUNCTIONS_UPDATED); + + size_t configs = 0; + + struct rrd_host_function *tmp; + dfe_start_read(host->functions, tmp) { + if(tmp->options & RRD_FUNCTION_LOCAL) continue; + if(tmp->options & RRD_FUNCTION_DYNCFG) { + // we should not send dyncfg to this parent + configs++; + continue; + } + + buffer_sprintf(wb + , PLUGINSD_KEYWORD_FUNCTION " GLOBAL \"%s\" %d \"%s\" \"%s\" "HTTP_ACCESS_FORMAT" %d\n" + , tmp_dfe.name + , tmp->timeout + , string2str(tmp->help) + , string2str(tmp->tags) + , (HTTP_ACCESS_FORMAT_CAST)tmp->access + , tmp->priority + ); + } + dfe_done(tmp); + + if(dyncfg && configs) + dyncfg_add_streaming(wb); +} + +static void functions2json(DICTIONARY *functions, BUFFER *wb) { + struct rrd_host_function *t; + dfe_start_read(functions, t) { + if (!rrd_collector_running(t->collector)) continue; + if(t->options & RRD_FUNCTION_DYNCFG) continue; + + buffer_json_member_add_object(wb, t_dfe.name); + { + buffer_json_member_add_string_or_empty(wb, "help", string2str(t->help)); + buffer_json_member_add_int64(wb, "timeout", (int64_t) t->timeout); + + char options[65]; + snprintfz( + options, 64 + , "%s%s" + , (t->options & RRD_FUNCTION_LOCAL) ? "LOCAL " : "" + , (t->options & RRD_FUNCTION_GLOBAL) ? "GLOBAL" : "" + ); + + buffer_json_member_add_string_or_empty(wb, "options", options); + buffer_json_member_add_string_or_empty(wb, "tags", string2str(t->tags)); + http_access2buffer_json_array(wb, "access", t->access); + buffer_json_member_add_uint64(wb, "priority", t->priority); + } + buffer_json_object_close(wb); + } + dfe_done(t); +} + +void chart_functions2json(RRDSET *st, BUFFER *wb) { + if(!st || !st->functions_view) return; + + functions2json(st->functions_view, wb); +} + +void host_functions2json(RRDHOST *host, BUFFER *wb) { + if(!host || !host->functions) return; + + buffer_json_member_add_object(wb, "functions"); + + struct rrd_host_function *t; + dfe_start_read(host->functions, t) { + if(!rrd_collector_running(t->collector)) continue; + if(t->options & RRD_FUNCTION_DYNCFG) continue; + + buffer_json_member_add_object(wb, t_dfe.name); + { + buffer_json_member_add_string(wb, "help", string2str(t->help)); + buffer_json_member_add_int64(wb, "timeout", t->timeout); + buffer_json_member_add_array(wb, "options"); + { + if (t->options & RRD_FUNCTION_GLOBAL) + buffer_json_add_array_item_string(wb, "GLOBAL"); + if (t->options & RRD_FUNCTION_LOCAL) + buffer_json_add_array_item_string(wb, "LOCAL"); + } + buffer_json_array_close(wb); + buffer_json_member_add_string(wb, "tags", string2str(t->tags)); + http_access2buffer_json_array(wb, "access", t->access); + buffer_json_member_add_uint64(wb, "priority", t->priority); + } + buffer_json_object_close(wb); + } + dfe_done(t); + + buffer_json_object_close(wb); +} + +void chart_functions_to_dict(DICTIONARY *rrdset_functions_view, DICTIONARY *dst, void *value, size_t value_size) { + if(!rrdset_functions_view || !dst) return; + + struct rrd_host_function *t; + dfe_start_read(rrdset_functions_view, t) { + if(!rrd_collector_running(t->collector)) continue; + if(t->options & RRD_FUNCTION_DYNCFG) continue; + + dictionary_set(dst, t_dfe.name, value, value_size); + } + dfe_done(t); +} + +void host_functions_to_dict(RRDHOST *host, DICTIONARY *dst, void *value, size_t value_size, + STRING **help, STRING **tags, HTTP_ACCESS *access, int *priority) { + if(!host || !host->functions || !dictionary_entries(host->functions) || !dst) return; + + struct rrd_host_function *t; + dfe_start_read(host->functions, t) { + if(!rrd_collector_running(t->collector)) continue; + if(t->options & RRD_FUNCTION_DYNCFG) continue; + + if(help) + *help = t->help; + + if(tags) + *tags = t->tags; + + if(access) + *access = t->access; + + if(priority) + *priority = t->priority; + + dictionary_set(dst, t_dfe.name, value, value_size); + } + dfe_done(t); +} |