@cryptotaxi247 / netdata-1 / commits / 49f695082

Issue 7488 docker labels (#7770)

Improve the metadata detection for containers. The system_info structure has been updated to hold separate copies of OS_NAME, OS_ID, OS_ID_LIKE, OS_VERSION, OS_VERSION_ID and OS_DETECTION for both the container environment and the host. This new information is communicated through the /api/v1/info endpoint. For the streaming interface a partial copy of the info is carried until the stream protocol is upgraded. The anonymous_statistics script has been updated to carry the new data to Google Analytics. Some minor improvements have been made to OS-X / FreeBSD detection, and the detection of virtualization. The docs have been updated to explain how to pass the host environment to the docker container running Netdata.

Andrew Moss committed Jan 21, 2020 at 16:08 UTC 49f6950820f083956ddc2c9327eeae4e9ef0d5ed
8 files changed +347 -165
daemon/anonymous-statistics.sh.in
+25 -12
@@ -28,6 +28,7 @@ NETDATA_VERSION=$(echo "${NETDATA_VERSION}" | sed 's/-.*//g' | tr -d 'v')
28 # -------------------------------------------------------------------------------------------------
29 # send the anonymous statistics to GA
30 # https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters
31 +# The maximum index for a cd parameter is 20 so we have effectively run out.
32 if [ -n "$(command -v curl 2>/dev/null)" ]; then
33 curl -X POST -Ss --max-time 2 \
34 --data "v=1" \
@@ -43,12 +44,12 @@ if [ -n "$(command -v curl 2>/dev/null)" ]; then
44 --data-urlencode "ec=${ACTION}" \
45 --data-urlencode "ea=${ACTION_RESULT}" \
46 --data-urlencode "el=${ACTION_DATA}" \
46 - --data-urlencode "cd1=${NETDATA_SYSTEM_OS_NAME}" \
47 - --data-urlencode "cd2=${NETDATA_SYSTEM_OS_ID}" \
48 - --data-urlencode "cd3=${NETDATA_SYSTEM_OS_ID_LIKE}" \
49 - --data-urlencode "cd4=${NETDATA_SYSTEM_OS_VERSION}" \
50 - --data-urlencode "cd5=${NETDATA_SYSTEM_OS_VERSION_ID}" \
51 - --data-urlencode "cd6=${NETDATA_SYSTEM_OS_DETECTION}" \
47 + --data-urlencode "cd1=${NETDATA_HOST_OS_NAME}" \
48 + --data-urlencode "cd2=${NETDATA_HOST_OS_ID}" \
49 + --data-urlencode "cd3=${NETDATA_HOST_OS_ID_LIKE}" \
50 + --data-urlencode "cd4=${NETDATA_HOST_OS_VERSION}" \
51 + --data-urlencode "cd5=${NETDATA_HOST_OS_VERSION_ID}" \
52 + --data-urlencode "cd6=${NETDATA_HOST_OS_DETECTION}" \
53 --data-urlencode "cd7=${NETDATA_SYSTEM_KERNEL_NAME}" \
54 --data-urlencode "cd8=${NETDATA_SYSTEM_KERNEL_VERSION}" \
55 --data-urlencode "cd9=${NETDATA_SYSTEM_ARCHITECTURE}" \
@@ -56,6 +57,12 @@ if [ -n "$(command -v curl 2>/dev/null)" ]; then
57 --data-urlencode "cd11=${NETDATA_SYSTEM_VIRT_DETECTION}" \
58 --data-urlencode "cd12=${NETDATA_SYSTEM_CONTAINER}" \
59 --data-urlencode "cd13=${NETDATA_SYSTEM_CONTAINER_DETECTION}" \
60 + --data-urlencode "cd14=${NETDATA_CONTAINER_OS_NAME}" \
61 + --data-urlencode "cd15=${NETDATA_CONTAINER_OS_ID}" \
62 + --data-urlencode "cd16=${NETDATA_CONTAINER_OS_ID_LIKE}" \
63 + --data-urlencode "cd17=${NETDATA_CONTAINER_OS_VERSION}" \
64 + --data-urlencode "cd18=${NETDATA_CONTAINER_OS_VERSION_ID}" \
65 + --data-urlencode "cd19=${NETDATA_CONTAINER_OS_DETECTION}" \
66 "https://www.google-analytics.com/collect" >/dev/null 2>&1
67 else
68 wget -q -O - --timeout=1 "https://www.google-analytics.com/collect?\
@@ -72,12 +79,12 @@ else
79 &ec=${ACTION}\
80 &ea=${ACTION_RESULT}\
81 &el=${ACTION_DATA}\
75 -&cd1=${NETDATA_SYSTEM_OS_NAME}\
76 -&cd2=${NETDATA_SYSTEM_OS_ID}\
77 -&cd3=${NETDATA_SYSTEM_OS_ID_LIKE}\
78 -&cd4=${NETDATA_SYSTEM_OS_VERSION}\
79 -&cd5=${NETDATA_SYSTEM_OS_VERSION_ID}\
80 -&cd6=${NETDATA_SYSTEM_OS_DETECTION}\
82 +&cd1=${NETDATA_HOST_OS_NAME}\
83 +&cd2=${NETDATA_HOST_OS_ID}\
84 +&cd3=${NETDATA_HOST_OS_ID_LIKE}\
85 +&cd4=${NETDATA_HOST_OS_VERSION}\
86 +&cd5=${NETDATA_HOST_OS_VERSION_ID}\
87 +&cd6=${NETDATA_HOST_OS_DETECTION}\
88 &cd7=${NETDATA_SYSTEM_KERNEL_NAME}\
89 &cd8=${NETDATA_SYSTEM_KERNEL_VERSION}\
90 &cd9=${NETDATA_SYSTEM_ARCHITECTURE}\
@@ -85,5 +92,11 @@ else
92 &cd11=${NETDATA_SYSTEM_VIRT_DETECTION}\
93 &cd12=${NETDATA_SYSTEM_CONTAINER}\
94 &cd13=${NETDATA_SYSTEM_CONTAINER_DETECTION}\
95 +&cd14=${NETDATA_CONTAINER_OS_NAME} \
96 +&cd15=${NETDATA_CONTAINER_OS_ID} \
97 +&cd16=${NETDATA_CONTAINER_OS_ID_LIKE} \
98 +&cd17=${NETDATA_CONTAINER_OS_VERSION} \
99 +&cd18=${NETDATA_CONTAINER_OS_VERSION_ID} \
100 +&cd19=${NETDATA_CONTAINER_OS_DETECTION} \
101 " > /dev/null 2>&1
102 fi
daemon/main.c
+21 -15
@@ -731,6 +731,12 @@ static int load_netdata_conf(char *filename, char overwrite_used) {
731 return ret;
732 }
733
734 +// coverity[ +tainted_string_sanitize_content : arg-0 ]
735 +inline void coverity_remove_taint(char *s)
736 +{
737 + (void)s;
738 +}
739 +
740 int get_system_info(struct rrdhost_system_info *system_info) {
741 char *script;
742 script = mallocz(sizeof(char) * (strlen(netdata_configured_primary_plugins_dir) + strlen("system-info.sh") + 2));
@@ -747,27 +753,27 @@ int get_system_info(struct rrdhost_system_info *system_info) {
753
754 FILE *fp = mypopen(script, &command_pid);
755 if(fp) {
750 - char buffer[200 + 1];
751 - while (fgets(buffer, 200, fp) != NULL) {
752 - char *name=buffer;
753 - char *value=buffer;
756 + char line[200 + 1];
757 + // Removed the double strlens, if the Coverity tainted string warning reappears I'll revert.
758 + // One time init code, but I'm curious about the warning...
759 + while (fgets(line, 200, fp) != NULL) {
760 + char *value=line;
761 while (*value && *value != '=') value++;
762 if (*value=='=') {
763 *value='\0';
764 value++;
758 - if (strlen(value)>1) {
759 - char *newline = value + strlen(value) - 1;
760 - (*newline) = '\0';
761 - }
762 - char n[51], v[101];
763 - snprintfz(n, 50,"%s",name);
764 - snprintfz(v, 100,"%s",value);
765 - if(unlikely(rrdhost_set_system_info_variable(system_info, n, v))) {
766 - info("Unexpected environment variable %s=%s", n, v);
765 + char *end = value;
766 + while (*end && *end != '\n') end++;
767 + *end = '\0'; // Overwrite newline if present
768 + coverity_remove_taint(line); // I/O is controlled result of system_info.sh - not tainted
769 + coverity_remove_taint(value);
770 +
771 + if(unlikely(rrdhost_set_system_info_variable(system_info, line, value))) {
772 + info("Unexpected environment variable %s=%s", line, value);
773 }
774 else {
769 - info("%s=%s", n, v);
770 - setenv(n, v, 1);
775 + info("%s=%s", line, value);
776 + setenv(line, value, 1);
777 }
778 }
779 }
daemon/system-info.sh
+157 -88
@@ -8,111 +8,180 @@ KERNEL_VERSION="$(uname -r)"
8 ARCHITECTURE="$(uname -m)"
9
10 # -------------------------------------------------------------------------------------------------
11 -# detect the operating system
11 +# detect the virtualization
12
13 -OS_DETECTION="unknown"
14 -NAME="unknown"
15 -VERSION="unknown"
16 -VERSION_ID="unknown"
17 -ID="unknown"
18 -ID_LIKE="unknown"
13 +if [ -z "${VIRTUALIZATION}" ]; then
14 + VIRTUALIZATION="unknown"
15 + VIRT_DETECTION="none"
16
20 -if [ "${KERNEL_NAME}" = "Darwin" ]; then
21 - # Mac OS
22 - OIFS="$IFS"
23 - IFS=$'\n'
24 - set $(sw_vers) > /dev/null
25 - NAME=$(echo $1 | tr "\n\t" ' ' | sed -e 's/ProductName:[ ]*//' -e 's/[ ]*$//')
26 - VERSION=$(echo $2 | tr "\n\t" ' ' | sed -e 's/ProductVersion:[ ]*//' -e 's/[ ]*$//')
27 - ID="mac"
28 - ID_LIKE="mac"
29 - OS_DETECTION="sw_vers"
30 - IFS="$OIFS"
17 + if [ -n "$(command -v systemd-detect-virt 2>/dev/null)" ]; then
18 + VIRTUALIZATION="$(systemd-detect-virt -v)"
19 + VIRT_DETECTION="systemd-detect-virt"
20 + CONTAINER="$(systemd-detect-virt -c)"
21 + CONT_DETECTION="systemd-detect-virt"
22 + else
23 + if grep -q "^flags.*hypervisor" /proc/cpuinfo 2>/dev/null; then
24 + VIRTUALIZATION="hypervisor"
25 + VIRT_DETECTION="/proc/cpuinfo"
26 + elif [ -n "$(command -v dmidecode)" ]; then
27 + # Virtualization detection from https://unix.stackexchange.com/questions/89714/easy-way-to-determine-virtualization-technology
28 + # This only works as root
29 + if dmidecode -s system-product-name 2>/dev/null | grep -q "VMware\|Virtual\|KVM\|Bochs"; then
30 + VIRTUALIZATION="$(dmidecode -s system-product-name)"
31 + VIRT_DETECTION="dmidecode"
32 + fi
33 + fi
34 + fi
35 else
32 - if [ -f "/etc/os-release" ]; then
33 - OS_DETECTION="/etc/os-release"
34 - eval "$(grep -E "^(NAME|ID|ID_LIKE|VERSION|VERSION_ID)=" </etc/os-release)"
35 - fi
36 -
37 - if [ "${NAME}" = "unknown" ] || [ "${VERSION}" = "unknown" ] || [ "${ID}" = "unknown" ]; then
38 - if [ -f "/etc/lsb-release" ]; then
39 - if [ "${OS_DETECTION}" = "unknown" ]; then OS_DETECTION="/etc/lsb-release"; else OS_DETECTION="Mixed"; fi
40 - DISTRIB_ID="unknown"
41 - DISTRIB_RELEASE="unknown"
42 - DISTRIB_CODENAME="unknown"
43 - eval "$(grep -E "^(DISTRIB_ID|DISTRIB_RELEASE|DISTRIB_CODENAME)=" </etc/lsb-release)"
44 - if [ "${NAME}" = "unknown" ]; then NAME="${DISTRIB_ID}"; fi
45 - if [ "${VERSION}" = "unknown" ]; then VERSION="${DISTRIB_RELEASE}"; fi
46 - if [ "${ID}" = "unknown" ]; then ID="${DISTRIB_CODENAME}"; fi
47 - fi
48 - if [ -n "$(command -v lsb_release 2>/dev/null)" ]; then
49 - if [ "${OS_DETECTION}" = "unknown" ]; then OS_DETECTION="lsb_release"; else OS_DETECTION="Mixed"; fi
50 - if [ "${NAME}" = "unknown" ]; then NAME="$(lsb_release -is 2>/dev/null)"; fi
51 - if [ "${VERSION}" = "unknown" ]; then VERSION="$(lsb_release -rs 2>/dev/null)"; fi
52 - if [ "${ID}" = "unknown" ]; then ID="$(lsb_release -cs 2>/dev/null)"; fi
53 - fi
54 - fi
36 + # Passed from outside - probably in docker run
37 + VIRT_DETECTION="provided"
38 fi
39
40 # -------------------------------------------------------------------------------------------------
58 -# detect the virtualization
41 +# detect containers with heuristics
42
60 -VIRTUALIZATION="unknown"
61 -VIRT_DETECTION="none"
43 CONTAINER="unknown"
44 CONT_DETECTION="none"
45
65 -if [ -n "$(command -v systemd-detect-virt 2>/dev/null)" ]; then
66 - VIRTUALIZATION="$(systemd-detect-virt -v)"
67 - VIRT_DETECTION="systemd-detect-virt"
68 - CONTAINER="$(systemd-detect-virt -c)"
69 - CONT_DETECTION="systemd-detect-virt"
70 -else
71 - if grep -q "^flags.*hypervisor" /proc/cpuinfo 2>/dev/null; then
72 - VIRTUALIZATION="hypervisor"
73 - VIRT_DETECTION="/proc/cpuinfo"
74 - fi
46 +if [ "${CONTAINER}" = "unknown" ]; then
47 + if [ -f /proc/1/sched ] ; then
48 + IFS='(, ' read -r process _ </proc/1/sched
49 + if [ "${process}" = "netdata" ]; then
50 + CONTAINER="container"
51 + CONT_DETECTION="process"
52 + fi
53 + fi
54 + # ubuntu and debian supply /bin/running-in-container
55 + # https://www.apt-browse.org/browse/ubuntu/trusty/main/i386/upstart/1.12.1-0ubuntu4/file/bin/running-in-container
56 + if /bin/running-in-container >/dev/null 2>&1; then
57 + CONTAINER="container"
58 + CONT_DETECTION="/bin/running-in-container"
59 + fi
60 +
61 + # lxc sets environment variable 'container'
62 + #shellcheck disable=SC2154
63 + if [ -n "${container}" ]; then
64 + CONTAINER="lxc"
65 + CONT_DETECTION="containerenv"
66 + fi
67 +
68 + # docker creates /.dockerenv
69 + # http://stackoverflow.com/a/25518345
70 + if [ -f "/.dockerenv" ]; then
71 + CONTAINER="docker"
72 + CONT_DETECTION="dockerenv"
73 + fi
74 +
75 fi
76
77 # -------------------------------------------------------------------------------------------------
78 -# detect containers with heuristics
78 +# detect the operating system
79 +
80 +# Initially assume all OS detection values are for a container, these are moved later if we are bare-metal
81 +
82 +CONTAINER_OS_DETECTION="unknown"
83 +CONTAINER_NAME="unknown"
84 +CONTAINER_VERSION="unknown"
85 +CONTAINER_VERSION_ID="unknown"
86 +CONTAINER_ID="unknown"
87 +CONTAINER_ID_LIKE="unknown"
88 +
89 +if [ "${KERNEL_NAME}" = "Darwin" ]; then
90 + CONTAINER_ID=$(sw_vers -productName)
91 + CONTAINER_ID_LIKE="mac"
92 + CONTAINER_NAME="mac"
93 + CONTAINER_VERSION=$(sw_vers -productVersion)
94 + CONTAINER_OS_DETECTION="sw_vers"
95 +elif [ "${KERNEL_NAME}" = "FreeBSD" ]; then
96 + CONTAINER_ID="FreeBSD"
97 + CONTAINER_ID_LIKE="FreeBSD"
98 + CONTAINER_NAME="FreeBSD"
99 + CONTAINER_OS_DETECTION="uname"
100 + CONTAINER_VERSION=$(uname -r)
101 + KERNEL_VERSION=$(uname -K)
102 +else
103 + if [ -f "/etc/os-release" ]; then
104 + eval "$(grep -E "^(NAME|ID|ID_LIKE|VERSION|VERSION_ID)=" </etc/os-release | sed 's/^/CONTAINER_/')"
105 + CONTAINER_OS_DETECTION="/etc/os-release"
106 + fi
107 +
108 + if [ "${NAME}" = "unknown" ] || [ "${VERSION}" = "unknown" ] || [ "${ID}" = "unknown" ]; then
109 + if [ -f "/etc/lsb-release" ]; then
110 + if [ "${OS_DETECTION}" = "unknown" ]; then
111 + CONTAINER_OS_DETECTION="/etc/lsb-release"
112 + else
113 + CONTAINER_OS_DETECTION="Mixed"
114 + fi
115 + DISTRIB_ID="unknown"
116 + DISTRIB_RELEASE="unknown"
117 + DISTRIB_CODENAME="unknown"
118 + eval "$(grep -E "^(DISTRIB_ID|DISTRIB_RELEASE|DISTRIB_CODENAME)=" </etc/lsb-release)"
119 + if [ "${NAME}" = "unknown" ]; then CONTAINER_NAME="${DISTRIB_ID}"; fi
120 + if [ "${VERSION}" = "unknown" ]; then CONTAINER_VERSION="${DISTRIB_RELEASE}"; fi
121 + if [ "${ID}" = "unknown" ]; then CONTAINER_ID="${DISTRIB_CODENAME}"; fi
122 + fi
123 + if [ -n "$(command -v lsb_release 2>/dev/null)" ]; then
124 + if [ "${OS_DETECTION}" = "unknown" ]; then
125 + CONTAINER_OS_DETECTION="lsb_release"
126 + else
127 + CONTAINER_OS_DETECTION="Mixed"
128 + fi
129 + if [ "${NAME}" = "unknown" ]; then CONTAINER_NAME="$(lsb_release -is 2>/dev/null)"; fi
130 + if [ "${VERSION}" = "unknown" ]; then CONTAINER_VERSION="$(lsb_release -rs 2>/dev/null)"; fi
131 + if [ "${ID}" = "unknown" ]; then CONTAINER_ID="$(lsb_release -cs 2>/dev/null)"; fi
132 + fi
133 + fi
134 +fi
135
136 +# If Netdata is not running in a container then use the local detection as the host
137 +HOST_OS_DETECTION="unknown"
138 +HOST_NAME="unknown"
139 +HOST_VERSION="unknown"
140 +HOST_VERSION_ID="unknown"
141 +HOST_ID="unknown"
142 +HOST_ID_LIKE="unknown"
143 if [ "${CONTAINER}" = "unknown" ]; then
81 - if [ -f /proc/1/sched ] ; then
82 - IFS='(, ' read -r process _ </proc/1/sched
83 - if [ "${process}" = "netdata" ]; then
84 - CONTAINER="container"
85 - CONT_DETECTION="process"
86 - fi
87 - fi
88 - # ubuntu and debian supply /bin/running-in-container
89 - # https://www.apt-browse.org/browse/ubuntu/trusty/main/i386/upstart/1.12.1-0ubuntu4/file/bin/running-in-container
90 - if /bin/running-in-container >/dev/null 2>&1; then
91 - CONTAINER="container"
92 - CONT_DETECTION="/bin/running-in-container"
93 - fi
94 -
95 - # lxc sets environment variable 'container'
96 - #shellcheck disable=SC2154
97 - if [ -n "${container}" ]; then
98 - CONTAINER="lxc"
99 - CONT_DETECTION="containerenv"
100 - fi
101 -
102 - # docker creates /.dockerenv
103 - # http://stackoverflow.com/a/25518345
104 - if [ -f "/.dockerenv" ]; then
105 - CONTAINER="docker"
106 - CONT_DETECTION="dockerenv"
107 - fi
144 + for v in NAME ID ID_LIKE VERSION VERSION_ID OS_DETECTION; do
145 + eval "HOST_$v=\$CONTAINER_$v; CONTAINER_$v=none"
146 + done
147 +else
148 +# Otherwise try and use a user-supplied bind-mount into the container to resolve the host details
149 + if [ -e "/host/etc/os-release" ]; then
150 + OS_DETECTION="/etc/os-release"
151 + eval "$(grep -E "^(NAME|ID|ID_LIKE|VERSION|VERSION_ID)=" </host/etc/os-release | sed 's/^/HOST_/')"
152 + HOST_OS_DETECTION="/host/etc/os-release"
153 + fi
154 + if [ "${HOST_NAME}" = "unknown" ] || [ "${HOST_VERSION}" = "unknown" ] || [ "${HOST_ID}" = "unknown" ]; then
155 + if [ -f "/host/etc/lsb-release" ]; then
156 + if [ "${HOST_OS_DETECTION}" = "unknown" ]; then
157 + HOST_OS_DETECTION="/etc/lsb-release"
158 + else
159 + HOST_OS_DETECTION="Mixed"
160 + fi
161 + DISTRIB_ID="unknown"
162 + DISTRIB_RELEASE="unknown"
163 + DISTRIB_CODENAME="unknown"
164 + eval "$(grep -E "^(DISTRIB_ID|DISTRIB_RELEASE|DISTRIB_CODENAME)=" </etc/lsb-release)"
165 + if [ "${HOST_NAME}" = "unknown" ]; then HOST_NAME="${DISTRIB_ID}"; fi
166 + if [ "${HOST_VERSION}" = "unknown" ]; then HOST_VERSION="${DISTRIB_RELEASE}"; fi
167 + if [ "${HOST_ID}" = "unknown" ]; then HOST_ID="${DISTRIB_CODENAME}"; fi
168 + fi
169 + fi
170 fi
171
110 -echo "NETDATA_SYSTEM_OS_NAME=${NAME}"
111 -echo "NETDATA_SYSTEM_OS_ID=${ID}"
112 -echo "NETDATA_SYSTEM_OS_ID_LIKE=${ID_LIKE}"
113 -echo "NETDATA_SYSTEM_OS_VERSION=${VERSION}"
114 -echo "NETDATA_SYSTEM_OS_VERSION_ID=${VERSION_ID}"
115 -echo "NETDATA_SYSTEM_OS_DETECTION=${OS_DETECTION}"
172 +
173 +echo "NETDATA_CONTAINER_OS_NAME=${CONTAINER_NAME}"
174 +echo "NETDATA_CONTAINER_OS_ID=${CONTAINER_ID}"
175 +echo "NETDATA_CONTAINER_OS_ID_LIKE=${CONTAINER_ID_LIKE}"
176 +echo "NETDATA_CONTAINER_OS_VERSION=${CONTAINER_VERSION}"
177 +echo "NETDATA_CONTAINER_OS_VERSION_ID=${CONTAINER_VERSION_ID}"
178 +echo "NETDATA_CONTAINER_OS_DETECTION=${CONTAINER_OS_DETECTION}"
179 +echo "NETDATA_HOST_OS_NAME=${HOST_NAME}"
180 +echo "NETDATA_HOST_OS_ID=${HOST_ID}"
181 +echo "NETDATA_HOST_OS_ID_LIKE=${HOST_ID_LIKE}"
182 +echo "NETDATA_HOST_OS_VERSION=${HOST_VERSION}"
183 +echo "NETDATA_HOST_OS_VERSION_ID=${HOST_VERSION_ID}"
184 +echo "NETDATA_HOST_OS_DETECTION=${HOST_OS_DETECTION}"
185 echo "NETDATA_SYSTEM_KERNEL_NAME=${KERNEL_NAME}"
186 echo "NETDATA_SYSTEM_KERNEL_VERSION=${KERNEL_VERSION}"
187 echo "NETDATA_SYSTEM_ARCHITECTURE=${ARCHITECTURE}"
database/rrd.h
+12 -6
@@ -618,12 +618,18 @@ typedef struct alarm_log {
618 // RRD HOST
619
620 struct rrdhost_system_info {
621 - char *os_name;
622 - char *os_id;
623 - char *os_id_like;
624 - char *os_version;
625 - char *os_version_id;
626 - char *os_detection;
621 + char *host_os_name;
622 + char *host_os_id;
623 + char *host_os_id_like;
624 + char *host_os_version;
625 + char *host_os_version_id;
626 + char *host_os_detection;
627 + char *container_os_name;
628 + char *container_os_id;
629 + char *container_os_id_like;
630 + char *container_os_version;
631 + char *container_os_version_id;
632 + char *container_os_detection;
633 char *kernel_name;
634 char *kernel_version;
635 char *architecture;
database/rrdhost.c
+67 -29
@@ -563,12 +563,18 @@ void rrdhost_system_info_free(struct rrdhost_system_info *system_info) {
563 info("SYSTEM_INFO: free %p", system_info);
564
565 if(likely(system_info)) {
566 - freez(system_info->os_name);
567 - freez(system_info->os_id);
568 - freez(system_info->os_id_like);
569 - freez(system_info->os_version);
570 - freez(system_info->os_version_id);
571 - freez(system_info->os_detection);
566 + freez(system_info->host_os_name);
567 + freez(system_info->host_os_id);
568 + freez(system_info->host_os_id_like);
569 + freez(system_info->host_os_version);
570 + freez(system_info->host_os_version_id);
571 + freez(system_info->host_os_detection);
572 + freez(system_info->container_os_name);
573 + freez(system_info->container_os_id);
574 + freez(system_info->container_os_id_like);
575 + freez(system_info->container_os_version);
576 + freez(system_info->container_os_version_id);
577 + freez(system_info->container_os_detection);
578 freez(system_info->kernel_name);
579 freez(system_info->kernel_version);
580 freez(system_info->architecture);
@@ -762,13 +768,13 @@ struct label *load_auto_labels()
768 {
769 struct label *label_list = NULL;
770
765 - if (localhost->system_info->os_name)
771 + if (localhost->system_info->host_os_name)
772 label_list =
767 - add_label_to_list(label_list, "_os_name", localhost->system_info->os_name, LABEL_SOURCE_AUTO);
773 + add_label_to_list(label_list, "_os_name", localhost->system_info->host_os_name, LABEL_SOURCE_AUTO);
774
769 - if (localhost->system_info->os_version)
775 + if (localhost->system_info->host_os_version)
776 label_list =
771 - add_label_to_list(label_list, "_os_version", localhost->system_info->os_version, LABEL_SOURCE_AUTO);
777 + add_label_to_list(label_list, "_os_version", localhost->system_info->host_os_version, LABEL_SOURCE_AUTO);
778
779 if (localhost->system_info->kernel_version)
780 label_list =
@@ -782,9 +788,17 @@ struct label *load_auto_labels()
788 label_list =
789 add_label_to_list(label_list, "_virtualization", localhost->system_info->virtualization, LABEL_SOURCE_AUTO);
790
791 + if (localhost->system_info->container)
792 + label_list =
793 + add_label_to_list(label_list, "_container", localhost->system_info->container, LABEL_SOURCE_AUTO);
794 +
795 + if (localhost->system_info->container_detection)
796 + label_list =
797 + add_label_to_list(label_list, "_container_detection", localhost->system_info->container_detection, LABEL_SOURCE_AUTO);
798 +
799 if (localhost->system_info->virt_detection)
800 label_list =
787 - add_label_to_list(label_list, "_container", localhost->system_info->virt_detection, LABEL_SOURCE_AUTO);
801 + add_label_to_list(label_list, "_virt_detection", localhost->system_info->virt_detection, LABEL_SOURCE_AUTO);
802
803 label_list = add_label_to_list(
804 label_list, "_is_master", (localhost->next || configured_as_master()) ? "true" : "false", LABEL_SOURCE_AUTO);
@@ -1115,29 +1129,53 @@ restart_after_removal:
1129 int rrdhost_set_system_info_variable(struct rrdhost_system_info *system_info, char *name, char *value) {
1130 int res = 0;
1131
1118 - if(!strcmp(name, "NETDATA_SYSTEM_OS_NAME")){
1119 - freez(system_info->os_name);
1120 - system_info->os_name = strdupz(value);
1132 + if(!strcmp(name, "NETDATA_CONTAINER_OS_NAME")){
1133 + freez(system_info->container_os_name);
1134 + system_info->container_os_name = strdupz(value);
1135 + }
1136 + else if(!strcmp(name, "NETDATA_CONTAINER_OS_ID")){
1137 + freez(system_info->container_os_id);
1138 + system_info->container_os_id = strdupz(value);
1139 + }
1140 + else if(!strcmp(name, "NETDATA_CONTAINER_OS_ID_LIKE")){
1141 + freez(system_info->container_os_id_like);
1142 + system_info->container_os_id_like = strdupz(value);
1143 + }
1144 + else if(!strcmp(name, "NETDATA_CONTAINER_OS_VERSION")){
1145 + freez(system_info->container_os_version);
1146 + system_info->container_os_version = strdupz(value);
1147 + }
1148 + else if(!strcmp(name, "NETDATA_CONTAINER_OS_VERSION_ID")){
1149 + freez(system_info->container_os_version_id);
1150 + system_info->container_os_version_id = strdupz(value);
1151 + }
1152 + else if(!strcmp(name, "NETDATA_CONTAINER_OS_DETECTION")){
1153 + freez(system_info->host_os_detection);
1154 + system_info->host_os_detection = strdupz(value);
1155 + }
1156 + else if(!strcmp(name, "NETDATA_HOST_OS_NAME")){
1157 + freez(system_info->host_os_name);
1158 + system_info->host_os_name = strdupz(value);
1159 }
1122 - else if(!strcmp(name, "NETDATA_SYSTEM_OS_ID")){
1123 - freez(system_info->os_id);
1124 - system_info->os_id = strdupz(value);
1160 + else if(!strcmp(name, "NETDATA_HOST_OS_ID")){
1161 + freez(system_info->host_os_id);
1162 + system_info->host_os_id = strdupz(value);
1163 }
1126 - else if(!strcmp(name, "NETDATA_SYSTEM_OS_ID_LIKE")){
1127 - freez(system_info->os_id_like);
1128 - system_info->os_id_like = strdupz(value);
1164 + else if(!strcmp(name, "NETDATA_HOST_OS_ID_LIKE")){
1165 + freez(system_info->host_os_id_like);
1166 + system_info->host_os_id_like = strdupz(value);
1167 }
1130 - else if(!strcmp(name, "NETDATA_SYSTEM_OS_VERSION")){
1131 - freez(system_info->os_version);
1132 - system_info->os_version = strdupz(value);
1168 + else if(!strcmp(name, "NETDATA_HOST_OS_VERSION")){
1169 + freez(system_info->host_os_version);
1170 + system_info->host_os_version = strdupz(value);
1171 }
1134 - else if(!strcmp(name, "NETDATA_SYSTEM_OS_VERSION_ID")){
1135 - freez(system_info->os_version_id);
1136 - system_info->os_version_id = strdupz(value);
1172 + else if(!strcmp(name, "NETDATA_HOST_OS_VERSION_ID")){
1173 + freez(system_info->host_os_version_id);
1174 + system_info->host_os_version_id = strdupz(value);
1175 }
1138 - else if(!strcmp(name, "NETDATA_SYSTEM_OS_DETECTION")){
1139 - freez(system_info->os_detection);
1140 - system_info->os_detection = strdupz(value);
1176 + else if(!strcmp(name, "NETDATA_HOST_OS_DETECTION")){
1177 + freez(system_info->host_os_detection);
1178 + system_info->host_os_detection = strdupz(value);
1179 }
1180 else if(!strcmp(name, "NETDATA_SYSTEM_KERNEL_NAME")){
1181 freez(system_info->kernel_name);
packaging/docker/README.md
+21 -2
@@ -35,6 +35,7 @@ docker run -d --name=netdata \
35 -v /etc/group:/host/etc/group:ro \
36 -v /proc:/host/proc:ro \
37 -v /sys:/host/sys:ro \
38 + -v /etc/os-release:/host/etc/os-release:ro \
39 --cap-add SYS_PTRACE \
40 --security-opt apparmor=unconfined \
41 netdata/netdata
@@ -61,8 +62,26 @@ services:
62 - /sys:/host/sys:ro
63 ```
64
64 -If you don't want to use the apps.plugin functionality, you can remove the mounts of `/etc/passwd` and `/etc/group`
65 -(they are used to get proper user and group names for the monitored host) to get slightly better security.
65 +Some of the bind-mounts are optional depending on how you use Netdata:
66 +
67 +* If you don't want to use the apps.plugin functionality, you can remove the mounts of `/etc/passwd` and `/etc/group`
68 + (they are used to get proper user and group names for the monitored host) to get slightly better security.
69 +
70 +* Most modern linux distos supply `/etc/os-release` although some older distros only supply `/etc/lsb-release`. If
71 + this is the case you can change the line above that mounts the file inside the container to
72 + `-v /etc/lsb-release:/host/etc/lsb-release:ro`.
73 +
74 +* If your host is virtualized then Netdata cannot detect it from inside the container and will output the wrong
75 + metadata (e.g. on `/api/v1/info` queries). You can fix this by setting a variable that overrides the detection
76 + using, e.g. `--env VIRTUALIZATION=$(systemd-detect-virt -v)`. If you are using a `docker-compose.yml` then add:
77 +```
78 + environment:
79 + - VIRTUALIZATION=${VIRTUALIZATION}
80 +```
81 +This allows the information to be passed into `docker-compose` using:
82 +```
83 +VIRTUALIZATION=$(systemd-detect-virt -v) docker-compose up
84 +```
85
86 Starting with v1.12, Netdata collects anonymous usage information by default and sends it to Google Analytics. Read
87 about the information collected, and learn how to-opt, on our [anonymous statistics](../../docs/anonymous-statistics.md)
streaming/rrdpush.c
+24 -7
@@ -552,6 +552,9 @@ static int rrdpush_sender_thread_connect_to_master(RRDHOST *host, int default_po
552 }
553 #endif
554
555 + /* TODO: During the implementation of #7265 switch the set of variables to HOST_* and CONTAINER_* if the
556 + version negotiation resulted in a high enough version.
557 + */
558 #define HTTP_HEADER_SIZE 8192
559 char http[HTTP_HEADER_SIZE + 1];
560 int eol = snprintfz(http, HTTP_HEADER_SIZE,
@@ -581,12 +584,12 @@ static int rrdpush_sender_thread_connect_to_master(RRDHOST *host, int default_po
584 , host->os
585 , host->timezone
586 , (host->tags) ? host->tags : ""
584 - , (host->system_info->os_name) ? host->system_info->os_name : ""
585 - , (host->system_info->os_id) ? host->system_info->os_id : ""
586 - , (host->system_info->os_id_like) ? host->system_info->os_id_like : ""
587 - , (host->system_info->os_version) ? host->system_info->os_version : ""
588 - , (host->system_info->os_version_id) ? host->system_info->os_version_id : ""
589 - , (host->system_info->os_detection) ? host->system_info->os_detection : ""
587 + , (host->system_info->host_os_name) ? host->system_info->host_os_name : ""
588 + , (host->system_info->host_os_id) ? host->system_info->host_os_id : ""
589 + , (host->system_info->host_os_id_like) ? host->system_info->host_os_id_like : ""
590 + , (host->system_info->host_os_version) ? host->system_info->host_os_version : ""
591 + , (host->system_info->host_os_version_id) ? host->system_info->host_os_version_id : ""
592 + , (host->system_info->host_os_detection) ? host->system_info->host_os_detection : ""
593 , (host->system_info->kernel_name) ? host->system_info->kernel_name : ""
594 , (host->system_info->kernel_version) ? host->system_info->kernel_version : ""
595 , (host->system_info->architecture) ? host->system_info->architecture : ""
@@ -1394,11 +1397,25 @@ int rrdpush_receiver_thread_spawn(RRDHOST *host, struct web_client *w, char *url
1397 else {
1398 if(!strcmp(name, "NETDATA_PROTOCOL_VERSION"))
1399 stream_flags = LABEL_FLAG_UPDATE_STREAM;
1397 - else
1400 + else {
1401 + // An old Netdata slave does not have a compatible streaming protocol, map to something sane.
1402 + if (!strcmp(name, "NETDATA_SYSTEM_OS_NAME"))
1403 + name = "NETDATA_HOST_OS_NAME";
1404 + else if (!strcmp(name, "NETDATA_SYSTEM_OS_ID"))
1405 + name = "NETDATA_HOST_OS_ID";
1406 + else if (!strcmp(name, "NETDATA_SYSTEM_OS_ID_LIKE"))
1407 + name = "NETDATA_HOST_OS_ID_LIKE";
1408 + else if (!strcmp(name, "NETDATA_SYSTEM_OS_VERSION"))
1409 + name = "NETDATA_HOST_OS_VERSION";
1410 + else if (!strcmp(name, "NETDATA_SYSTEM_OS_VERSION_ID"))
1411 + name = "NETDATA_HOST_OS_VERSION_ID";
1412 + else if (!strcmp(name, "NETDATA_SYSTEM_OS_DETECTION"))
1413 + name = "NETDATA_HOST_OS_DETECTION";
1414 if (unlikely(rrdhost_set_system_info_variable(system_info, name, value))) {
1415 info("STREAM [receive from [%s]:%s]: request has parameter '%s' = '%s', which is not used.",
1416 w->client_ip, w->client_port, key, value);
1417 }
1418 + }
1419 }
1420 }
1421
web/api/web_api_v1.c
+20 -6
@@ -808,12 +808,26 @@ inline int web_client_api_request_v1_info(RRDHOST *host, struct web_client *w, c
808 web_client_api_request_v1_info_summary_alarm_statuses(host, wb);
809 buffer_strcat(wb, "\t},\n");
810
811 - buffer_sprintf(wb, "\t\"os_name\": \"%s\",\n", (host->system_info->os_name) ? host->system_info->os_name : "\"\"");
812 - buffer_sprintf(wb, "\t\"os_id\": \"%s\",\n", (host->system_info->os_id) ? host->system_info->os_id : "");
813 - buffer_sprintf(wb, "\t\"os_id_like\": \"%s\",\n", (host->system_info->os_id_like) ? host->system_info->os_id_like : "");
814 - buffer_sprintf(wb, "\t\"os_version\": \"%s\",\n", (host->system_info->os_version) ? host->system_info->os_version : "");
815 - buffer_sprintf(wb, "\t\"os_version_id\": \"%s\",\n", (host->system_info->os_version_id) ? host->system_info->os_version_id : "");
816 - buffer_sprintf(wb, "\t\"os_detection\": \"%s\",\n", (host->system_info->os_detection) ? host->system_info->os_detection : "");
811 + buffer_sprintf(wb, "\t\"os_name\": \"%s\",\n", (host->system_info->host_os_name) ? host->system_info->host_os_name : "");
812 + buffer_sprintf(wb, "\t\"os_id\": \"%s\",\n", (host->system_info->host_os_id) ? host->system_info->host_os_id : "");
813 + buffer_sprintf(wb, "\t\"os_id_like\": \"%s\",\n", (host->system_info->host_os_id_like) ? host->system_info->host_os_id_like : "");
814 + buffer_sprintf(wb, "\t\"os_version\": \"%s\",\n", (host->system_info->host_os_version) ? host->system_info->host_os_version : "");
815 + buffer_sprintf(wb, "\t\"os_version_id\": \"%s\",\n", (host->system_info->host_os_version_id) ? host->system_info->host_os_version_id : "");
816 + buffer_sprintf(wb, "\t\"os_detection\": \"%s\",\n", (host->system_info->host_os_detection) ? host->system_info->host_os_detection : "");
817 +
818 + if (host->system_info->container_os_name)
819 + buffer_sprintf(wb, "\t\"container_os_name\": \"%s\",\n", host->system_info->container_os_name);
820 + if (host->system_info->container_os_id)
821 + buffer_sprintf(wb, "\t\"container_os_id\": \"%s\",\n", host->system_info->container_os_id);
822 + if (host->system_info->container_os_id_like)
823 + buffer_sprintf(wb, "\t\"container_os_id_like\": \"%s\",\n", host->system_info->container_os_id_like);
824 + if (host->system_info->container_os_version)
825 + buffer_sprintf(wb, "\t\"container_os_version\": \"%s\",\n", host->system_info->container_os_version);
826 + if (host->system_info->container_os_version_id)
827 + buffer_sprintf(wb, "\t\"container_os_version_id\": \"%s\",\n", host->system_info->container_os_version_id);
828 + if (host->system_info->container_os_detection)
829 + buffer_sprintf(wb, "\t\"container_os_detection\": \"%s\",\n", host->system_info->container_os_detection);
830 +
831 buffer_sprintf(wb, "\t\"kernel_name\": \"%s\",\n", (host->system_info->kernel_name) ? host->system_info->kernel_name : "");
832 buffer_sprintf(wb, "\t\"kernel_version\": \"%s\",\n", (host->system_info->kernel_version) ? host->system_info->kernel_version : "");
833 buffer_sprintf(wb, "\t\"architecture\": \"%s\",\n", (host->system_info->architecture) ? host->system_info->architecture : "");