aboutsummaryrefslogtreecommitdiff
path: root/databases/rrdtool/files/thirdparty-json.diff
blob: e4605cf796997eef0bac6b3a1c4b9aae621ab725 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#
# From: https://gist.github.com/raw/614476/19f1b1bc9499bb9dd761e5e03eff225d2316707d/0001-work-in-progress.patch
#
--- src/rrd_tool.c.orig	2010-07-05 12:31:21.000000000 -0700
+++ src/rrd_tool.c	2011-01-06 15:17:04.453738239 -0800
@@ -55,7 +55,7 @@
         N_
         ("Valid commands: create, update, updatev, graph, graphv,  dump, restore,\n"
          "\t\tlast, lastupdate, first, info, fetch, tune,\n"
-         "\t\tresize, xport, flushcached\n");
+         "\t\tresize, xport, json, flushcached\n");
 
     const char *help_listremote =
         N_("Valid remote commands: quit, ls, cd, mkdir, pwd\n");
@@ -208,6 +208,13 @@
            "\t\t[--enumds]\n" "\t\t[DEF:vname=rrd:ds-name:CF]\n"
            "\t\t[CDEF:vname=rpn-expression]\n"
            "\t\t[XPORT:vname:legend]\n");
+    const char *help_json =
+        N_("* json - generate JSON dump from one or several RRD\n\n"
+           "\trrdtool json [-s|--start seconds] [-e|--end seconds]\n"
+           "\t\t[-m|--maxrows rows]\n" "\t\t[--step seconds]\n"
+           "\t\t[DEF:vname=rrd:ds-name:CF]\n"
+           "\t\t[CDEF:vname=rpn-expression]\n"
+           "\t\t[XPORT:vname:legend]\n");
     const char *help_quit =
         N_(" * quit - closing a session in remote mode\n\n"
            "\trrdtool quit\n");
@@ -230,7 +237,7 @@
     enum { C_NONE, C_CREATE, C_DUMP, C_INFO, C_RESTORE, C_LAST,
         C_LASTUPDATE, C_FIRST, C_UPDATE, C_FETCH, C_GRAPH, C_GRAPHV,
         C_TUNE,
-        C_RESIZE, C_XPORT, C_QUIT, C_LS, C_CD, C_MKDIR, C_PWD,
+        C_RESIZE, C_XPORT, C_JSON, C_QUIT, C_LS, C_CD, C_MKDIR, C_PWD,
         C_UPDATEV, C_FLUSHCACHED
     };
     int       help_cmd = C_NONE;
@@ -268,6 +275,8 @@
             help_cmd = C_RESIZE;
         else if (!strcmp(cmd, "xport"))
             help_cmd = C_XPORT;
+        else if (!strcmp(cmd, "json"))
+            help_cmd = C_JSON;
         else if (!strcmp(cmd, "quit"))
             help_cmd = C_QUIT;
         else if (!strcmp(cmd, "ls"))
@@ -343,6 +352,9 @@
     case C_XPORT:
         puts(_(help_xport));
         break;
+    case C_JSON:
+        puts(_(help_json));
+        break;
     case C_QUIT:
         puts(_(help_quit));
         break;
@@ -770,6 +782,58 @@
             setlocale(LC_NUMERIC, old_locale);
         }
         free(vtag);
+    } else if (strcmp("json", argv[1]) == 0) {
+        int       xxsize;
+        unsigned long int j = 0;
+        time_t    start, end, ti;
+        unsigned long step, col_cnt;
+        rrd_value_t *data, *ptr;
+        char    **legend_v;
+        int       i;
+
+        if (rrd_xport
+            (argc - 1, &argv[1], &xxsize, &start, &end, &step, &col_cnt,
+             &legend_v, &data) != -1) {
+            char *old_locale = setlocale(LC_NUMERIC, "C");
+            printf("[\n");
+            for (j = 0; j < col_cnt; j++) {
+                char     *entry = NULL;
+                ptr = j + data;
+                entry = legend_v[j];
+
+                printf("\t{\n\t\t\"%s\": {\n", entry);
+                free(entry);
+
+                printf("\t\t\t\"%s\": %lld,\n", META_START_TAG,
+                      (long long int) start + step);
+                printf("\t\t\t\"%s\": %lu,\n", META_STEP_TAG, step);
+                printf("\t\t\t\"%s\": %lld,\n", META_END_TAG, (long long int) end);
+                printf("\t\t\t\"data_points\": [\n");
+
+                for (ti = start + step; ti <= end; ti += step) {
+                  rrd_value_t newval = DNAN;
+                    newval = *ptr;
+                    if (isnan(newval)) {
+                        printf("null");
+                    } else {
+                        printf("%0.5f", newval);
+                    };
+                    if (ti < end) {
+                      printf(", ");
+                    }
+                    ptr+=col_cnt;
+                }
+
+                printf("\n\t\t\t]\n");
+                printf("\t\t}\n");
+                printf("\t}%s\n", (j<col_cnt-1) ? "," : "");
+            }
+            free(legend_v);
+
+            free(data);
+            printf("]\n");
+            setlocale(LC_NUMERIC, old_locale);
+        }
     } else if (strcmp("graph", argv[1]) == 0) {
         char    **calcpr;