@cryptotaxi247 / netdata-1 / commits / 06e2f349c

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: