@cryptotaxi247 / netdata-1 / commits / fd1c617ea

added SHELL support for allmetrics all call

Costa Tsaousis (ktsaou) committed Jan 3, 2017 at 23:35 UTC fd1c617eaaa24459b091440f27cb72fed5b963df
3 files changed +91 -16
src/rrd2json.c
+75 -1
@@ -124,6 +124,10 @@ void rrd_stats_api_v1_charts(BUFFER *wb)
124 );
125 }
126
127 +// ----------------------------------------------------------------------------
128 +// PROMETHEUS
129 +// /api/v1/allmetrics?format=prometheus
130 +
131 static inline size_t prometheus_name_copy(char *d, const char *s, size_t usable) {
132 size_t n;
133
@@ -155,11 +159,12 @@ void rrd_stats_api_v1_charts_allmetrics_prometheus(BUFFER *wb)
159
160 buffer_strcat(wb, "\n");
161 if(st->enabled && st->dimensions) {
162 + pthread_rwlock_rdlock(&st->rwlock);
163 +
164 // for each dimension
165 RRDDIM *rd;
166 for(rd = st->dimensions; rd ; rd = rd->next) {
167 if(rd->counter) {
162 -
168 char dimension[PROMETHEUS_ELEMENT_MAX + 1];
169 prometheus_name_copy(dimension, rd->id, PROMETHEUS_ELEMENT_MAX);
170
@@ -183,14 +188,83 @@ void rrd_stats_api_v1_charts_allmetrics_prometheus(BUFFER *wb)
188 buffer_sprintf(wb, "%s_%s{instance=\"%s\"} " COLLECTED_NUMBER_FORMAT " %llu\n",
189 chart, dimension, host, rd->last_collected_value,
190 (unsigned long long)((rd->last_collected_time.tv_sec * 1000) + (rd->last_collected_time.tv_usec / 1000)));
191 +
192 }
193 }
194 +
195 + pthread_rwlock_unlock(&st->rwlock);
196 }
197 }
198
199 pthread_rwlock_unlock(&localhost.rrdset_root_rwlock);
200 }
201
202 +// ----------------------------------------------------------------------------
203 +// BASH
204 +// /api/v1/allmetrics?format=bash
205 +
206 +static inline size_t shell_name_copy(char *d, const char *s, size_t usable) {
207 + size_t n;
208 +
209 + for(n = 0; *s && n < usable ; d++, s++, n++) {
210 + register char c = *s;
211 +
212 + if(unlikely(!isalnum(c))) *d = '_';
213 + else *d = (char)toupper(c);
214 + }
215 + *d = '\0';
216 +
217 + return n;
218 +}
219 +
220 +#define BASH_ELEMENT_MAX 100
221 +
222 +void rrd_stats_api_v1_charts_allmetrics_shell(BUFFER *wb)
223 +{
224 + pthread_rwlock_rdlock(&localhost.rrdset_root_rwlock);
225 +
226 + char host[BASH_ELEMENT_MAX + 1];
227 + shell_name_copy(host, config_get("global", "hostname", "localhost"), BASH_ELEMENT_MAX);
228 +
229 + // for each chart
230 + RRDSET *st;
231 + for(st = localhost.rrdset_root; st ; st = st->next) {
232 + char chart[BASH_ELEMENT_MAX + 1];
233 + shell_name_copy(chart, st->id, BASH_ELEMENT_MAX);
234 +
235 + buffer_sprintf(wb, "\n# chart: %s (name: %s)\n", st->id, st->name);
236 + if(st->enabled && st->dimensions) {
237 + pthread_rwlock_rdlock(&st->rwlock);
238 +
239 + // for each dimension
240 + RRDDIM *rd;
241 + for(rd = st->dimensions; rd ; rd = rd->next) {
242 + if(rd->counter) {
243 + char dimension[BASH_ELEMENT_MAX + 1];
244 + shell_name_copy(dimension, rd->id, BASH_ELEMENT_MAX);
245 +
246 + calculated_number n = rd->last_stored_value;
247 + if(rd->multiplier < 0 || rd->divisor < 0)
248 + n = -n;
249 +
250 + if(isnan(n) || isinf(n))
251 + buffer_sprintf(wb, "NETDATA_%s_%s=\"\" # %s\n", chart, dimension, st->units);
252 + else {
253 + n = roundl(n);
254 + buffer_sprintf(wb, "NETDATA_%s_%s=\"%0.0Lf\" # %s\n", chart, dimension, n, st->units);
255 + }
256 + }
257 + }
258 +
259 + pthread_rwlock_unlock(&st->rwlock);
260 + }
261 + }
262 +
263 + pthread_rwlock_unlock(&localhost.rrdset_root_rwlock);
264 +}
265 +
266 +// ----------------------------------------------------------------------------
267 +
268 unsigned long rrd_stats_one_json(RRDSET *st, char *options, BUFFER *wb)
269 {
270 time_t now = now_realtime_sec();
src/rrd2json.h
+5 -5
@@ -31,11 +31,11 @@
31 #define DATASOURCE_FORMAT_SSV_COMMA "ssvcomma"
32 #define DATASOURCE_FORMAT_CSV_JSON_ARRAY "csvjsonarray"
33
34 -#define RAWMETRICS_FORMAT_BASH "bash"
35 -#define RAWMETRICS_FORMAT_PROMETHEUS "prometheus"
34 +#define ALLMETRICS_FORMAT_SHELL "shell"
35 +#define ALLMETRICS_FORMAT_PROMETHEUS "prometheus"
36
37 -#define RAWMETRICS_BASH 1
38 -#define RAWMETRICS_PROMETHEUS 2
37 +#define ALLMETRICS_SHELL 1
38 +#define ALLMETRICS_PROMETHEUS 2
39
40 #define GROUP_UNDEFINED 0
41 #define GROUP_AVERAGE 1
@@ -61,7 +61,7 @@
61 extern void rrd_stats_api_v1_chart(RRDSET *st, BUFFER *wb);
62 extern void rrd_stats_api_v1_charts(BUFFER *wb);
63
64 -// extern void rrd_stats_api_v1_charts_allmetrics_bash(BUFFER *wb);
64 +extern void rrd_stats_api_v1_charts_allmetrics_shell(BUFFER *wb);
65 extern void rrd_stats_api_v1_charts_allmetrics_prometheus(BUFFER *wb);
66
67 extern unsigned long rrd_stats_one_json(RRDSET *st, char *options, BUFFER *wb);
src/web_client.c
+11 -10
@@ -776,7 +776,7 @@ int web_client_api_request_v1_charts(struct web_client *w, char *url)
776
777 int web_client_api_request_v1_allmetrics(struct web_client *w, char *url)
778 {
779 - int format = 0;
779 + int format = ALLMETRICS_SHELL;
780
781 while(url) {
782 char *value = mystrsep(&url, "?&");
@@ -787,10 +787,10 @@ int web_client_api_request_v1_allmetrics(struct web_client *w, char *url)
787 if(!value || !*value) continue;
788
789 if(!strcmp(name, "format")) {
790 - if(!strcmp(value, RAWMETRICS_FORMAT_BASH))
791 - format = RAWMETRICS_BASH;
792 - else if(!strcmp(value, RAWMETRICS_FORMAT_PROMETHEUS))
793 - format = RAWMETRICS_PROMETHEUS;
790 + if(!strcmp(value, ALLMETRICS_FORMAT_SHELL))
791 + format = ALLMETRICS_SHELL;
792 + else if(!strcmp(value, ALLMETRICS_FORMAT_PROMETHEUS))
793 + format = ALLMETRICS_PROMETHEUS;
794 }
795 }
796
@@ -798,18 +798,19 @@ int web_client_api_request_v1_allmetrics(struct web_client *w, char *url)
798 buffer_no_cacheable(w->response.data);
799
800 switch(format) {
801 - //case RAWMETRICS_BASH:
802 - // rrd_stats_api_v1_charts_allmetrics_bash(w->response.data);
803 - // return 200;
801 + case ALLMETRICS_SHELL:
802 + w->response.data->contenttype = CT_TEXT_PLAIN;
803 + rrd_stats_api_v1_charts_allmetrics_shell(w->response.data);
804 + return 200;
805
805 - case RAWMETRICS_PROMETHEUS:
806 + case ALLMETRICS_PROMETHEUS:
807 w->response.data->contenttype = CT_PROMETHEUS;
808 rrd_stats_api_v1_charts_allmetrics_prometheus(w->response.data);
809 return 200;
810
811 default:
812 w->response.data->contenttype = CT_TEXT_PLAIN;
812 - buffer_strcat(w->response.data, "Which format? Only '" RAWMETRICS_FORMAT_PROMETHEUS "' is currently supported.");
813 + buffer_strcat(w->response.data, "Which format? Only '" ALLMETRICS_FORMAT_PROMETHEUS "' is currently supported.");
814 return 400;
815 }
816 }