Extend netdata info API call (#5889)
* Add array of collector plugins-modules to api/v1/info * Add system info to api/v1/info, collect data from separate script, use environment vars in anonymous statistics script
Chris Akritidis committed
Apr 18, 2019 at 18:17 UTC
ca95332d55cf4aa825331f4f7c3e6645797a7415
9 files changed
+268
-140
daemon/Makefile.am
+1
@@ -17,4 +17,5 @@ dist_noinst_DATA = \
17
18
dist_plugins_SCRIPTS = \
19
anonymous-statistics.sh \
20
+ system-info.sh \
21
$(NULL)
daemon/anonymous-statistics.sh.in
+43
-137
@@ -22,117 +22,23 @@ if [ -f "@configdir_POST@/.opt-out-from-anonymous-statistics" ]; then
22
exit 0
23
fi
24
25
-# -------------------------------------------------------------------------------------------------
26
-# detect the operating system
27
-
28
-OS_DETECTION="unknown"
29
-NAME="unknown"
30
-VERSION="unknown"
31
-VERSION_ID="unknown"
32
-ID="unknown"
33
-ID_LIKE="unknown"
34
-
35
-if [ -f "/etc/os-release" ]; then
36
- OS_DETECTION="/etc/os-release"
37
- eval "$(grep -E "^(NAME|ID|ID_LIKE|VERSION|VERSION_ID)=" </etc/os-release)"
38
-fi
39
-
40
-if [ "${NAME}" = "unknown" ] || [ "${VERSION}" = "unknown" ] || [ "${ID}" = "unknown" ]; then
41
- if [ -f "/etc/lsb-release" ]; then
42
- if [ "${OS_DETECTION}" = "unknown" ]; then OS_DETECTION="/etc/lsb-release"; else OS_DETECTION="Mixed"; fi
43
- DISTRIB_ID="unknown"
44
- DISTRIB_RELEASE="unknown"
45
- DISTRIB_CODENAME="unknown"
46
- eval "$(grep -E "^(DISTRIB_ID|DISTRIB_RELEASE|DISTRIB_CODENAME)=" </etc/lsb-release)"
47
- if [ "${NAME}" = "unknown" ]; then NAME="${DISTRIB_ID}"; fi
48
- if [ "${VERSION}" = "unknown" ]; then VERSION="${DISTRIB_RELEASE}"; fi
49
- if [ "${ID}" = "unknown" ]; then ID="${DISTRIB_CODENAME}"; fi
50
- elif [ -n "$(command -v lsb_release 2>/dev/null)" ]; then
51
- if [ "${OS_DETECTION}" = "unknown" ]; then OS_DETECTION="lsb_release"; else OS_DETECTION="Mixed"; fi
52
- if [ "${NAME}" = "unknown" ]; then NAME="$(lsb_release -is 2>/dev/null)"; fi
53
- if [ "${VERSION}" = "unknown" ]; then VERSION="$(lsb_release -rs 2>/dev/null)"; fi
54
- if [ "${ID}" = "unknown" ]; then ID="$(lsb_release -cs 2>/dev/null)"; fi
55
- fi
56
-fi
57
-
58
-# -------------------------------------------------------------------------------------------------
59
-# detect the kernel
60
-
61
-KERNEL_NAME="$(uname -s)"
62
-KERNEL_VERSION="$(uname -r)"
63
-ARCHITECTURE="$(uname -m)"
64
-
65
-# -------------------------------------------------------------------------------------------------
66
-# detect the virtualization
67
-
68
-VIRTUALIZATION="unknown"
69
-VIRT_DETECTION="none"
70
-CONTAINER="unknown"
71
-CONT_DETECTION="none"
72
-
73
-if [ -n "$(command -v systemd-detect-virt 2>/dev/null)" ]; then
74
- VIRTUALIZATION="$(systemd-detect-virt -v)"
75
- VIRT_DETECTION="systemd-detect-virt"
76
- CONTAINER="$(systemd-detect-virt -c)"
77
- CONT_DETECTION="systemd-detect-virt"
78
-else
79
- if grep -q "^flags.*hypervisor" /proc/cpuinfo 2>/dev/null; then
80
- VIRTUALIZATION="hypervisor"
81
- VIRT_DETECTION="/proc/cpuinfo"
82
- fi
83
-fi
84
-
85
-# -------------------------------------------------------------------------------------------------
86
-# detect containers with heuristics
87
-
88
-if [ "${CONTAINER}" = "unknown" ]; then
89
- if [ -f /proc/1/sched ] ; then
90
- IFS='(, ' read -r process _ </proc/1/sched
91
- if [ "${process}" = "netdata" ]; then
92
- CONTAINER="container"
93
- CONT_DETECTION="process"
94
- fi
95
- fi
96
- # ubuntu and debian supply /bin/running-in-container
97
- # https://www.apt-browse.org/browse/ubuntu/trusty/main/i386/upstart/1.12.1-0ubuntu4/file/bin/running-in-container
98
- if /bin/running-in-container >/dev/null 2>&1; then
99
- CONTAINER="container"
100
- CONT_DETECTION="/bin/running-in-container"
101
- fi
102
-
103
- # lxc sets environment variable 'container'
104
- #shellcheck disable=SC2154
105
- if [ -n "${container}" ]; then
106
- CONTAINER="lxc"
107
- CONT_DETECTION="containerenv"
108
- fi
109
-
110
- # docker creates /.dockerenv
111
- # http://stackoverflow.com/a/25518345
112
- if [ -f "/.dockerenv" ]; then
113
- CONTAINER="docker"
114
- CONT_DETECTION="dockerenv"
115
- fi
116
-fi
117
-
118
-# -------------------------------------------------------------------------------------------------
119
-# check netdata version
120
-
121
-if [ -z "${NETDATA_VERSION}" ]; then
122
- NETDATA_VERSION="uknown"
123
- netdata -V >/dev/null 2>&1 && NETDATA_VERSION="$(netdata -V 2>&1 | cut -d ' ' -f 2)"
124
-fi
125
-
126
-# -------------------------------------------------------------------------------------------------
127
-# check netdata unique id
128
-if [ -z "${NETDATA_REGISTRY_UNIQUE_ID}" ] ; then
129
- if [ -f "@registrydir_POST@/netdata.public.unique.id" ]; then
130
- NETDATA_REGISTRY_UNIQUE_ID="$(cat "@registrydir_POST@/netdata.public.unique.id")"
131
- else
132
- NETDATA_REGISTRY_UNIQUE_ID="unknown"
133
- fi
134
-fi
135
-
25
+echo "&av=${NETDATA_VERSION}\
26
+&ec=${ACTION}\
27
+&ea=${ACTION_RESULT}\
28
+&el=${ACTION_DATA}\
29
+&cd1=${NETDATA_SYSTEM_OS_NAME}\
30
+&cd2=${NETDATA_SYSTEM_OS_ID}\
31
+&cd3=${NETDATA_SYSTEM_OS_ID_LIKE}\
32
+&cd4=${NETDATA_SYSTEM_OS_VERSION}\
33
+&cd5=${NETDATA_SYSTEM_OS_VERSION_ID}\
34
+&cd6=${NETDATA_SYSTEM_OS_DETECTION}\
35
+&cd7=${NETDATA_SYSTEM_KERNEL_NAME}\
36
+&cd8=${NETDATA_SYSTEM_KERNEL_VERSION}\
37
+&cd9=${NETDATA_SYSTEM_ARCHITECTURE}\
38
+&cd10=${NETDATA_SYSTEM_VIRTUALIZATION}\
39
+&cd11=${NETDATA_SYSTEM_VIRT_DETECTION}\
40
+&cd12=${NETDATA_SYSTEM_CONTAINER}\
41
+&cd13=${NETDATA_SYSTEM_CONTAINER_DETECTION}" >> /tmp/as.log
42
43
# -------------------------------------------------------------------------------------------------
44
# send the anonymous statistics to GA
@@ -152,19 +58,19 @@ if [ -n "$(command -v curl 2>/dev/null)" ]; then
58
--data-urlencode "ec=${ACTION}" \
59
--data-urlencode "ea=${ACTION_RESULT}" \
60
--data-urlencode "el=${ACTION_DATA}" \
155
- --data-urlencode "cd1=${NAME}" \
156
- --data-urlencode "cd2=${ID}" \
157
- --data-urlencode "cd3=${ID_LIKE}" \
158
- --data-urlencode "cd4=${VERSION}" \
159
- --data-urlencode "cd5=${VERSION_ID}" \
160
- --data-urlencode "cd6=${OS_DETECTION}" \
161
- --data-urlencode "cd7=${KERNEL_NAME}" \
162
- --data-urlencode "cd8=${KERNEL_VERSION}" \
163
- --data-urlencode "cd9=${ARCHITECTURE}" \
164
- --data-urlencode "cd10=${VIRTUALIZATION}" \
165
- --data-urlencode "cd11=${VIRT_DETECTION}" \
166
- --data-urlencode "cd12=${CONTAINER}" \
167
- --data-urlencode "cd13=${CONT_DETECTION}" \
61
+ --data-urlencode "cd1=${NETDATA_SYSTEM_OS_NAME}" \
62
+ --data-urlencode "cd2=${NETDATA_SYSTEM_OS_ID}" \
63
+ --data-urlencode "cd3=${NETDATA_SYSTEM_OS_ID_LIKE}" \
64
+ --data-urlencode "cd4=${NETDATA_SYSTEM_OS_VERSION}" \
65
+ --data-urlencode "cd5=${NETDATA_SYSTEM_OS_DETECTION}" \
66
+ --data-urlencode "cd6=${NETDATA_SYSTEM_OS_DETECTION}" \
67
+ --data-urlencode "cd7=${NETDATA_SYSTEM_KERNEL_NAME}" \
68
+ --data-urlencode "cd8=${NETDATA_SYSTEM_KERNEL_VERSION}" \
69
+ --data-urlencode "cd9=${NETDATA_SYSTEM_ARCHITECTURE}" \
70
+ --data-urlencode "cd10=${NETDATA_SYSTEM_VIRTUALIZATION}" \
71
+ --data-urlencode "cd11=${NETDATA_SYSTEM_VIRT_DETECTION}" \
72
+ --data-urlencode "cd12=${NETDATA_SYSTEM_CONTAINER}" \
73
+ --data-urlencode "cd13=${NETDATA_SYSTEM_CONTAINER_DETECTION}" \
74
"https://www.google-analytics.com/collect" >/dev/null 2>&1
75
else
76
wget -q -O - --timeout=1 "https://www.google-analytics.com/collect?\
@@ -181,18 +87,18 @@ else
87
&ec=${ACTION}\
88
&ea=${ACTION_RESULT}\
89
&el=${ACTION_DATA}\
184
-&cd1=${NAME}\
185
-&cd2=${ID}\
186
-&cd3=${ID_LIKE}\
187
-&cd4=${VERSION}\
188
-&cd5=${VERSION_ID}\
189
-&cd6=${OS_DETECTION}\
190
-&cd7=${KERNEL_NAME}\
191
-&cd8=${KERNEL_VERSION}\
192
-&cd9=${ARCHITECTURE}\
193
-&cd10=${VIRTUALIZATION}\
194
-&cd11=${VIRT_DETECTION}\
195
-&cd12=${CONTAINER}\
196
-&cd13=${CONT_DETECTION}\
90
+&cd1=${NETDATA_SYSTEM_OS_NAME}\
91
+&cd2=${NETDATA_SYSTEM_OS_ID}\
92
+&cd3=${NETDATA_SYSTEM_OS_ID_LIKE}\
93
+&cd4=${NETDATA_SYSTEM_OS_VERSION}\
94
+&cd5=${NETDATA_SYSTEM_OS_VERSION_ID}\
95
+&cd6=${NETDATA_SYSTEM_OS_DETECTION}\
96
+&cd7=${NETDATA_SYSTEM_KERNEL_NAME}\
97
+&cd8=${NETDATA_SYSTEM_KERNEL_VERSION}\
98
+&cd9=${NETDATA_SYSTEM_ARCHITECTURE}\
99
+&cd10=${NETDATA_SYSTEM_VIRTUALIZATION}\
100
+&cd11=${NETDATA_SYSTEM_VIRT_DETECTION}\
101
+&cd12=${NETDATA_SYSTEM_CONTAINER}\
102
+&cd13=${NETDATA_SYSTEM_CONTAINER_DETECTION}\
103
" > /dev/null 2>&1
104
fi
daemon/common.h
+2
@@ -79,4 +79,6 @@ extern char *netdata_configured_host_prefix;
79
extern char *netdata_configured_timezone;
80
extern int netdata_anonymous_statistics_enabled;
81
82
+int netdata_ready;
83
+
84
#endif /* NETDATA_COMMON_H */
daemon/daemon.h
+1
@@ -12,4 +12,5 @@ extern void send_statistics(const char *action, const char *action_result, const
12
13
extern char pidfile[];
14
15
+
16
#endif /* NETDATA_DAEMON_H */
daemon/main.c
+40
-2
@@ -650,6 +650,43 @@ static int load_netdata_conf(char *filename, char overwrite_used) {
650
return ret;
651
}
652
653
+int get_system_info () {
654
+ char *script;
655
+ script = mallocz(sizeof(char) * (strlen(netdata_configured_primary_plugins_dir) + strlen("system-info.sh") + 2));
656
+ sprintf(script, "%s/%s", netdata_configured_primary_plugins_dir, "system-info.sh");
657
+ if (unlikely(access(script, R_OK) != 0)) {
658
+ info("System info script %s not found.",script);
659
+ freez(script);
660
+ return 1;
661
+ }
662
+
663
+ pid_t command_pid;
664
+
665
+ info("Executing %s", script);
666
+
667
+ FILE *fp = mypopen(script, &command_pid);
668
+ if(fp) {
669
+ char buffer[200 + 1];
670
+ while (fgets(buffer, 200, fp) != NULL) {
671
+ char *name=buffer;
672
+ char *value=buffer;
673
+ while (*value && *value != '=') value++;
674
+ if (*value=='=') {
675
+ *value='\0';
676
+ value++;
677
+ char *newline = value + strlen(value) - 1;
678
+ (*newline)='\0';
679
+ }
680
+ if (name && value && *name && *value) {
681
+ info("%s=%s", name, value);
682
+ setenv(name, value, 1);
683
+ }
684
+ }
685
+ mypclose(fp, command_pid);
686
+ }
687
+ freez(script);
688
+ return 0;
689
+}
690
691
void send_statistics( const char *action, const char *action_result, const char *action_data) {
692
static char *as_script;
@@ -697,6 +734,7 @@ int main(int argc, char **argv) {
734
int dont_fork = 0;
735
size_t default_stacksize;
736
737
+ netdata_ready=0;
738
// set the name for logging
739
program_name = "netdata";
740
@@ -1053,7 +1091,7 @@ int main(int argc, char **argv) {
1091
// initialize the log files
1092
open_all_log_files();
1093
netdata_anonymous_statistics_enabled=-1;
1056
- send_statistics("START","-", "-");
1094
+ if (get_system_info() == 0) send_statistics("START","-", "-");
1095
1096
#ifdef NETDATA_INTERNAL_CHECKS
1097
if(debug_flags != 0) {
@@ -1113,7 +1151,7 @@ int main(int argc, char **argv) {
1151
}
1152
1153
info("netdata initialization completed. Enjoy real-time performance monitoring!");
1116
-
1154
+ netdata_ready = 1;
1155
1156
// ------------------------------------------------------------------------
1157
// unblock signals
daemon/system-info.sh
new
+109
@@ -0,0 +1,109 @@
1
+#!/usr/bin/env sh
2
+
3
+# -------------------------------------------------------------------------------------------------
4
+# detect the operating system
5
+
6
+OS_DETECTION="unknown"
7
+NAME="unknown"
8
+VERSION="unknown"
9
+VERSION_ID="unknown"
10
+ID="unknown"
11
+ID_LIKE="unknown"
12
+
13
+if [ -f "/etc/os-release" ]; then
14
+ OS_DETECTION="/etc/os-release"
15
+ eval "$(grep -E "^(NAME|ID|ID_LIKE|VERSION|VERSION_ID)=" </etc/os-release)"
16
+fi
17
+
18
+if [ "${NAME}" = "unknown" ] || [ "${VERSION}" = "unknown" ] || [ "${ID}" = "unknown" ]; then
19
+ if [ -f "/etc/lsb-release" ]; then
20
+ if [ "${OS_DETECTION}" = "unknown" ]; then OS_DETECTION="/etc/lsb-release"; else OS_DETECTION="Mixed"; fi
21
+ DISTRIB_ID="unknown"
22
+ DISTRIB_RELEASE="unknown"
23
+ DISTRIB_CODENAME="unknown"
24
+ eval "$(grep -E "^(DISTRIB_ID|DISTRIB_RELEASE|DISTRIB_CODENAME)=" </etc/lsb-release)"
25
+ if [ "${NAME}" = "unknown" ]; then NAME="${DISTRIB_ID}"; fi
26
+ if [ "${VERSION}" = "unknown" ]; then VERSION="${DISTRIB_RELEASE}"; fi
27
+ if [ "${ID}" = "unknown" ]; then ID="${DISTRIB_CODENAME}"; fi
28
+ elif [ -n "$(command -v lsb_release 2>/dev/null)" ]; then
29
+ if [ "${OS_DETECTION}" = "unknown" ]; then OS_DETECTION="lsb_release"; else OS_DETECTION="Mixed"; fi
30
+ if [ "${NAME}" = "unknown" ]; then NAME="$(lsb_release -is 2>/dev/null)"; fi
31
+ if [ "${VERSION}" = "unknown" ]; then VERSION="$(lsb_release -rs 2>/dev/null)"; fi
32
+ if [ "${ID}" = "unknown" ]; then ID="$(lsb_release -cs 2>/dev/null)"; fi
33
+ fi
34
+fi
35
+
36
+# -------------------------------------------------------------------------------------------------
37
+# detect the kernel
38
+
39
+KERNEL_NAME="$(uname -s)"
40
+KERNEL_VERSION="$(uname -r)"
41
+ARCHITECTURE="$(uname -m)"
42
+
43
+# -------------------------------------------------------------------------------------------------
44
+# detect the virtualization
45
+
46
+VIRTUALIZATION="unknown"
47
+VIRT_DETECTION="none"
48
+CONTAINER="unknown"
49
+CONT_DETECTION="none"
50
+
51
+if [ -n "$(command -v systemd-detect-virt 2>/dev/null)" ]; then
52
+ VIRTUALIZATION="$(systemd-detect-virt -v)"
53
+ VIRT_DETECTION="systemd-detect-virt"
54
+ CONTAINER="$(systemd-detect-virt -c)"
55
+ CONT_DETECTION="systemd-detect-virt"
56
+else
57
+ if grep -q "^flags.*hypervisor" /proc/cpuinfo 2>/dev/null; then
58
+ VIRTUALIZATION="hypervisor"
59
+ VIRT_DETECTION="/proc/cpuinfo"
60
+ fi
61
+fi
62
+
63
+# -------------------------------------------------------------------------------------------------
64
+# detect containers with heuristics
65
+
66
+if [ "${CONTAINER}" = "unknown" ]; then
67
+ if [ -f /proc/1/sched ] ; then
68
+ IFS='(, ' read -r process _ </proc/1/sched
69
+ if [ "${process}" = "netdata" ]; then
70
+ CONTAINER="container"
71
+ CONT_DETECTION="process"
72
+ fi
73
+ fi
74
+ # ubuntu and debian supply /bin/running-in-container
75
+ # https://www.apt-browse.org/browse/ubuntu/trusty/main/i386/upstart/1.12.1-0ubuntu4/file/bin/running-in-container
76
+ if /bin/running-in-container >/dev/null 2>&1; then
77
+ CONTAINER="container"
78
+ CONT_DETECTION="/bin/running-in-container"
79
+ fi
80
+
81
+ # lxc sets environment variable 'container'
82
+ #shellcheck disable=SC2154
83
+ if [ -n "${container}" ]; then
84
+ CONTAINER="lxc"
85
+ CONT_DETECTION="containerenv"
86
+ fi
87
+
88
+ # docker creates /.dockerenv
89
+ # http://stackoverflow.com/a/25518345
90
+ if [ -f "/.dockerenv" ]; then
91
+ CONTAINER="docker"
92
+ CONT_DETECTION="dockerenv"
93
+ fi
94
+fi
95
+
96
+echo "NETDATA_SYSTEM_OS_NAME=\"${NAME}\""
97
+echo "NETDATA_SYSTEM_OS_ID=${ID}"
98
+echo "NETDATA_SYSTEM_OS_ID_LIKE=${ID_LIKE}"
99
+echo "NETDATA_SYSTEM_OS_VERSION=${VERSION}"
100
+echo "NETDATA_SYSTEM_OS_VERSION_ID=${VERSION_ID}"
101
+echo "NETDATA_SYSTEM_OS_DETECTION=${OS_DETECTION}"
102
+echo "NETDATA_SYSTEM_KERNEL_NAME=${KERNEL_NAME}"
103
+echo "NETDATA_SYSTEM_KERNEL_VERSION=${KERNEL_VERSION}"
104
+echo "NETDATA_SYSTEM_ARCHITECTURE=${ARCHITECTURE}"
105
+echo "NETDATA_SYSTEM_VIRTUALIZATION=${VIRTUALIZATION}"
106
+echo "NETDATA_SYSTEM_VIRT_DETECTION=${VIRT_DETECTION}"
107
+echo "NETDATA_SYSTEM_CONTAINER=${CONTAINER}"
108
+echo "NETDATA_SYSTEM_CONTAINER_DETECTION=${CONT_DETECTION}"
109
+
web/api/formatters/charts2json.c
+41
@@ -135,3 +135,44 @@ void charts2json(RRDHOST *host, BUFFER *wb) {
135
136
buffer_sprintf(wb, "\n\t]\n}\n");
137
}
138
+
139
+int print_collector(void *entry, void *data) {
140
+ struct array_printer *ap = (struct array_printer *)data;
141
+ BUFFER *wb = ap->wb;
142
+ struct collector *col=(struct collector *) entry;
143
+ if(ap->c) buffer_strcat(wb, ",");
144
+ buffer_strcat(wb, "\n\t\t{\n\t\t\t\"plugin\": \"");
145
+ buffer_strcat(wb, col->plugin);
146
+ buffer_strcat(wb, "\",\n\t\t\t\"module\": \"");
147
+ buffer_strcat(wb, col->module);
148
+ buffer_strcat(wb, "\"\n\t\t}");
149
+ (ap->c)++;
150
+ return 0;
151
+}
152
+
153
+void chartcollectors2json(RRDHOST *host, BUFFER *wb) {
154
+ DICTIONARY *dict = dictionary_create(DICTIONARY_FLAG_SINGLE_THREADED);
155
+ RRDSET *st;
156
+ char name[500];
157
+
158
+ time_t now = now_realtime_sec();
159
+ rrdhost_rdlock(host);
160
+ rrdset_foreach_read(st, host) {
161
+ if (rrdset_is_available_for_viewers(st)) {
162
+ struct collector col = {
163
+ .plugin = st->plugin_name ? st->plugin_name : "",
164
+ .module = st->module_name ? st->module_name : ""
165
+ };
166
+ sprintf(name, "%s:%s", col.plugin, col.module);
167
+ dictionary_set(dict, name, &col, sizeof(struct collector));
168
+ st->last_accessed_time = now;
169
+ }
170
+ }
171
+ rrdhost_unlock(host);
172
+ struct array_printer ap = {
173
+ .c = 0,
174
+ .wb = wb
175
+ };
176
+ dictionary_get_all(dict, print_collector, &ap);
177
+ dictionary_destroy(dict);
178
+}
web/api/formatters/charts2json.h
+11
@@ -5,6 +5,17 @@
5
6
#include "rrd2json.h"
7
8
+struct collector {
9
+ char *plugin;
10
+ char *module;
11
+};
12
+
13
+struct array_printer {
14
+ int c;
15
+ BUFFER *wb;
16
+};
17
+
18
extern void charts2json(RRDHOST *host, BUFFER *wb);
19
+extern void chartcollectors2json(RRDHOST *host, BUFFER *wb);
20
21
#endif //NETDATA_API_FORMATTER_CHARTS2JSON_H
web/api/web_api_v1.c
+20
-1
@@ -717,6 +717,7 @@ static inline void web_client_api_request_v1_info_mirrored_hosts(BUFFER *wb) {
717
718
inline int web_client_api_request_v1_info(RRDHOST *host, struct web_client *w, char *url) {
719
(void)url;
720
+ if (!netdata_ready) return 400;
721
722
BUFFER *wb = w->response.data;
723
buffer_flush(wb);
@@ -732,7 +733,25 @@ inline int web_client_api_request_v1_info(RRDHOST *host, struct web_client *w, c
733
734
buffer_strcat(wb, "\t\"alarms\": {\n");
735
web_client_api_request_v1_info_summary_alarm_statuses(host, wb);
735
- buffer_strcat(wb, "\t}\n");
736
+ buffer_strcat(wb, "\t},\n");
737
+
738
+ buffer_sprintf(wb, "\t\"os_name\": %s,\n", getenv("NETDATA_SYSTEM_OS_NAME"));
739
+ buffer_sprintf(wb, "\t\"os_id\": \"%s\",\n", getenv("NETDATA_SYSTEM_OS_ID"));
740
+ buffer_sprintf(wb, "\t\"os_id_like\": \"%s\",\n", getenv("NETDATA_SYSTEM_OS_ID_LIKE"));
741
+ buffer_sprintf(wb, "\t\"os_version\": \"%s\",\n", getenv("NETDATA_SYSTEM_OS_VERSION"));
742
+ buffer_sprintf(wb, "\t\"os_version_id\": \"%s\",\n", getenv("NETDATA_SYSTEM_OS_VERSION_ID"));
743
+ buffer_sprintf(wb, "\t\"os_detection\": \"%s\",\n", getenv("NETDATA_SYSTEM_OS_DETECTION"));
744
+ buffer_sprintf(wb, "\t\"kernel_name\": \"%s\",\n", getenv("NETDATA_SYSTEM_KERNEL_NAME"));
745
+ buffer_sprintf(wb, "\t\"kernel_version\": \"%s\",\n", getenv("NETDATA_SYSTEM_KERNEL_VERSION"));
746
+ buffer_sprintf(wb, "\t\"architecture\": \"%s\",\n", getenv("NETDATA_SYSTEM_ARCHITECTURE"));
747
+ buffer_sprintf(wb, "\t\"virtualization\": \"%s\",\n", getenv("NETDATA_SYSTEM_VIRTUALIZATION"));
748
+ buffer_sprintf(wb, "\t\"virt_detection\": \"%s\",\n", getenv("NETDATA_SYSTEM_VIRT_DETECTION"));
749
+ buffer_sprintf(wb, "\t\"container\": \"%s\",\n", getenv("NETDATA_SYSTEM_CONTAINER"));
750
+ buffer_sprintf(wb, "\t\"container_detection\": \"%s\",\n", getenv("NETDATA_SYSTEM_CONTAINER_DETECTION"));
751
+
752
+ buffer_strcat(wb, "\t\"collectors\": [");
753
+ chartcollectors2json(host, wb);
754
+ buffer_strcat(wb, "\n\t]\n");
755
756
buffer_strcat(wb, "}");
757
return 200;