@cryptotaxi247 / netdata-1 / commits / ca95332d5

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;