updated prometheus support according to #1497
Costa Tsaousis (ktsaou) committed
Jan 3, 2017 at 22:43 UTC
e76ac887edfadd1b1ee9654a7525ff34d7f107a7
4 files changed
+37
-5
src/rrd2json.c
+31
-3
@@ -124,20 +124,42 @@ void rrd_stats_api_v1_charts(BUFFER *wb)
124
);
125
}
126
127
+static inline size_t prometheus_name_copy(char *d, const char *s, size_t usable) {
128
+ size_t n;
129
+
130
+ for(n = 0; *s && n < usable ; d++, s++, n++) {
131
+ register char c = *s;
132
+
133
+ if(unlikely(!isalpha(c) && !isdigit(c))) *d = '_';
134
+ else *d = c;
135
+ }
136
+ *d = '\0';
137
+
138
+ return n;
139
+}
140
+
141
+#define PROMETHEUS_ELEMENT_MAX 256
142
+
143
void rrd_stats_api_v1_charts_allmetrics_prometheus(BUFFER *wb)
144
{
145
pthread_rwlock_rdlock(&localhost.rrdset_root_rwlock);
146
147
+ char host[PROMETHEUS_ELEMENT_MAX + 1];
148
+ prometheus_name_copy(host, config_get("global", "hostname", "localhost"), PROMETHEUS_ELEMENT_MAX);
149
+
150
// for each chart
151
RRDSET *st;
152
for(st = localhost.rrdset_root; st ; st = st->next) {
153
+ char chart[PROMETHEUS_ELEMENT_MAX + 1];
154
+ prometheus_name_copy(chart, st->id, PROMETHEUS_ELEMENT_MAX);
155
+
156
buffer_strcat(wb, "\n");
157
if(st->enabled && st->dimensions) {
158
// for each dimension
159
RRDDIM *rd;
160
for(rd = st->dimensions; rd ; rd = rd->next) {
161
if(rd->counter) {
140
- buffer_sprintf(wb, "# HELP %s.%s %s\n", st->id, rd->id, st->units);
162
+ // buffer_sprintf(wb, "# HELP %s.%s %s\n", st->id, rd->id, st->units);
163
164
switch(rd->algorithm) {
165
case RRDDIM_INCREMENTAL:
@@ -150,9 +172,15 @@ void rrd_stats_api_v1_charts_allmetrics_prometheus(BUFFER *wb)
172
break;
173
}
174
153
- calculated_number n = (calculated_number)rd->last_collected_value * (calculated_number)(abs(rd->multiplier)) / (calculated_number)(abs(rd->divisor));
175
+ // calculated_number n = (calculated_number)rd->last_collected_value * (calculated_number)(abs(rd->multiplier)) / (calculated_number)(abs(rd->divisor));
176
+ // buffer_sprintf(wb, "%s.%s " CALCULATED_NUMBER_FORMAT " %llu\n", st->id, rd->id, n,
177
+ // (unsigned long long)((rd->last_collected_time.tv_sec * 1000) + (rd->last_collected_time.tv_usec / 1000)));
178
+
179
+ char dimension[PROMETHEUS_ELEMENT_MAX + 1];
180
+ prometheus_name_copy(dimension, rd->id, PROMETHEUS_ELEMENT_MAX);
181
155
- buffer_sprintf(wb, "%s.%s " CALCULATED_NUMBER_FORMAT " %llu\n", st->id, rd->id, n,
182
+ buffer_sprintf(wb, "%s.%s{instance=\"%s\"} " COLLECTED_NUMBER_FORMAT " %llu\n",
183
+ chart, dimension, host, rd->last_collected_value,
184
(unsigned long long)((rd->last_collected_time.tv_sec * 1000) + (rd->last_collected_time.tv_usec / 1000)));
185
}
186
}
src/rrd2json.h
-1
@@ -2,7 +2,6 @@
2
#define NETDATA_RRD2JSON_H 1
3
4
#define HOSTNAME_MAX 1024
5
-extern char *hostname;
5
6
#define API_RELATIVE_TIME_MAX (3 * 365 * 86400)
7
src/web_buffer.h
+1
@@ -39,6 +39,7 @@ typedef struct web_buffer {
39
#define CT_IMAGE_XICON 19
40
#define CT_IMAGE_ICNS 20
41
#define CT_IMAGE_BMP 21
42
+#define CT_PROMETHEUS 22
43
44
#define buffer_cacheable(wb) do { (wb)->options |= WB_CONTENT_CACHEABLE; if((wb)->options & WB_CONTENT_NO_CACHEABLE) (wb)->options &= ~WB_CONTENT_NO_CACHEABLE; } while(0)
45
#define buffer_no_cacheable(wb) do { (wb)->options |= WB_CONTENT_NO_CACHEABLE; if((wb)->options & WB_CONTENT_CACHEABLE) (wb)->options &= ~WB_CONTENT_CACHEABLE; (wb)->expires = 0; } while(0)
src/web_client.c
+5
-1
@@ -796,7 +796,6 @@ int web_client_api_request_v1_allmetrics(struct web_client *w, char *url)
796
797
buffer_flush(w->response.data);
798
buffer_no_cacheable(w->response.data);
799
- w->response.data->contenttype = CT_TEXT_PLAIN;
799
800
switch(format) {
801
//case RAWMETRICS_BASH:
@@ -804,10 +803,12 @@ int web_client_api_request_v1_allmetrics(struct web_client *w, char *url)
803
// return 200;
804
805
case RAWMETRICS_PROMETHEUS:
806
+ w->response.data->contenttype = CT_PROMETHEUS;
807
rrd_stats_api_v1_charts_allmetrics_prometheus(w->response.data);
808
return 200;
809
810
default:
811
+ w->response.data->contenttype = CT_TEXT_PLAIN;
812
buffer_strcat(w->response.data, "Which format? Only '" RAWMETRICS_FORMAT_PROMETHEUS "' is currently supported.");
813
return 400;
814
}
@@ -1734,6 +1735,9 @@ const char *web_content_type_to_string(uint8_t contenttype) {
1735
case CT_IMAGE_ICNS:
1736
return "image/icns";
1737
1738
+ case CT_PROMETHEUS:
1739
+ return "text/plain; version=0.0.4";
1740
+
1741
default:
1742
case CT_TEXT_PLAIN:
1743
return "text/plain; charset=utf-8";