]> arthur.barton.de Git - netdata.git/blobdiff - src/backends.c
Added json as new backend with the structure:
[netdata.git] / src / backends.c
index 4250e31c4b2d89e95e551680886bfd61fc466d9d..9f7e54cc3435fba8ff580b92cd51b7b9c6ff0025 100644 (file)
@@ -8,9 +8,8 @@ static inline calculated_number backend_calculate_value_from_stored_data(RRDSET
     time_t first_t = rrdset_first_entry_t(st);
     time_t last_t = rrdset_last_entry_t(st);
 
-    if(unlikely(before - after < st->update_every && after != after - after % st->update_every))
-        // when st->update_every is bigger than the frequency we send data to backend
-        // skip the iterations that are not aligned to the database
+    if(unlikely(before < first_t || after > last_t))
+        // the chart has not been updated in the wanted timeframe
         return NAN;
 
     // align the time-frame
@@ -94,6 +93,37 @@ static inline int format_dimension_stored_opentsdb_telnet(BUFFER *b, const char
     return 0;
 }
 
+static inline int format_dimension_collected_json_plaintext(BUFFER *b, const char *prefix, RRDHOST *host, const char *hostname, RRDSET *st, RRDDIM *rd, time_t after, time_t before, uint32_t options) {
+    (void)host;
+    (void)after;
+    (void)before;
+    (void)options;
+    buffer_sprintf(b, "{"
+        "\"prefix\":\"%s\","
+        "\"hostname\":\"%s\","
+        "\"id\":\"%s\","
+        "\"subid\":\"%s\","
+        "\"value\":" COLLECTED_NUMBER_FORMAT ","
+        "\"timestamp\": %u}\n", prefix, hostname, st->id, rd->id, rd->last_collected_value, (uint32_t)rd->last_collected_time.tv_sec);
+    return 1;
+}
+
+static inline int format_dimension_stored_json_plaintext(BUFFER *b, const char *prefix, RRDHOST *host, const char *hostname, RRDSET *st, RRDDIM *rd, time_t after, time_t before, uint32_t options) {
+    (void)host;
+    calculated_number value = backend_calculate_value_from_stored_data(st, rd, after, before, options);
+    if(!isnan(value)) {
+        buffer_sprintf(b, "{"
+            "\"prefix\":\"%s\","
+            "\"hostname\":\"%s\","
+            "\"id\":\"%s\","
+            "\"subid\":\"%s\","
+            "\"value\":" CALCULATED_NUMBER_FORMAT ","
+            "\"timestamp\": %u}\n", prefix, hostname, st->id, rd->id, value, (uint32_t) before);
+        return 1;
+    }
+    return 0;
+}
+
 static inline int process_graphite_response(BUFFER *b) {
     char sample[1024];
     const char *s = buffer_tostring(b);
@@ -111,6 +141,23 @@ static inline int process_graphite_response(BUFFER *b) {
     return 0;
 }
 
+static inline int process_json_response(BUFFER *b) {
+    char sample[1024];
+    const char *s = buffer_tostring(b);
+    char *d = sample, *e = &sample[sizeof(sample) - 1];
+
+    for(; *s && d < e ;s++) {
+        char c = *s;
+        if(unlikely(!isprint(c))) c = ' ';
+        *d++ = c;
+    }
+    *d = '\0';
+
+    info("Received %zu bytes from json backend. Ignoring them. Sample: '%s'", buffer_strlen(b), sample);
+    buffer_flush(b);
+    return 0;
+}
+
 static inline int process_opentsdb_response(BUFFER *b) {
     char sample[1024];
     const char *s = buffer_tostring(b);
@@ -201,6 +248,21 @@ void *backends_main(void *ptr) {
 
         backend_response_checker = process_opentsdb_response;
     }
+    else if (!strcmp(type, "json") || !strcmp(type, "json:plaintext"))
+    {
+        default_port = 5448;
+
+        if (options == BACKEND_SOURCE_DATA_AS_COLLECTED)
+        {
+            backend_request_formatter = format_dimension_collected_json_plaintext;
+        }
+        else
+        {
+            backend_request_formatter = format_dimension_stored_json_plaintext;
+        }
+
+        backend_response_checker = process_json_response;
+    }
     else {
         error("Unknown backend type '%s'", type);
         goto cleanup;