@cryptotaxi247 / netdata-1 / commits / 4c867cb3a

Switch charts / chart to use buffer json functions (#16359)

Switch charts / chart to use buffer json

Stelios Fragkakis committed Nov 8, 2023 at 16:15 UTC 4c867cb3a61c6c2bcd32f82267b0e01327eba752
10 files changed +168 -241
database/rrdfunctions.c
+22 -21
@@ -1097,35 +1097,36 @@ cleanup:
1097
1098 // ----------------------------------------------------------------------------
1099
1100 -static void functions2json(DICTIONARY *functions, BUFFER *wb, const char *ident, const char *kq, const char *sq) {
1100 +static void functions2json(DICTIONARY *functions, BUFFER *wb)
1101 +{
1102 struct rrd_host_function *t;
1102 - dfe_start_read(functions, t) {
1103 - if(!rrd_collector_running(t->collector)) continue;
1104 -
1105 - if(t_dfe.counter)
1106 - buffer_strcat(wb, ",\n");
1103 + dfe_start_read(functions, t)
1104 + {
1105 + if (!rrd_collector_running(t->collector))
1106 + continue;
1107
1108 - buffer_sprintf(wb, "%s%s%s%s: {", ident, kq, t_dfe.name, kq);
1109 - buffer_sprintf(wb, "\n\t%s%shelp%s: %s%s%s", ident, kq, kq, sq, string2str(t->help), sq);
1110 - buffer_sprintf(wb, ",\n\t%s%stimeout%s: %d", ident, kq, kq, t->timeout);
1111 - buffer_sprintf(wb, ",\n\t%s%soptions%s: \"%s%s\"", ident, kq, kq
1112 - , (t->options & RRD_FUNCTION_LOCAL)?"LOCAL ":""
1113 - , (t->options & RRD_FUNCTION_GLOBAL)?"GLOBAL ":""
1114 - );
1115 - buffer_sprintf(wb, "\n%s}", ident);
1108 + buffer_json_member_add_object(wb, t_dfe.name);
1109 + buffer_json_member_add_string_or_empty(wb, "help", string2str(t->help));
1110 + buffer_json_member_add_int64(wb, "timeout", (int64_t)t->timeout);
1111 +
1112 + char options[65];
1113 + snprintfz(
1114 + options,
1115 + 64,
1116 + "%s%s",
1117 + (t->options & RRD_FUNCTION_LOCAL) ? "LOCAL " : "",
1118 + (t->options & RRD_FUNCTION_GLOBAL) ? "GLOBAL" : "");
1119 +
1120 + buffer_json_member_add_string_or_empty(wb, "options", options);
1121 + buffer_json_object_close(wb);
1122 }
1123 dfe_done(t);
1118 - buffer_strcat(wb, "\n");
1124 }
1125
1121 -void chart_functions2json(RRDSET *st, BUFFER *wb, int tabs, const char *kq, const char *sq) {
1126 +void chart_functions2json(RRDSET *st, BUFFER *wb) {
1127 if(!st || !st->functions_view) return;
1128
1124 - char ident[tabs + 1];
1125 - ident[tabs] = '\0';
1126 - while(tabs) ident[--tabs] = '\t';
1127 -
1128 - functions2json(st->functions_view, wb, ident, kq, sq);
1129 + functions2json(st->functions_view, wb);
1130 }
1131
1132 void host_functions2json(RRDHOST *host, BUFFER *wb) {
database/rrdfunctions.h
+1 -1
@@ -40,7 +40,7 @@ void rrd_function_cancel(const char *transaction);
40 void rrd_functions_expose_rrdpush(RRDSET *st, BUFFER *wb);
41 void rrd_functions_expose_global_rrdpush(RRDHOST *host, BUFFER *wb);
42
43 -void chart_functions2json(RRDSET *st, BUFFER *wb, int tabs, const char *kq, const char *sq);
43 +void chart_functions2json(RRDSET *st, BUFFER *wb);
44 void chart_functions_to_dict(DICTIONARY *rrdset_functions_view, DICTIONARY *dst, void *value, size_t value_size);
45 void host_functions_to_dict(RRDHOST *host, DICTIONARY *dst, void *value, size_t value_size, STRING **help);
46 void host_functions2json(RRDHOST *host, BUFFER *wb);
database/rrdvar.c
+30 -24
@@ -315,7 +315,6 @@ int health_variable_lookup(STRING *variable, RRDCALC *rc, NETDATA_DOUBLE *result
315
316 struct variable2json_helper {
317 BUFFER *buf;
318 - size_t counter;
318 RRDVAR_FLAGS options;
319 };
320
@@ -326,47 +325,54 @@ static int single_variable2json_callback(const DICTIONARY_ITEM *item __maybe_unu
325
326 if (helper->options == RRDVAR_FLAG_NONE || rrdvar_flags(rva) & helper->options) {
327 if(unlikely(isnan(value) || isinf(value)))
329 - buffer_sprintf(helper->buf, "%s\n\t\t\"%s\": null", helper->counter?",":"", rrdvar_name(rva));
328 + buffer_json_member_add_string(helper->buf, rrdvar_name(rva), NULL);
329 else
331 - buffer_sprintf(helper->buf, "%s\n\t\t\"%s\": %0.5" NETDATA_DOUBLE_MODIFIER, helper->counter?",":"", rrdvar_name(rva), (NETDATA_DOUBLE)value);
332 -
333 - helper->counter++;
330 + buffer_json_member_add_double(helper->buf, rrdvar_name(rva), (NETDATA_DOUBLE)value);
331 }
332
333 return 0;
334 }
335
336 void health_api_v1_chart_custom_variables2json(RRDSET *st, BUFFER *buf) {
340 - struct variable2json_helper helper = {
341 - .buf = buf,
342 - .counter = 0,
343 - .options = RRDVAR_FLAG_CUSTOM_CHART_VAR};
337 + struct variable2json_helper helper = {.buf = buf, .options = RRDVAR_FLAG_CUSTOM_CHART_VAR};
338
345 - buffer_sprintf(buf, "{");
339 rrdvar_walkthrough_read(st->rrdvars, single_variable2json_callback, &helper);
347 - buffer_strcat(buf, "\n\t\t\t}");
340 }
341
342 void health_api_v1_chart_variables2json(RRDSET *st, BUFFER *buf) {
343 RRDHOST *host = st->rrdhost;
344
353 - struct variable2json_helper helper = {
354 - .buf = buf,
355 - .counter = 0,
356 - .options = RRDVAR_FLAG_NONE};
345 + struct variable2json_helper helper = {.buf = buf, .options = RRDVAR_FLAG_NONE};
346
358 - buffer_sprintf(buf, "{\n\t\"chart\": \"%s\",\n\t\"chart_name\": \"%s\",\n\t\"chart_context\": \"%s\",\n\t\"chart_variables\": {", rrdset_id(st), rrdset_name(st), rrdset_context(st));
359 - rrdvar_walkthrough_read(st->rrdvars, single_variable2json_callback, &helper);
347 + buffer_json_initialize(buf, "\"", "\"", 0, true, BUFFER_JSON_OPTIONS_DEFAULT);
348 +
349 + buffer_json_member_add_string(buf, "chart", rrdset_id(st));
350 + buffer_json_member_add_string(buf, "chart_name", rrdset_name(st));
351 + buffer_json_member_add_string(buf, "chart_context", rrdset_context(st));
352 +
353 + {
354 + buffer_json_member_add_object(buf, "chart_variables");
355 + rrdvar_walkthrough_read(st->rrdvars, single_variable2json_callback, &helper);
356 + buffer_json_object_close(buf);
357 + }
358
361 - buffer_sprintf(buf, "\n\t},\n\t\"family\": \"%s\",\n\t\"family_variables\": {", rrdset_family(st));
362 - helper.counter = 0;
363 - rrdvar_walkthrough_read(rrdfamily_rrdvars_dict(st->rrdfamily), single_variable2json_callback, &helper);
359 + buffer_json_member_add_string(buf, "family", rrdset_family(st));
360
365 - buffer_sprintf(buf, "\n\t},\n\t\"host\": \"%s\",\n\t\"host_variables\": {", rrdhost_hostname(host));
366 - helper.counter = 0;
367 - rrdvar_walkthrough_read(host->rrdvars, single_variable2json_callback, &helper);
361 + {
362 + buffer_json_member_add_object(buf, "family_variables");
363 + rrdvar_walkthrough_read(rrdfamily_rrdvars_dict(st->rrdfamily), single_variable2json_callback, &helper);
364 + buffer_json_object_close(buf);
365 + }
366 +
367 + buffer_json_member_add_string(buf, "host", rrdhost_hostname(host));
368 +
369 + {
370 + buffer_json_member_add_object(buf, "host_variables");
371 + rrdvar_walkthrough_read(host->rrdvars, single_variable2json_callback, &helper);
372 + buffer_json_object_close(buf);
373 + }
374
369 - buffer_strcat(buf, "\n\t}\n}\n");
375 + buffer_json_finalize(buf);
376 }
377
378 // ----------------------------------------------------------------------------
web/api/formatters/charts2json.c
+32 -67
@@ -36,9 +36,9 @@ const char* get_release_channel() {
36 return (use_stable)?"stable":"nightly";
37 }
38
39 -void charts2json(RRDHOST *host, BUFFER *wb, int skip_volatile) {
39 +void charts2json(RRDHOST *host, BUFFER *wb) {
40 static char *custom_dashboard_info_js_filename = NULL;
41 - size_t c, dimensions = 0, memory = 0, alarms = 0;
41 + size_t c = 0, dimensions = 0, memory = 0, alarms = 0;
42 RRDSET *st;
43
44 time_t now = now_realtime_sec();
@@ -46,42 +46,31 @@ void charts2json(RRDHOST *host, BUFFER *wb, int skip_volatile) {
46 if(unlikely(!custom_dashboard_info_js_filename))
47 custom_dashboard_info_js_filename = config_get(CONFIG_SECTION_WEB, "custom dashboard_info.js", "");
48
49 - buffer_sprintf(wb, "{\n"
50 - "\t\"hostname\": \"%s\""
51 - ",\n\t\"version\": \"%s\""
52 - ",\n\t\"release_channel\": \"%s\""
53 - ",\n\t\"os\": \"%s\""
54 - ",\n\t\"timezone\": \"%s\""
55 - ",\n\t\"update_every\": %d"
56 - ",\n\t\"history\": %d"
57 - ",\n\t\"memory_mode\": \"%s\""
58 - ",\n\t\"custom_info\": \"%s\""
59 - ",\n\t\"charts\": {"
60 - , rrdhost_hostname(host)
61 - , rrdhost_program_version(host)
62 - , get_release_channel()
63 - , rrdhost_os(host)
64 - , rrdhost_timezone(host)
65 - , host->rrd_update_every
66 - , host->rrd_history_entries
67 - , rrd_memory_mode_name(host->rrd_memory_mode)
68 - , custom_dashboard_info_js_filename
69 - );
49 + buffer_json_initialize(wb, "\"", "\"", 0, true, BUFFER_JSON_OPTIONS_DEFAULT);
50
71 - c = 0;
51 + buffer_json_member_add_string(wb, "hostname", rrdhost_hostname(host));
52 + buffer_json_member_add_string(wb, "version", rrdhost_program_version(host));
53 + buffer_json_member_add_string(wb, "release_channel", get_release_channel());
54 + buffer_json_member_add_string(wb, "os", rrdhost_os(host));
55 + buffer_json_member_add_string(wb, "timezone", rrdhost_timezone(host));
56 + buffer_json_member_add_int64(wb, "update_every", host->rrd_update_every);
57 + buffer_json_member_add_int64(wb, "history", host->rrd_history_entries);
58 + buffer_json_member_add_string(wb, "memory_mode", rrd_memory_mode_name(host->rrd_memory_mode));
59 + buffer_json_member_add_string(wb, "custom_info", custom_dashboard_info_js_filename);
60 +
61 + buffer_json_member_add_object(wb, "charts");
62 rrdset_foreach_read(st, host) {
63 if (rrdset_is_available_for_viewers(st)) {
74 - if(c) buffer_strcat(wb, ",");
75 - buffer_strcat(wb, "\n\t\t\"");
76 - buffer_strcat(wb, rrdset_id(st));
77 - buffer_strcat(wb, "\": ");
78 - rrdset2json(st, wb, &dimensions, &memory, skip_volatile);
64
80 - c++;
65 + buffer_json_member_add_object(wb, rrdset_id(st));
66 + rrdset2json(st, wb, &dimensions, &memory);
67 + buffer_json_object_close(wb);
68 st->last_accessed_time_s = now;
69 + c++;
70 }
71 }
72 rrdset_foreach_done(st);
73 + buffer_json_object_close(wb);
74
75 RRDCALC *rc;
76 foreach_rrdcalc_in_rrdhost_read(host, rc) {
@@ -90,50 +79,26 @@ void charts2json(RRDHOST *host, BUFFER *wb, int skip_volatile) {
79 }
80 foreach_rrdcalc_in_rrdhost_done(rc);
81
93 - buffer_sprintf(wb
94 - , "\n\t}"
95 - ",\n\t\"charts_count\": %zu"
96 - ",\n\t\"dimensions_count\": %zu"
97 - ",\n\t\"alarms_count\": %zu"
98 - ",\n\t\"rrd_memory_bytes\": %zu"
99 - ",\n\t\"hosts_count\": %zu"
100 - ",\n\t\"hosts\": ["
101 - , c
102 - , dimensions
103 - , alarms
104 - , memory
105 - , rrdhost_hosts_available()
106 - );
82 + buffer_json_member_add_int64(wb, "charts_count", (int64_t) c);
83 + buffer_json_member_add_int64(wb, "dimensions_count", (int64_t) dimensions);
84 + buffer_json_member_add_int64(wb, "alarms_count", (int64_t)alarms);
85 + buffer_json_member_add_int64(wb, "rrd_memory_bytes", (int64_t)memory);
86 + buffer_json_member_add_int64(wb, "hosts_count", (int64_t) rrdhost_hosts_available());
87
108 - if(unlikely(rrdhost_hosts_available() > 1)) {
88 + buffer_json_member_add_array(wb, "hosts");
89 + {
90 rrd_rdlock();
110 -
111 - size_t found = 0;
91 RRDHOST *h;
92 rrdhost_foreach_read(h) {
114 - if(!rrdhost_should_be_removed(h, host, now) && !rrdhost_flag_check(h, RRDHOST_FLAG_ARCHIVED)) {
115 - buffer_sprintf(wb
116 - , "%s\n\t\t{"
117 - "\n\t\t\t\"hostname\": \"%s\""
118 - "\n\t\t}"
119 - , (found > 0) ? "," : ""
120 - , rrdhost_hostname(h)
121 - );
122 -
123 - found++;
93 + if(!rrdhost_should_be_removed(h, host, now) /*&& !rrdhost_flag_check(h, RRDHOST_FLAG_ARCHIVED) */) {
94 + buffer_json_add_array_item_object(wb);
95 + buffer_json_member_add_string(wb, "hostname", rrdhost_hostname(h));
96 + buffer_json_object_close(wb);
97 }
98 }
126 -
99 rrd_unlock();
100 }
129 - else {
130 - buffer_sprintf(wb
131 - , "\n\t\t{"
132 - "\n\t\t\t\"hostname\": \"%s\""
133 - "\n\t\t}"
134 - , rrdhost_hostname(host)
135 - );
136 - }
101 + buffer_json_array_close(wb);
102
138 - buffer_sprintf(wb, "\n\t]\n}\n");
103 + buffer_json_finalize(wb);
104 }
web/api/formatters/charts2json.h
+1 -1
@@ -5,7 +5,7 @@
5
6 #include "rrd2json.h"
7
8 -void charts2json(RRDHOST *host, BUFFER *wb, int skip_volatile);
8 +void charts2json(RRDHOST *host, BUFFER *wb);
9 const char* get_release_channel();
10
11 #endif //NETDATA_API_FORMATTER_CHARTS2JSON_H
web/api/formatters/json_wrapper.c
+4 -2
@@ -874,7 +874,8 @@ void rrdr_json_wrapper_begin(RRDR *r, BUFFER *wb) {
874 sq[0] = '"';
875 }
876
877 - buffer_json_initialize(wb, kq, sq, 0, true, (options & RRDR_OPTION_MINIFY) ? BUFFER_JSON_OPTIONS_MINIFY : BUFFER_JSON_OPTIONS_DEFAULT);
877 + buffer_json_initialize(
878 + wb, kq, sq, 0, true, (options & RRDR_OPTION_MINIFY) ? BUFFER_JSON_OPTIONS_MINIFY : BUFFER_JSON_OPTIONS_DEFAULT);
879
880 buffer_json_member_add_uint64(wb, "api", 1);
881 buffer_json_member_add_string(wb, "id", qt->id);
@@ -1289,7 +1290,8 @@ void rrdr_json_wrapper_begin2(RRDR *r, BUFFER *wb) {
1290 sq[0] = '\'';
1291 }
1292
1292 - buffer_json_initialize(wb, kq, sq, 0, true, (options & RRDR_OPTION_MINIFY) ? BUFFER_JSON_OPTIONS_MINIFY : BUFFER_JSON_OPTIONS_DEFAULT);
1293 + buffer_json_initialize(
1294 + wb, kq, sq, 0, true, (options & RRDR_OPTION_MINIFY) ? BUFFER_JSON_OPTIONS_MINIFY : BUFFER_JSON_OPTIONS_DEFAULT);
1295 buffer_json_member_add_uint64(wb, "api", 2);
1296
1297 if(options & RRDR_OPTION_DEBUG) {
web/api/formatters/rrd2json.c
+5 -2
@@ -3,8 +3,11 @@
3 #include "web/api/web_api_v1.h"
4 #include "database/storage_engine.h"
5
6 -void rrd_stats_api_v1_chart(RRDSET *st, BUFFER *wb) {
7 - rrdset2json(st, wb, NULL, NULL, 0);
6 +void rrd_stats_api_v1_chart(RRDSET *st, BUFFER *wb)
7 +{
8 + buffer_json_initialize(wb, "\"", "\"", 0, true, BUFFER_JSON_OPTIONS_DEFAULT);
9 + rrdset2json(st, wb, NULL, NULL);
10 + buffer_json_finalize(wb);
11 }
12
13 const char *rrdr_format_to_string(DATASOURCE_FORMAT format) {
web/api/formatters/rrdset2json.c
+71 -121
@@ -2,154 +2,104 @@
2
3 #include "rrdset2json.h"
4
5 -void chart_labels2json(RRDSET *st, BUFFER *wb, size_t indentation)
5 +static int process_label_callback(const char *name, const char *value, RRDLABEL_SRC ls, void *data) {
6 + BUFFER *wb = data;
7 + buffer_json_member_add_string_or_empty(wb, name, value);
8 + return 1;
9 +}
10 +
11 +void chart_labels2json(RRDSET *st, BUFFER *wb)
12 {
13 if(unlikely(!st->rrdlabels))
14 return;
15
10 - char tabs[11];
11 -
12 - if (indentation > 10)
13 - indentation = 10;
14 -
15 - tabs[0] = '\0';
16 - while (indentation) {
17 - strcat(tabs, "\t\t");
18 - indentation--;
19 - }
20 -
21 - rrdlabels_to_buffer(st->rrdlabels, wb, tabs, ":", "\"", ",\n", NULL, NULL, NULL, NULL);
22 - buffer_strcat(wb, "\n");
16 + rrdlabels_walkthrough_read(st->rrdlabels, process_label_callback, wb);
17 }
18
19 // generate JSON for the /api/v1/chart API call
26 -
27 -void rrdset2json(RRDSET *st, BUFFER *wb, size_t *dimensions_count, size_t *memory_used, int skip_volatile) {
20 +void rrdset2json(RRDSET *st, BUFFER *wb, size_t *dimensions_count, size_t *memory_used)
21 +{
22 time_t first_entry_t = rrdset_first_entry_s(st);
23 time_t last_entry_t = rrdset_last_entry_s(st);
24
31 - buffer_sprintf(
32 - wb,
33 - "\t\t{\n"
34 - "\t\t\t\"id\": \"%s\",\n"
35 - "\t\t\t\"name\": \"%s\",\n"
36 - "\t\t\t\"type\": \"%s\",\n"
37 - "\t\t\t\"family\": \"%s\",\n"
38 - "\t\t\t\"context\": \"%s\",\n"
39 - "\t\t\t\"title\": \"%s (%s)\",\n"
40 - "\t\t\t\"priority\": %d,\n"
41 - "\t\t\t\"plugin\": \"%s\",\n"
42 - "\t\t\t\"module\": \"%s\",\n"
43 - "\t\t\t\"units\": \"%s\",\n"
44 - "\t\t\t\"data_url\": \"/api/v1/data?chart=%s\",\n"
45 - "\t\t\t\"chart_type\": \"%s\",\n",
46 - rrdset_id(st),
47 - rrdset_name(st),
48 - rrdset_parts_type(st),
49 - rrdset_family(st),
50 - rrdset_context(st),
51 - rrdset_title(st),
52 - rrdset_name(st),
53 - st->priority,
54 - rrdset_plugin_name(st),
55 - rrdset_module_name(st),
56 - rrdset_units(st),
57 - rrdset_name(st),
58 - rrdset_type_name(st->chart_type));
59 -
60 - if (likely(!skip_volatile))
61 - buffer_sprintf(
62 - wb,
63 - "\t\t\t\"duration\": %"PRId64",\n",
64 - (int64_t)(last_entry_t - first_entry_t + st->update_every) //st->entries * st->update_every
65 - );
66 -
67 - buffer_sprintf(
68 - wb,
69 - "\t\t\t\"first_entry\": %"PRId64",\n",
70 - (int64_t)first_entry_t //rrdset_first_entry_t(st)
71 - );
72 -
73 - if (likely(!skip_volatile))
74 - buffer_sprintf(
75 - wb,
76 - "\t\t\t\"last_entry\": %"PRId64",\n",
77 - (int64_t)last_entry_t //rrdset_last_entry_t(st)
78 - );
79 -
80 - buffer_sprintf(
81 - wb,
82 - "\t\t\t\"update_every\": %d,\n"
83 - "\t\t\t\"dimensions\": {\n",
84 - st->update_every);
25 + buffer_json_member_add_string(wb, "id", rrdset_id(st));
26 + buffer_json_member_add_string(wb, "name", rrdset_name(st));
27 + buffer_json_member_add_string(wb, "type", rrdset_parts_type(st));
28 + buffer_json_member_add_string(wb, "family", rrdset_family(st));
29 + buffer_json_member_add_string(wb, "context", rrdset_context(st));
30 + buffer_json_member_add_string(wb, "title", rrdset_title(st));
31 + buffer_json_member_add_int64(wb, "priority", st->priority);
32 + buffer_json_member_add_string(wb, "plugin", rrdset_plugin_name(st));
33 + buffer_json_member_add_string(wb, "module", rrdset_module_name(st));
34 + buffer_json_member_add_string(wb, "units", rrdset_units(st));
35 +
36 + char data_url[RRD_ID_LENGTH_MAX + 16];
37 + snprintfz(data_url, RRD_ID_LENGTH_MAX + 15, "/api/v1/chart=%s", rrdset_name(st));
38 + buffer_json_member_add_string(wb, "data_url", data_url);
39 +
40 + buffer_json_member_add_string(wb, "chart_type", rrdset_type_name(st->chart_type));
41 + buffer_json_member_add_int64(wb, "duration", (int64_t)(last_entry_t - first_entry_t + st->update_every));
42 + buffer_json_member_add_int64(wb, "first_entry", (int64_t)first_entry_t);
43 + buffer_json_member_add_int64(wb, "last_entry", (int64_t)last_entry_t);
44 + buffer_json_member_add_int64(wb, "update_every", (int64_t)st->update_every);
45
46 unsigned long memory = sizeof(RRDSET);
47
48 size_t dimensions = 0;
89 - RRDDIM *rd;
90 - rrddim_foreach_read(rd, st) {
91 - if(rrddim_option_check(rd, RRDDIM_OPTION_HIDDEN) || rrddim_flag_check(rd, RRDDIM_FLAG_OBSOLETE)) continue;
92 -
93 - memory += rrddim_size() + rd->db.memsize;
94 -
95 - if (dimensions)
96 - buffer_strcat(wb, ",\n\t\t\t\t\"");
97 - else
98 - buffer_strcat(wb, "\t\t\t\t\"");
99 - buffer_json_strcat(wb, rrddim_id(rd));
100 - buffer_strcat(wb, "\": { \"name\": \"");
101 - buffer_json_strcat(wb, rrddim_name(rd));
102 - buffer_strcat(wb, "\" }");
103 -
104 - dimensions++;
49 + buffer_json_member_add_object(wb, "dimensions");
50 + {
51 + RRDDIM *rd;
52 + rrddim_foreach_read(rd, st)
53 + {
54 + if (rrddim_option_check(rd, RRDDIM_OPTION_HIDDEN) || rrddim_flag_check(rd, RRDDIM_FLAG_OBSOLETE))
55 + continue;
56 +
57 + memory += rrddim_size() + rd->db.memsize;
58 +
59 + buffer_json_member_add_object(wb, rrddim_id(rd));
60 + buffer_json_member_add_string(wb, "name", rrddim_name(rd));
61 + buffer_json_object_close(wb);
62 +
63 + dimensions++;
64 + }
65 + rrddim_foreach_done(rd);
66 }
106 - rrddim_foreach_done(rd);
67 + buffer_json_object_close(wb);
68
69 if(dimensions_count) *dimensions_count += dimensions;
70 if(memory_used) *memory_used += memory;
71
111 - buffer_sprintf(wb, "\n\t\t\t},\n\t\t\t\"chart_variables\": ");
72 + buffer_json_member_add_object(wb, "chart_variables");
73 health_api_v1_chart_custom_variables2json(st, wb);
74 + buffer_json_object_close(wb);
75
114 - buffer_strcat(wb, ",\n\t\t\t\"green\": ");
115 - buffer_print_netdata_double(wb, st->green);
116 - buffer_strcat(wb, ",\n\t\t\t\"red\": ");
117 - buffer_print_netdata_double(wb, st->red);
76 + buffer_json_member_add_double(wb, "green", st->green);
77 + buffer_json_member_add_double(wb, "red", st->red);
78
119 - if (likely(!skip_volatile)) {
120 - buffer_strcat(wb, ",\n\t\t\t\"alarms\": {\n");
121 - size_t alarms = 0;
79 + {
80 + buffer_json_member_add_object(wb, "alarms");
81 RRDCALC *rc;
82 rw_spinlock_read_lock(&st->alerts.spinlock);
124 - DOUBLE_LINKED_LIST_FOREACH_FORWARD(st->alerts.base, rc, prev, next) {
125 - buffer_sprintf(
126 - wb,
127 - "%s"
128 - "\t\t\t\t\"%s\": {\n"
129 - "\t\t\t\t\t\"id\": %u,\n"
130 - "\t\t\t\t\t\"status\": \"%s\",\n"
131 - "\t\t\t\t\t\"units\": \"%s\",\n"
132 - "\t\t\t\t\t\"update_every\": %d\n"
133 - "\t\t\t\t}",
134 - (alarms) ? ",\n" : "", rrdcalc_name(rc), rc->id, rrdcalc_status2string(rc->status), rrdcalc_units(rc),
135 - rc->update_every);
136 -
137 - alarms++;
83 + DOUBLE_LINKED_LIST_FOREACH_FORWARD(st->alerts.base, rc, prev, next)
84 + {
85 + {
86 + buffer_json_member_add_object(wb, rrdcalc_name(rc));
87 + buffer_json_member_add_string_or_empty(wb, "id", rrdcalc_name(rc));
88 + buffer_json_member_add_string_or_empty(wb, "status", rrdcalc_status2string(rc->status));
89 + buffer_json_member_add_string_or_empty(wb, "units", rrdcalc_units(rc));
90 + buffer_json_member_add_int64(wb, "duration", (int64_t)rc->update_every);
91 + buffer_json_object_close(wb);
92 + }
93 }
94 rw_spinlock_read_unlock(&st->alerts.spinlock);
140 - buffer_sprintf(wb,
141 - "\n\t\t\t}"
142 - );
95 + buffer_json_object_close(wb);
96 }
144 - buffer_strcat(wb, ",\n\t\t\t\"chart_labels\": {\n");
145 - chart_labels2json(st, wb, 2);
146 - buffer_strcat(wb, "\t\t\t}");
97
148 - buffer_strcat(wb, ",\n\t\t\t\"functions\": {\n");
149 - chart_functions2json(st, wb, 4, "\"", "\"");
150 - buffer_strcat(wb, "\t\t\t}");
98 + buffer_json_member_add_object(wb, "chart_labels");
99 + chart_labels2json(st, wb);
100 + buffer_json_object_close(wb);
101
152 - buffer_sprintf(wb,
153 - "\n\t\t}"
154 - );
102 + buffer_json_member_add_object(wb, "functions");
103 + chart_functions2json(st, wb);
104 + buffer_json_object_close(wb);
105 }
web/api/formatters/rrdset2json.h
+1 -1
@@ -5,6 +5,6 @@
5
6 #include "rrd2json.h"
7
8 -void rrdset2json(RRDSET *st, BUFFER *wb, size_t *dimensions_count, size_t *memory_used, int skip_volatile);
8 +void rrdset2json(RRDSET *st, BUFFER *wb, size_t *dimensions_count, size_t *memory_used);
9
10 #endif //NETDATA_API_FORMATTER_RRDSET2JSON_H
web/api/web_api_v1.c
+1 -1
@@ -644,7 +644,7 @@ inline int web_client_api_request_v1_charts(RRDHOST *host, struct web_client *w,
644
645 buffer_flush(w->response.data);
646 w->response.data->content_type = CT_APPLICATION_JSON;
647 - charts2json(host, w->response.data, 0);
647 + charts2json(host, w->response.data);
648 return HTTP_RESP_OK;
649 }
650