]> arthur.barton.de Git - netdata.git/commitdiff
added SHELL support for allmetrics all call
authorCosta Tsaousis (ktsaou) <costa@tsaousis.gr>
Tue, 3 Jan 2017 21:35:31 +0000 (23:35 +0200)
committerCosta Tsaousis (ktsaou) <costa@tsaousis.gr>
Tue, 3 Jan 2017 21:35:31 +0000 (23:35 +0200)
src/rrd2json.c
src/rrd2json.h
src/web_client.c

index f31880a3dd43cba6f559a40f2f8f704b2e652d71..fc7bef20479b1305310a90ed9b427b3c2244d708 100644 (file)
@@ -124,6 +124,10 @@ void rrd_stats_api_v1_charts(BUFFER *wb)
     );
 }
 
+// ----------------------------------------------------------------------------
+// PROMETHEUS
+// /api/v1/allmetrics?format=prometheus
+
 static inline size_t prometheus_name_copy(char *d, const char *s, size_t usable) {
     size_t n;
 
@@ -155,11 +159,12 @@ void rrd_stats_api_v1_charts_allmetrics_prometheus(BUFFER *wb)
 
         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);
 
@@ -183,14 +188,83 @@ void rrd_stats_api_v1_charts_allmetrics_prometheus(BUFFER *wb)
                     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();
index d2982e6670440bcb1ff1223db51ce361580dcb32..7b14019708e32f54b3a18703e938320ac278c509 100644 (file)
 #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
@@ -61,7 +61,7 @@
 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);
index 5915ed6cc3d2c18c05b09460cb9a370a47832076..e5721c0dae01a7b53e49a84f4b135e9115b6250e 100644 (file)
@@ -776,7 +776,7 @@ int web_client_api_request_v1_charts(struct web_client *w, char *url)
 
 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, "?&");
@@ -787,10 +787,10 @@ int web_client_api_request_v1_allmetrics(struct web_client *w, char *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;
         }
     }
 
@@ -798,18 +798,19 @@ int web_client_api_request_v1_allmetrics(struct web_client *w, char *url)
     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;
     }
 }