when archiving metrics to backends use chart and dimension names instead of ids by defaut - added netdata.conf option to control this; also metrics for prometheus now may have dots in them fixes #2432
Costa Tsaousis (ktsaou) committed
Jul 8, 2017 at 00:09 UTC
06e2f349c53eb96dfaa5198482e8acf9b21f7e13
5 files changed
+49
-24
src/backends.c
+10
-8
@@ -26,6 +26,7 @@
26
#define BACKEND_SOURCE_DATA_AVERAGE 0x00000002
27
#define BACKEND_SOURCE_DATA_SUM 0x00000004
28
29
+int backend_send_names = 1;
30
31
// ----------------------------------------------------------------------------
32
// helper functions for backends
@@ -161,8 +162,8 @@ static inline int format_dimension_collected_graphite_plaintext(
162
, "%s.%s.%s.%s " COLLECTED_NUMBER_FORMAT " %u\n"
163
, prefix
164
, hostname
164
- , st->id
165
- , rd->id
165
+ , (backend_send_names && st->name)?st->name:st->id
166
+ , (backend_send_names && rd->name)?rd->name:rd->id
167
, rd->last_collected_value
168
, (uint32_t)rd->last_collected_time.tv_sec
169
);
@@ -192,8 +193,8 @@ static inline int format_dimension_stored_graphite_plaintext(
193
, "%s.%s.%s.%s " CALCULATED_NUMBER_FORMAT " %u\n"
194
, prefix
195
, hostname
195
- , st->id
196
- , rd->id
196
+ , (backend_send_names && st->name)?st->name:st->id
197
+ , (backend_send_names && rd->name)?rd->name:rd->id
198
, value
199
, (uint32_t) before
200
);
@@ -231,8 +232,8 @@ static inline int format_dimension_collected_opentsdb_telnet(
232
b
233
, "put %s.%s.%s %u " COLLECTED_NUMBER_FORMAT " host=%s%s%s\n"
234
, prefix
234
- , st->id
235
- , rd->id
235
+ , (backend_send_names && st->name)?st->name:st->id
236
+ , (backend_send_names && rd->name)?rd->name:rd->id
237
, (uint32_t)rd->last_collected_time.tv_sec
238
, rd->last_collected_value
239
, hostname
@@ -264,8 +265,8 @@ static inline int format_dimension_stored_opentsdb_telnet(
265
b
266
, "put %s.%s.%s %u " CALCULATED_NUMBER_FORMAT " host=%s%s%s\n"
267
, prefix
267
- , st->id
268
- , rd->id
268
+ , (backend_send_names && st->name)?st->name:st->id
269
+ , (backend_send_names && rd->name)?rd->name:rd->id
270
, (uint32_t) before
271
, value
272
, hostname
@@ -464,6 +465,7 @@ void *backends_main(void *ptr) {
465
int frequency = (int)config_get_number(CONFIG_SECTION_BACKEND, "update every", 10);
466
int buffer_on_failures = (int)config_get_number(CONFIG_SECTION_BACKEND, "buffer on failures", 10);
467
long timeoutms = config_get_number(CONFIG_SECTION_BACKEND, "timeout ms", frequency * 2 * 1000);
468
+ backend_send_names = config_get_boolean(CONFIG_SECTION_BACKEND, "send names instead of ids", backend_send_names);
469
470
charts_pattern = simple_pattern_create(config_get(CONFIG_SECTION_BACKEND, "send charts matching", "*"), SIMPLE_PATTERN_EXACT);
471
src/backends.h
+2
-1
@@ -1,6 +1,7 @@
1
#ifndef NETDATA_BACKENDS_H
2
#define NETDATA_BACKENDS_H 1
3
4
-void *backends_main(void *ptr);
4
+extern int backend_send_names;
5
+extern void *backends_main(void *ptr);
6
7
#endif /* NETDATA_BACKENDS_H */
src/rrd2json.c
+26
-10
@@ -176,7 +176,7 @@ static inline size_t prometheus_name_copy(char *d, const char *s, size_t usable)
176
for(n = 0; *s && n < usable ; d++, s++, n++) {
177
register char c = *s;
178
179
- if(unlikely(!isalnum(c))) *d = '_';
179
+ if(unlikely(c != '.' && !isalnum(c))) *d = '_';
180
else *d = c;
181
}
182
*d = '\0';
@@ -186,7 +186,7 @@ static inline size_t prometheus_name_copy(char *d, const char *s, size_t usable)
186
187
#define PROMETHEUS_ELEMENT_MAX 256
188
189
-void rrd_stats_api_v1_charts_allmetrics_prometheus(RRDHOST *host, BUFFER *wb, int help, int types) {
189
+void rrd_stats_api_v1_charts_allmetrics_prometheus(RRDHOST *host, BUFFER *wb, int help, int types, int names) {
190
rrdhost_rdlock(host);
191
192
char hostname[PROMETHEUS_ELEMENT_MAX + 1];
@@ -196,7 +196,11 @@ void rrd_stats_api_v1_charts_allmetrics_prometheus(RRDHOST *host, BUFFER *wb, in
196
RRDSET *st;
197
rrdset_foreach_read(st, host) {
198
char chart[PROMETHEUS_ELEMENT_MAX + 1];
199
- prometheus_name_copy(chart, st->id, PROMETHEUS_ELEMENT_MAX);
199
+
200
+ if(unlikely(names && st->name))
201
+ prometheus_name_copy(chart, st->name, PROMETHEUS_ELEMENT_MAX);
202
+ else
203
+ prometheus_name_copy(chart, st->id, PROMETHEUS_ELEMENT_MAX);
204
205
buffer_strcat(wb, "\n");
206
if(rrdset_is_available_for_backends(st)) {
@@ -207,7 +211,11 @@ void rrd_stats_api_v1_charts_allmetrics_prometheus(RRDHOST *host, BUFFER *wb, in
211
rrddim_foreach_read(rd, st) {
212
if(rd->collections_counter) {
213
char dimension[PROMETHEUS_ELEMENT_MAX + 1];
210
- prometheus_name_copy(dimension, rd->id, PROMETHEUS_ELEMENT_MAX);
214
+
215
+ if(unlikely(names && rd->name))
216
+ prometheus_name_copy(dimension, rd->name, PROMETHEUS_ELEMENT_MAX);
217
+ else
218
+ prometheus_name_copy(dimension, rd->id, PROMETHEUS_ELEMENT_MAX);
219
220
const char *t = "gauge", *h = "gives";
221
if(rd->algorithm == RRD_ALGORITHM_INCREMENTAL || rd->algorithm == RRD_ALGORITHM_PCENT_OVER_DIFF_TOTAL) {
@@ -216,7 +224,15 @@ void rrd_stats_api_v1_charts_allmetrics_prometheus(RRDHOST *host, BUFFER *wb, in
224
}
225
226
if(unlikely(help))
219
- buffer_sprintf(wb, "# HELP netdata chart %s, dimension %s, value * " COLLECTED_NUMBER_FORMAT " / " COLLECTED_NUMBER_FORMAT " %s %s (%s)\n", st->id, rd->id, rd->multiplier, rd->divisor, h, st->units, t);
227
+ buffer_sprintf(wb, "# HELP netdata chart %s, dimension %s, value * " COLLECTED_NUMBER_FORMAT " / " COLLECTED_NUMBER_FORMAT " %s %s (%s)\n"
228
+ , (names && st->name)?st->name:st->id
229
+ , (names && rd->name)?rd->name:rd->id
230
+ , rd->multiplier
231
+ , rd->divisor
232
+ , h
233
+ , st->units
234
+ , t
235
+ );
236
237
if(unlikely(types))
238
buffer_sprintf(wb, "# TYPE %s_%s %s\n", chart, dimension, t);
@@ -238,11 +254,11 @@ void rrd_stats_api_v1_charts_allmetrics_prometheus(RRDHOST *host, BUFFER *wb, in
254
rrdhost_unlock(host);
255
}
256
241
-void rrd_stats_api_v1_charts_allmetrics_prometheus_all_hosts(BUFFER *wb, int help, int types) {
257
+void rrd_stats_api_v1_charts_allmetrics_prometheus_all_hosts(BUFFER *wb, int help, int types, int names) {
258
RRDHOST *host;
259
rrd_rdlock();
260
rrdhost_foreach_read(host) {
245
- rrd_stats_api_v1_charts_allmetrics_prometheus(host, wb, help, types);
261
+ rrd_stats_api_v1_charts_allmetrics_prometheus(host, wb, help, types, names);
262
}
263
rrd_unlock();
264
}
@@ -275,7 +291,7 @@ void rrd_stats_api_v1_charts_allmetrics_shell(RRDHOST *host, BUFFER *wb) {
291
rrdset_foreach_read(st, host) {
292
calculated_number total = 0.0;
293
char chart[SHELL_ELEMENT_MAX + 1];
278
- shell_name_copy(chart, st->id, SHELL_ELEMENT_MAX);
294
+ shell_name_copy(chart, st->name?st->name:st->id, SHELL_ELEMENT_MAX);
295
296
buffer_sprintf(wb, "\n# chart: %s (name: %s)\n", st->id, st->name);
297
if(rrdset_is_available_for_viewers(st)) {
@@ -286,7 +302,7 @@ void rrd_stats_api_v1_charts_allmetrics_shell(RRDHOST *host, BUFFER *wb) {
302
rrddim_foreach_read(rd, st) {
303
if(rd->collections_counter) {
304
char dimension[SHELL_ELEMENT_MAX + 1];
289
- shell_name_copy(dimension, rd->id, SHELL_ELEMENT_MAX);
305
+ shell_name_copy(dimension, rd->name?rd->name:rd->id, SHELL_ELEMENT_MAX);
306
307
calculated_number n = rd->last_stored_value;
308
@@ -314,7 +330,7 @@ void rrd_stats_api_v1_charts_allmetrics_shell(RRDHOST *host, BUFFER *wb) {
330
if(!rc->rrdset) continue;
331
332
char chart[SHELL_ELEMENT_MAX + 1];
317
- shell_name_copy(chart, rc->rrdset->id, SHELL_ELEMENT_MAX);
333
+ shell_name_copy(chart, rc->rrdset->name?rc->rrdset->name:rc->rrdset->id, SHELL_ELEMENT_MAX);
334
335
char alarm[SHELL_ELEMENT_MAX + 1];
336
shell_name_copy(alarm, rc->name, SHELL_ELEMENT_MAX);
src/rrd2json.h
+2
-2
@@ -67,8 +67,8 @@ extern void rrd_stats_api_v1_charts(RRDHOST *host, BUFFER *wb);
67
68
extern void rrd_stats_api_v1_charts_allmetrics_json(RRDHOST *host, BUFFER *wb);
69
extern void rrd_stats_api_v1_charts_allmetrics_shell(RRDHOST *host, BUFFER *wb);
70
-extern void rrd_stats_api_v1_charts_allmetrics_prometheus(RRDHOST *host, BUFFER *wb, int help, int types);
71
-extern void rrd_stats_api_v1_charts_allmetrics_prometheus_all_hosts(BUFFER *wb, int help, int types);
70
+extern void rrd_stats_api_v1_charts_allmetrics_prometheus(RRDHOST *host, BUFFER *wb, int help, int types, int names);
71
+extern void rrd_stats_api_v1_charts_allmetrics_prometheus_all_hosts(BUFFER *wb, int help, int types, int names);
72
73
extern int rrdset2anything_api_v1(RRDSET *st, BUFFER *out, BUFFER *dimensions, uint32_t format, long points
74
, long long after, long long before, int group_method, uint32_t options
src/web_api_v1.c
+9
-3
@@ -208,7 +208,7 @@ inline int web_client_api_request_v1_charts(RRDHOST *host, struct web_client *w,
208
209
inline int web_client_api_request_v1_allmetrics(RRDHOST *host, struct web_client *w, char *url) {
210
int format = ALLMETRICS_SHELL;
211
- int help = 0, types = 0; // prometheus options
211
+ int help = 0, types = 0, names = backend_send_names; // prometheus options
212
213
while(url) {
214
char *value = mystrsep(&url, "?&");
@@ -242,6 +242,12 @@ inline int web_client_api_request_v1_allmetrics(RRDHOST *host, struct web_client
242
else
243
types = 0;
244
}
245
+ else if(!strcmp(name, "names")) {
246
+ if(!strcmp(value, "yes"))
247
+ names = 1;
248
+ else
249
+ names = 0;
250
+ }
251
}
252
253
buffer_flush(w->response.data);
@@ -260,12 +266,12 @@ inline int web_client_api_request_v1_allmetrics(RRDHOST *host, struct web_client
266
267
case ALLMETRICS_PROMETHEUS:
268
w->response.data->contenttype = CT_PROMETHEUS;
263
- rrd_stats_api_v1_charts_allmetrics_prometheus(host, w->response.data, help, types);
269
+ rrd_stats_api_v1_charts_allmetrics_prometheus(host, w->response.data, help, types, names);
270
return 200;
271
272
case ALLMETRICS_PROMETHEUS_ALL_HOSTS:
273
w->response.data->contenttype = CT_PROMETHEUS;
268
- rrd_stats_api_v1_charts_allmetrics_prometheus_all_hosts(w->response.data, help, types);
274
+ rrd_stats_api_v1_charts_allmetrics_prometheus_all_hosts(w->response.data, help, types, names);
275
return 200;
276
277
default: