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 : "");