--- src/rrd_tool.c.orig 2012-01-24 08:08:48.000000000 -0200 +++ src/rrd_tool.c 2012-05-11 15:57:51.000000000 -0300 @@ -57,7 +57,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"); @@ -210,6 +210,13 @@ "\t\t[--enumds] [--json]\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"); @@ -232,7 +239,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; @@ -270,6 +277,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")) @@ -345,6 +354,9 @@ case C_XPORT: puts(_(help_xport)); break; + case C_JSON: + puts(_(help_json)); + break; case C_QUIT: puts(_(help_quit)); break; @@ -844,6 +856,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