);
}
+// ----------------------------------------------------------------------------
+// PROMETHEUS
+// /api/v1/allmetrics?format=prometheus
+
static inline size_t prometheus_name_copy(char *d, const char *s, size_t usable) {
size_t n;
buffer_strcat(wb, "\n");
if(st->enabled && st->dimensions) {
+ pthread_rwlock_rdlock(&st->rwlock);
+
// for each dimension
RRDDIM *rd;
for(rd = st->dimensions; rd ; rd = rd->next) {
if(rd->counter) {
-
char dimension[PROMETHEUS_ELEMENT_MAX + 1];
prometheus_name_copy(dimension, rd->id, PROMETHEUS_ELEMENT_MAX);
buffer_sprintf(wb, "%s_%s{instance=\"%s\"} " COLLECTED_NUMBER_FORMAT " %llu\n",
chart, dimension, host, rd->last_collected_value,
(unsigned long long)((rd->last_collected_time.tv_sec * 1000) + (rd->last_collected_time.tv_usec / 1000)));
+
}
}
+
+ pthread_rwlock_unlock(&st->rwlock);
}
}
pthread_rwlock_unlock(&localhost.rrdset_root_rwlock);
}
+// ----------------------------------------------------------------------------
+// BASH
+// /api/v1/allmetrics?format=bash
+
+static inline size_t shell_name_copy(char *d, const char *s, size_t usable) {
+ size_t n;
+
+ for(n = 0; *s && n < usable ; d++, s++, n++) {
+ register char c = *s;
+
+ if(unlikely(!isalnum(c))) *d = '_';
+ else *d = (char)toupper(c);
+ }
+ *d = '\0';
+
+ return n;
+}
+
+#define BASH_ELEMENT_MAX 100
+
+void rrd_stats_api_v1_charts_allmetrics_shell(BUFFER *wb)
+{
+ pthread_rwlock_rdlock(&localhost.rrdset_root_rwlock);
+
+ char host[BASH_ELEMENT_MAX + 1];
+ shell_name_copy(host, config_get("global", "hostname", "localhost"), BASH_ELEMENT_MAX);
+
+ // for each chart
+ RRDSET *st;
+ for(st = localhost.rrdset_root; st ; st = st->next) {
+ char chart[BASH_ELEMENT_MAX + 1];
+ shell_name_copy(chart, st->id, BASH_ELEMENT_MAX);
+
+ buffer_sprintf(wb, "\n# chart: %s (name: %s)\n", st->id, st->name);
+ if(st->enabled && st->dimensions) {
+ pthread_rwlock_rdlock(&st->rwlock);
+
+ // for each dimension
+ RRDDIM *rd;
+ for(rd = st->dimensions; rd ; rd = rd->next) {
+ if(rd->counter) {
+ char dimension[BASH_ELEMENT_MAX + 1];
+ shell_name_copy(dimension, rd->id, BASH_ELEMENT_MAX);
+
+ calculated_number n = rd->last_stored_value;
+ if(rd->multiplier < 0 || rd->divisor < 0)
+ n = -n;
+
+ if(isnan(n) || isinf(n))
+ buffer_sprintf(wb, "NETDATA_%s_%s=\"\" # %s\n", chart, dimension, st->units);
+ else {
+ n = roundl(n);
+ buffer_sprintf(wb, "NETDATA_%s_%s=\"%0.0Lf\" # %s\n", chart, dimension, n, st->units);
+ }
+ }
+ }
+
+ pthread_rwlock_unlock(&st->rwlock);
+ }
+ }
+
+ pthread_rwlock_unlock(&localhost.rrdset_root_rwlock);
+}
+
+// ----------------------------------------------------------------------------
+
unsigned long rrd_stats_one_json(RRDSET *st, char *options, BUFFER *wb)
{
time_t now = now_realtime_sec();
#define DATASOURCE_FORMAT_SSV_COMMA "ssvcomma"
#define DATASOURCE_FORMAT_CSV_JSON_ARRAY "csvjsonarray"
-#define RAWMETRICS_FORMAT_BASH "bash"
-#define RAWMETRICS_FORMAT_PROMETHEUS "prometheus"
+#define ALLMETRICS_FORMAT_SHELL "shell"
+#define ALLMETRICS_FORMAT_PROMETHEUS "prometheus"
-#define RAWMETRICS_BASH 1
-#define RAWMETRICS_PROMETHEUS 2
+#define ALLMETRICS_SHELL 1
+#define ALLMETRICS_PROMETHEUS 2
#define GROUP_UNDEFINED 0
#define GROUP_AVERAGE 1
extern void rrd_stats_api_v1_chart(RRDSET *st, BUFFER *wb);
extern void rrd_stats_api_v1_charts(BUFFER *wb);
-// extern void rrd_stats_api_v1_charts_allmetrics_bash(BUFFER *wb);
+extern void rrd_stats_api_v1_charts_allmetrics_shell(BUFFER *wb);
extern void rrd_stats_api_v1_charts_allmetrics_prometheus(BUFFER *wb);
extern unsigned long rrd_stats_one_json(RRDSET *st, char *options, BUFFER *wb);
int web_client_api_request_v1_allmetrics(struct web_client *w, char *url)
{
- int format = 0;
+ int format = ALLMETRICS_SHELL;
while(url) {
char *value = mystrsep(&url, "?&");
if(!value || !*value) continue;
if(!strcmp(name, "format")) {
- if(!strcmp(value, RAWMETRICS_FORMAT_BASH))
- format = RAWMETRICS_BASH;
- else if(!strcmp(value, RAWMETRICS_FORMAT_PROMETHEUS))
- format = RAWMETRICS_PROMETHEUS;
+ if(!strcmp(value, ALLMETRICS_FORMAT_SHELL))
+ format = ALLMETRICS_SHELL;
+ else if(!strcmp(value, ALLMETRICS_FORMAT_PROMETHEUS))
+ format = ALLMETRICS_PROMETHEUS;
}
}
buffer_no_cacheable(w->response.data);
switch(format) {
- //case RAWMETRICS_BASH:
- // rrd_stats_api_v1_charts_allmetrics_bash(w->response.data);
- // return 200;
+ case ALLMETRICS_SHELL:
+ w->response.data->contenttype = CT_TEXT_PLAIN;
+ rrd_stats_api_v1_charts_allmetrics_shell(w->response.data);
+ return 200;
- case RAWMETRICS_PROMETHEUS:
+ case ALLMETRICS_PROMETHEUS:
w->response.data->contenttype = CT_PROMETHEUS;
rrd_stats_api_v1_charts_allmetrics_prometheus(w->response.data);
return 200;
default:
w->response.data->contenttype = CT_TEXT_PLAIN;
- buffer_strcat(w->response.data, "Which format? Only '" RAWMETRICS_FORMAT_PROMETHEUS "' is currently supported.");
+ buffer_strcat(w->response.data, "Which format? Only '" ALLMETRICS_FORMAT_PROMETHEUS "' is currently supported.");
return 400;
}
}