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
}