summaryrefslogtreecommitdiffstats
path: root/exporting/prometheus/prometheus.c
diff options
context:
space:
mode:
Diffstat (limited to 'exporting/prometheus/prometheus.c')
-rw-r--r--exporting/prometheus/prometheus.c122
1 files changed, 59 insertions, 63 deletions
diff --git a/exporting/prometheus/prometheus.c b/exporting/prometheus/prometheus.c
index 7d632164..294d8ec2 100644
--- a/exporting/prometheus/prometheus.c
+++ b/exporting/prometheus/prometheus.c
@@ -9,9 +9,9 @@
static int is_matches_rrdset(struct instance *instance, RRDSET *st, SIMPLE_PATTERN *filter) {
if (instance->config.options & EXPORTING_OPTION_SEND_NAMES) {
- return simple_pattern_matches(filter, st->name);
+ return simple_pattern_matches(filter, rrdset_name(st));
}
- return simple_pattern_matches(filter, st->id);
+ return simple_pattern_matches(filter, rrdset_id(st));
}
/**
@@ -28,10 +28,6 @@ inline int can_send_rrdset(struct instance *instance, RRDSET *st, SIMPLE_PATTERN
RRDHOST *host = st->rrdhost;
#endif
- // Do not send anomaly rates charts.
- if (st->state && st->state->is_ar_chart)
- return 0;
-
if (unlikely(rrdset_flag_check(st, RRDSET_FLAG_EXPORTING_IGNORE)))
return 0;
@@ -48,8 +44,8 @@ inline int can_send_rrdset(struct instance *instance, RRDSET *st, SIMPLE_PATTERN
debug(
D_EXPORTING,
"EXPORTING: not sending chart '%s' of host '%s', because it is disabled for exporting.",
- st->id,
- host->hostname);
+ rrdset_id(st),
+ rrdhost_hostname(host));
return 0;
}
}
@@ -58,8 +54,8 @@ inline int can_send_rrdset(struct instance *instance, RRDSET *st, SIMPLE_PATTERN
debug(
D_EXPORTING,
"EXPORTING: not sending chart '%s' of host '%s', because it is not available for exporting.",
- st->id,
- host->hostname);
+ rrdset_id(st),
+ rrdhost_hostname(host));
return 0;
}
@@ -69,8 +65,8 @@ inline int can_send_rrdset(struct instance *instance, RRDSET *st, SIMPLE_PATTERN
debug(
D_EXPORTING,
"EXPORTING: not sending chart '%s' of host '%s' because its memory mode is '%s' and the exporting connector requires database access.",
- st->id,
- host->hostname,
+ rrdset_id(st),
+ rrdhost_hostname(host),
rrd_memory_mode_name(host->rrd_memory_mode));
return 0;
}
@@ -327,7 +323,7 @@ void format_host_labels_prometheus(struct instance *instance, RRDHOST *host)
.instance = instance,
.count = 0
};
- rrdlabels_walkthrough_read(host->host_labels, format_prometheus_label_callback, &tmp);
+ rrdlabels_walkthrough_read(host->rrdlabels, format_prometheus_label_callback, &tmp);
}
struct host_variables_callback_options {
@@ -349,11 +345,12 @@ struct host_variables_callback_options {
* @param data callback options.
* @return Returns 1 if the chart can be sent, 0 otherwise.
*/
-static int print_host_variables(RRDVAR *rv, void *data)
-{
+static int print_host_variables_callback(const DICTIONARY_ITEM *item __maybe_unused, void *rv_ptr __maybe_unused, void *data) {
+ const RRDVAR_ACQUIRED *rv = (const RRDVAR_ACQUIRED *)item;
+
struct host_variables_callback_options *opts = data;
- if (rv->options & (RRDVAR_OPTION_CUSTOM_HOST_VAR | RRDVAR_OPTION_CUSTOM_CHART_VAR)) {
+ if (rrdvar_flags(rv) & (RRDVAR_FLAG_CUSTOM_HOST_VAR | RRDVAR_FLAG_CUSTOM_CHART_VAR)) {
if (!opts->host_header_printed) {
opts->host_header_printed = 1;
@@ -366,7 +363,7 @@ static int print_host_variables(RRDVAR *rv, void *data)
if (isnan(value) || isinf(value)) {
if (opts->output_options & PROMETHEUS_OUTPUT_HELP)
buffer_sprintf(
- opts->wb, "# COMMENT variable \"%s\" is %s. Skipped.\n", rv->name, (isnan(value)) ? "NAN" : "INF");
+ opts->wb, "# COMMENT variable \"%s\" is %s. Skipped.\n", rrdvar_name(rv), (isnan(value)) ? "NAN" : "INF");
return 0;
}
@@ -378,7 +375,7 @@ static int print_host_variables(RRDVAR *rv, void *data)
label_post = "}";
}
- prometheus_name_copy(opts->name, rv->name, sizeof(opts->name));
+ prometheus_name_copy(opts->name, rrdvar_name(rv), sizeof(opts->name));
if (opts->output_options & PROMETHEUS_OUTPUT_TIMESTAMPS)
buffer_sprintf(
@@ -445,17 +442,17 @@ static void generate_as_collected_prom_help(BUFFER *wb, struct gen_parameters *p
wb,
"%s: chart \"%s\", context \"%s\", family \"%s\", dimension \"%s\", value * ",
p->suffix,
- (p->output_options & PROMETHEUS_OUTPUT_NAMES && p->st->name) ? p->st->name : p->st->id,
- p->st->context,
- p->st->family,
- (p->output_options & PROMETHEUS_OUTPUT_NAMES && p->rd->name) ? p->rd->name : p->rd->id);
+ (p->output_options & PROMETHEUS_OUTPUT_NAMES && p->st->name) ? rrdset_name(p->st) : rrdset_id(p->st),
+ rrdset_context(p->st),
+ rrdset_family(p->st),
+ (p->output_options & PROMETHEUS_OUTPUT_NAMES && p->rd->name) ? rrddim_name(p->rd) : rrddim_id(p->rd));
if (prometheus_collector)
buffer_sprintf(wb, "1 / 1");
else
buffer_sprintf(wb, COLLECTED_NUMBER_FORMAT " / " COLLECTED_NUMBER_FORMAT, p->rd->multiplier, p->rd->divisor);
- buffer_sprintf(wb, " %s %s (%s)\n", p->relation, p->st->units, p->type);
+ buffer_sprintf(wb, " %s %s (%s)\n", p->relation, rrdset_units(p->st), p->type);
}
/**
@@ -518,10 +515,9 @@ static void rrd_stats_api_v1_charts_allmetrics_prometheus(
PROMETHEUS_OUTPUT_OPTIONS output_options)
{
SIMPLE_PATTERN *filter = simple_pattern_create(filter_string, NULL, SIMPLE_PATTERN_EXACT);
- rrdhost_rdlock(host);
char hostname[PROMETHEUS_ELEMENT_MAX + 1];
- prometheus_label_copy(hostname, host->hostname, PROMETHEUS_ELEMENT_MAX);
+ prometheus_label_copy(hostname, rrdhost_hostname(host), PROMETHEUS_ELEMENT_MAX);
format_host_labels_prometheus(instance, host);
@@ -529,8 +525,8 @@ static void rrd_stats_api_v1_charts_allmetrics_prometheus(
wb,
"netdata_info{instance=\"%s\",application=\"%s\",version=\"%s\"",
hostname,
- host->program_name,
- host->program_version);
+ rrdhost_program_name(host),
+ rrdhost_program_version(host));
if (instance->labels_buffer && *buffer_tostring(instance->labels_buffer)) {
buffer_sprintf(wb, ",%s", buffer_tostring(instance->labels_buffer));
@@ -551,34 +547,34 @@ static void rrd_stats_api_v1_charts_allmetrics_prometheus(
// send custom variables set for the host
if (output_options & PROMETHEUS_OUTPUT_VARIABLES) {
- struct host_variables_callback_options opts = { .host = host,
- .wb = wb,
- .labels = (labels[0] == ',') ? &labels[1] : labels,
- .exporting_options = exporting_options,
- .output_options = output_options,
- .prefix = prefix,
- .now = now_realtime_sec(),
- .host_header_printed = 0 };
- foreach_host_variable_callback(host, print_host_variables, &opts);
+
+ struct host_variables_callback_options opts = {
+ .host = host,
+ .wb = wb,
+ .labels = (labels[0] == ',') ? &labels[1] : labels,
+ .exporting_options = exporting_options,
+ .output_options = output_options,
+ .prefix = prefix,
+ .now = now_realtime_sec(),
+ .host_header_printed = 0
+ };
+
+ rrdvar_walkthrough_read(host->rrdvars, print_host_variables_callback, &opts);
}
// for each chart
RRDSET *st;
- rrdset_foreach_read(st, host)
- {
+ rrdset_foreach_read(st, host) {
if (likely(can_send_rrdset(instance, st, filter))) {
- rrdset_rdlock(st);
-
char chart[PROMETHEUS_ELEMENT_MAX + 1];
char context[PROMETHEUS_ELEMENT_MAX + 1];
char family[PROMETHEUS_ELEMENT_MAX + 1];
char units[PROMETHEUS_ELEMENT_MAX + 1] = "";
- prometheus_label_copy(
- chart, (output_options & PROMETHEUS_OUTPUT_NAMES && st->name) ? st->name : st->id, PROMETHEUS_ELEMENT_MAX);
- prometheus_label_copy(family, st->family, PROMETHEUS_ELEMENT_MAX);
- prometheus_name_copy(context, st->context, PROMETHEUS_ELEMENT_MAX);
+ prometheus_label_copy(chart, (output_options & PROMETHEUS_OUTPUT_NAMES && st->name) ? rrdset_name(st) : rrdset_id(st), PROMETHEUS_ELEMENT_MAX);
+ prometheus_label_copy(family, rrdset_family(st), PROMETHEUS_ELEMENT_MAX);
+ prometheus_name_copy(context, rrdset_context(st), PROMETHEUS_ELEMENT_MAX);
int as_collected = (EXPORTING_OPTIONS_DATA_SOURCE(exporting_options) == EXPORTING_SOURCE_DATA_AS_COLLECTED);
int homogeneous = 1;
@@ -590,13 +586,13 @@ static void rrd_stats_api_v1_charts_allmetrics_prometheus(
if (rrdset_flag_check(st, RRDSET_FLAG_HETEROGENEOUS))
homogeneous = 0;
- if (st->module_name && !strcmp(st->module_name, "prometheus"))
+ if (!strcmp(rrdset_module_name(st), "prometheus"))
prometheus_collector = 1;
} else {
if (EXPORTING_OPTIONS_DATA_SOURCE(exporting_options) == EXPORTING_SOURCE_DATA_AVERAGE &&
!(output_options & PROMETHEUS_OUTPUT_HIDEUNITS))
prometheus_units_copy(
- units, st->units, PROMETHEUS_ELEMENT_MAX, output_options & PROMETHEUS_OUTPUT_OLDUNITS);
+ units, rrdset_units(st), PROMETHEUS_ELEMENT_MAX, output_options & PROMETHEUS_OUTPUT_OLDUNITS);
}
if (unlikely(output_options & PROMETHEUS_OUTPUT_HELP))
@@ -604,15 +600,14 @@ static void rrd_stats_api_v1_charts_allmetrics_prometheus(
wb,
"\n# COMMENT %s chart \"%s\", context \"%s\", family \"%s\", units \"%s\"\n",
(homogeneous) ? "homogeneous" : "heterogeneous",
- (output_options & PROMETHEUS_OUTPUT_NAMES && st->name) ? st->name : st->id,
- st->context,
- st->family,
- st->units);
+ (output_options & PROMETHEUS_OUTPUT_NAMES && st->name) ? rrdset_name(st) : rrdset_id(st),
+ rrdset_context(st),
+ rrdset_family(st),
+ rrdset_units(st));
// for each dimension
RRDDIM *rd;
- rrddim_foreach_read(rd, st)
- {
+ rrddim_foreach_read(rd, st) {
if (rd->collections_counter && !rrddim_flag_check(rd, RRDDIM_FLAG_OBSOLETE)) {
char dimension[PROMETHEUS_ELEMENT_MAX + 1];
char *suffix = "";
@@ -651,7 +646,7 @@ static void rrd_stats_api_v1_charts_allmetrics_prometheus(
prometheus_label_copy(
dimension,
- (output_options & PROMETHEUS_OUTPUT_NAMES && rd->name) ? rd->name : rd->id,
+ (output_options & PROMETHEUS_OUTPUT_NAMES && rd->name) ? rrddim_name(rd) : rrddim_id(rd),
PROMETHEUS_ELEMENT_MAX);
if (unlikely(output_options & PROMETHEUS_OUTPUT_HELP))
@@ -661,13 +656,14 @@ static void rrd_stats_api_v1_charts_allmetrics_prometheus(
buffer_sprintf(wb, "# TYPE %s_%s%s %s\n", prefix, context, suffix, p.type);
generate_as_collected_prom_metric(wb, &p, homogeneous, prometheus_collector);
- } else {
+ }
+ else {
// the dimensions of the chart, do not have the same algorithm, multiplier or divisor
// we create a metric per dimension
prometheus_name_copy(
dimension,
- (output_options & PROMETHEUS_OUTPUT_NAMES && rd->name) ? rd->name : rd->id,
+ (output_options & PROMETHEUS_OUTPUT_NAMES && rd->name) ? rrddim_name(rd) : rrddim_id(rd),
PROMETHEUS_ELEMENT_MAX);
if (unlikely(output_options & PROMETHEUS_OUTPUT_HELP))
@@ -679,7 +675,8 @@ static void rrd_stats_api_v1_charts_allmetrics_prometheus(
generate_as_collected_prom_metric(wb, &p, homogeneous, prometheus_collector);
}
- } else {
+ }
+ else {
// we need average or sum of the data
time_t first_time = instance->after;
@@ -694,7 +691,7 @@ static void rrd_stats_api_v1_charts_allmetrics_prometheus(
prometheus_label_copy(
dimension,
- (output_options & PROMETHEUS_OUTPUT_NAMES && rd->name) ? rd->name : rd->id,
+ (output_options & PROMETHEUS_OUTPUT_NAMES && rd->name) ? rrddim_name(rd) : rrddim_id(rd),
PROMETHEUS_ELEMENT_MAX);
if (unlikely(output_options & PROMETHEUS_OUTPUT_HELP))
@@ -705,8 +702,8 @@ static void rrd_stats_api_v1_charts_allmetrics_prometheus(
context,
units,
suffix,
- (output_options & PROMETHEUS_OUTPUT_NAMES && rd->name) ? rd->name : rd->id,
- st->units,
+ (output_options & PROMETHEUS_OUTPUT_NAMES && rd->name) ? rrddim_name(rd) : rrddim_id(rd),
+ rrdset_units(st),
(unsigned long long)first_time,
(unsigned long long)last_time);
@@ -746,12 +743,11 @@ static void rrd_stats_api_v1_charts_allmetrics_prometheus(
}
}
}
-
- rrdset_unlock(st);
+ rrddim_foreach_done(rd);
}
}
+ rrdset_foreach_done(st);
- rrdhost_unlock(host);
simple_pattern_free(filter);
}
@@ -809,7 +805,7 @@ static inline time_t prometheus_preparation(
buffer_sprintf(
wb,
"# COMMENT netdata \"%s\" to %sprometheus \"%s\", source \"%s\", last seen %lu %s, time range %lu to %lu\n\n",
- host->hostname,
+ rrdhost_hostname(host),
(first_seen) ? "FIRST SEEN " : "",
server,
mode,