@cryptotaxi247 / netdata-1 / commits / e76ac887e

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";