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