@cryptotaxi247 / netdata-1 / commits / 3d52b08f1

new prometheus format #1497

Costa Tsaousis (ktsaou) committed Jul 8, 2017 at 22:20 UTC 3d52b08f10724a314de6c47f1ac7a972356e275d
3 files changed +30 -19
src/rrd2json.c
+28 -17
@@ -205,24 +205,38 @@ static inline size_t prometheus_label_copy(char *d, const char *s, size_t usable
205 }
206
207 #define PROMETHEUS_ELEMENT_MAX 256
208 +#define PROMETHEUS_LABELS_MAX 1024
209
209 -void rrd_stats_api_v1_charts_allmetrics_prometheus(RRDHOST *host, BUFFER *wb, int help, int types, int names) {
210 +void rrd_stats_api_v1_charts_allmetrics_prometheus(RRDHOST *host, BUFFER *wb, int allhosts, int help, int types, int names) {
211 rrdhost_rdlock(host);
212
213 char hostname[PROMETHEUS_ELEMENT_MAX + 1];
214 prometheus_label_copy(hostname, host->hostname, PROMETHEUS_ELEMENT_MAX);
215
216 + char labels[PROMETHEUS_LABELS_MAX + 1] = "";
217 + if(allhosts && host != localhost && host->tags)
218 + snprintfz(labels, PROMETHEUS_LABELS_MAX, ",instance=\"%s\",%s", hostname, host->tags);
219 + else if(host->tags && *(host->tags)) {
220 + if (!allhosts)
221 + buffer_sprintf(wb, "netdata_host_tags{%s} 1 %llu\n", host->tags, now_realtime_usec() / USEC_PER_MS);
222 + else
223 + snprintfz(labels, PROMETHEUS_LABELS_MAX, ",%s", host->tags);
224 + }
225 +
226 // for each chart
227 RRDSET *st;
228 rrdset_foreach_read(st, host) {
229 char chart[PROMETHEUS_ELEMENT_MAX + 1];
230 + char context[PROMETHEUS_ELEMENT_MAX + 1];
231 + char family[PROMETHEUS_ELEMENT_MAX + 1];
232
220 - if(unlikely(names && st->name))
221 - prometheus_name_copy(chart, st->name, PROMETHEUS_ELEMENT_MAX);
222 - else
223 - prometheus_name_copy(chart, st->id, PROMETHEUS_ELEMENT_MAX);
233 + prometheus_name_copy(chart, (names && st->name)?st->name:st->id, PROMETHEUS_ELEMENT_MAX);
234 + prometheus_name_copy(context, st->context, PROMETHEUS_ELEMENT_MAX);
235 + prometheus_name_copy(family, st->family, PROMETHEUS_ELEMENT_MAX);
236 +
237 + if(unlikely(help || types))
238 + buffer_strcat(wb, "\n");
239
225 - buffer_strcat(wb, "\n");
240 if(rrdset_is_available_for_backends(st)) {
241 rrdset_rdlock(st);
242
@@ -231,11 +245,7 @@ void rrd_stats_api_v1_charts_allmetrics_prometheus(RRDHOST *host, BUFFER *wb, in
245 rrddim_foreach_read(rd, st) {
246 if(rd->collections_counter) {
247 char dimension[PROMETHEUS_ELEMENT_MAX + 1];
234 -
235 - if(unlikely(names && rd->name))
236 - prometheus_name_copy(dimension, rd->name, PROMETHEUS_ELEMENT_MAX);
237 - else
238 - prometheus_name_copy(dimension, rd->id, PROMETHEUS_ELEMENT_MAX);
248 + prometheus_name_copy(dimension, (names && rd->name)?rd->name:rd->id, PROMETHEUS_ELEMENT_MAX);
249
250 const char *t = "gauge", *h = "gives";
251 if(rd->algorithm == RRD_ALGORITHM_INCREMENTAL || rd->algorithm == RRD_ALGORITHM_PCENT_OVER_DIFF_TOTAL) {
@@ -244,8 +254,10 @@ void rrd_stats_api_v1_charts_allmetrics_prometheus(RRDHOST *host, BUFFER *wb, in
254 }
255
256 if(unlikely(help))
247 - buffer_sprintf(wb, "# HELP netdata chart %s, dimension %s, value * " COLLECTED_NUMBER_FORMAT " / " COLLECTED_NUMBER_FORMAT " %s %s (%s)\n"
257 + buffer_sprintf(wb, "# HELP netdata chart \"%s\", context \"%s\", family \"%s\", dimension \"%s\", value * " COLLECTED_NUMBER_FORMAT " / " COLLECTED_NUMBER_FORMAT " %s %s (%s)\n"
258 , (names && st->name)?st->name:st->id
259 + , st->context
260 + , st->family
261 , (names && rd->name)?rd->name:rd->id
262 , rd->multiplier
263 , rd->divisor
@@ -255,15 +267,14 @@ void rrd_stats_api_v1_charts_allmetrics_prometheus(RRDHOST *host, BUFFER *wb, in
267 );
268
269 if(unlikely(types))
258 - buffer_sprintf(wb, "# TYPE %s_%s %s\n", chart, dimension, t);
270 + buffer_sprintf(wb, "# TYPE %s_%s_%s %s\n", context, family, dimension, t);
271
272 // calculated_number n = (calculated_number)rd->last_collected_value * (calculated_number)(abs(rd->multiplier)) / (calculated_number)(abs(rd->divisor));
273 // buffer_sprintf(wb, "%s.%s " CALCULATED_NUMBER_FORMAT " %llu\n", st->id, rd->id, n, timeval_msec(&rd->last_collected_time));
274
263 - buffer_sprintf(wb, "%s_%s{instance=\"%s\"} " COLLECTED_NUMBER_FORMAT " %llu\n",
264 - chart, dimension, hostname, rd->last_collected_value, timeval_msec(&rd->last_collected_time)
275 + buffer_sprintf(wb, "%s_%s_%s{chart=\"%s\"%s} " COLLECTED_NUMBER_FORMAT " %llu\n",
276 + context, family, dimension, chart, labels, rd->last_collected_value, timeval_msec(&rd->last_collected_time)
277 );
266 -
278 }
279 }
280
@@ -278,7 +289,7 @@ void rrd_stats_api_v1_charts_allmetrics_prometheus_all_hosts(BUFFER *wb, int hel
289 RRDHOST *host;
290 rrd_rdlock();
291 rrdhost_foreach_read(host) {
281 - rrd_stats_api_v1_charts_allmetrics_prometheus(host, wb, help, types, names);
292 + rrd_stats_api_v1_charts_allmetrics_prometheus(host, wb, 1, help, types, names);
293 }
294 rrd_unlock();
295 }
src/rrd2json.h
+1 -1
@@ -67,7 +67,7 @@ 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, int names);
70 +extern void rrd_stats_api_v1_charts_allmetrics_prometheus(RRDHOST *host, BUFFER *wb, int allhosts, 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
src/web_api_v1.c
+1 -1
@@ -266,7 +266,7 @@ 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;
269 - rrd_stats_api_v1_charts_allmetrics_prometheus(host, w->response.data, help, types, names);
269 + rrd_stats_api_v1_charts_allmetrics_prometheus(host, w->response.data, 0, help, types, names);
270 return 200;
271
272 case ALLMETRICS_PROMETHEUS_ALL_HOSTS: