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: