diff options
-rwxr-xr-x | daemon/anonymous-statistics.sh.in | 2 | ||||
-rwxr-xr-x | daemon/system-info.sh | 525 | ||||
-rw-r--r-- | database/rrd.h | 1 | ||||
-rw-r--r-- | database/rrdhost.c | 9 | ||||
-rw-r--r-- | docs/guides/using-host-labels.md | 2 | ||||
-rw-r--r-- | streaming/sender.c | 2 | ||||
-rw-r--r-- | web/api/netdata-swagger.json | 7 | ||||
-rw-r--r-- | web/api/netdata-swagger.yaml | 6 | ||||
-rw-r--r-- | web/api/web_api_v1.c | 2 |
9 files changed, 297 insertions, 259 deletions
diff --git a/daemon/anonymous-statistics.sh.in b/daemon/anonymous-statistics.sh.in index 41b1c886c7..f0d9c10efe 100755 --- a/daemon/anonymous-statistics.sh.in +++ b/daemon/anonymous-statistics.sh.in @@ -63,6 +63,7 @@ if [ -n "$(command -v curl 2> /dev/null)" ]; then --data-urlencode "cd17=${NETDATA_CONTAINER_OS_VERSION}" \ --data-urlencode "cd18=${NETDATA_CONTAINER_OS_VERSION_ID}" \ --data-urlencode "cd19=${NETDATA_CONTAINER_OS_DETECTION}" \ + --data-urlencode "cd20=${NETDATA_HOST_IS_K8S_NODE}" \ "https://www.google-analytics.com/collect" > /dev/null 2>&1 else wget -q -O - --timeout=1 "https://www.google-analytics.com/collect?\ @@ -98,5 +99,6 @@ else &cd17=${NETDATA_CONTAINER_OS_VERSION} \ &cd18=${NETDATA_CONTAINER_OS_VERSION_ID} \ &cd19=${NETDATA_CONTAINER_OS_DETECTION} \ +&cd20=${NETDATA_HOST_IS_K8S_NODE} \ " > /dev/null 2>&1 fi diff --git a/daemon/system-info.sh b/daemon/system-info.sh index 9ccb55d8fd..373680e7b2 100755 --- a/daemon/system-info.sh +++ b/daemon/system-info.sh @@ -11,32 +11,32 @@ ARCHITECTURE="$(uname -m)" # detect the virtualization if [ -z "${VIRTUALIZATION}" ]; then - VIRTUALIZATION="unknown" - VIRT_DETECTION="none" - - if [ -n "$(command -v systemd-detect-virt 2>/dev/null)" ]; then - VIRTUALIZATION="$(systemd-detect-virt -v)" - VIRT_DETECTION="systemd-detect-virt" - CONTAINER="$(systemd-detect-virt -c)" - CONT_DETECTION="systemd-detect-virt" + VIRTUALIZATION="unknown" + VIRT_DETECTION="none" + + if [ -n "$(command -v systemd-detect-virt 2> /dev/null)" ]; then + VIRTUALIZATION="$(systemd-detect-virt -v)" + VIRT_DETECTION="systemd-detect-virt" + CONTAINER="$(systemd-detect-virt -c)" + CONT_DETECTION="systemd-detect-virt" + else + if grep -q "^flags.*hypervisor" /proc/cpuinfo 2> /dev/null; then + VIRTUALIZATION="hypervisor" + VIRT_DETECTION="/proc/cpuinfo" + elif [ -n "$(command -v dmidecode)" ] && dmidecode -s system-product-name 2> /dev/null | grep -q "VMware\|Virtual\|KVM\|Bochs"; then + VIRTUALIZATION="$(dmidecode -s system-product-name)" + VIRT_DETECTION="dmidecode" else - if grep -q "^flags.*hypervisor" /proc/cpuinfo 2>/dev/null; then - VIRTUALIZATION="hypervisor" - VIRT_DETECTION="/proc/cpuinfo" - elif [ -n "$(command -v dmidecode)" ] && dmidecode -s system-product-name 2>/dev/null | grep -q "VMware\|Virtual\|KVM\|Bochs"; then - VIRTUALIZATION="$(dmidecode -s system-product-name)" - VIRT_DETECTION="dmidecode" - else - VIRTUALIZATION="none" - fi - fi - if [ -z "${VIRTUALIZATION}" ]; then - # Output from the command is outside of spec - VIRTUALIZATION="unknown" + VIRTUALIZATION="none" fi + fi + if [ -z "${VIRTUALIZATION}" ]; then + # Output from the command is outside of spec + VIRTUALIZATION="unknown" + fi else - # Passed from outside - probably in docker run - VIRT_DETECTION="provided" + # Passed from outside - probably in docker run + VIRT_DETECTION="provided" fi # ------------------------------------------------------------------------------------------------- @@ -46,33 +46,33 @@ CONTAINER="unknown" CONT_DETECTION="none" if [ "${CONTAINER}" = "unknown" ]; then - if [ -f /proc/1/sched ] ; then - IFS='(, ' read -r process _ </proc/1/sched - if [ "${process}" = "netdata" ]; then - CONTAINER="container" - CONT_DETECTION="process" - fi - fi - # ubuntu and debian supply /bin/running-in-container - # https://www.apt-browse.org/browse/ubuntu/trusty/main/i386/upstart/1.12.1-0ubuntu4/file/bin/running-in-container - if /bin/running-in-container >/dev/null 2>&1; then - CONTAINER="container" - CONT_DETECTION="/bin/running-in-container" - fi - - # lxc sets environment variable 'container' - #shellcheck disable=SC2154 - if [ -n "${container}" ]; then - CONTAINER="lxc" - CONT_DETECTION="containerenv" - fi - - # docker creates /.dockerenv - # http://stackoverflow.com/a/25518345 - if [ -f "/.dockerenv" ]; then - CONTAINER="docker" - CONT_DETECTION="dockerenv" - fi + if [ -f /proc/1/sched ]; then + IFS='(, ' read -r process _ < /proc/1/sched + if [ "${process}" = "netdata" ]; then + CONTAINER="container" + CONT_DETECTION="process" + fi + fi + # ubuntu and debian supply /bin/running-in-container + # https://www.apt-browse.org/browse/ubuntu/trusty/main/i386/upstart/1.12.1-0ubuntu4/file/bin/running-in-container + if /bin/running-in-container > /dev/null 2>&1; then + CONTAINER="container" + CONT_DETECTION="/bin/running-in-container" + fi + + # lxc sets environment variable 'container' + #shellcheck disable=SC2154 + if [ -n "${container}" ]; then + CONTAINER="lxc" + CONT_DETECTION="containerenv" + fi + + # docker creates /.dockerenv + # http://stackoverflow.com/a/25518345 + if [ -f "/.dockerenv" ]; then + CONTAINER="docker" + CONT_DETECTION="dockerenv" + fi fi @@ -89,51 +89,51 @@ CONTAINER_ID="unknown" CONTAINER_ID_LIKE="unknown" if [ "${KERNEL_NAME}" = "Darwin" ]; then - CONTAINER_ID=$(sw_vers -productName) - CONTAINER_ID_LIKE="mac" - CONTAINER_NAME="mac" - CONTAINER_VERSION=$(sw_vers -productVersion) - CONTAINER_OS_DETECTION="sw_vers" + CONTAINER_ID=$(sw_vers -productName) + CONTAINER_ID_LIKE="mac" + CONTAINER_NAME="mac" + CONTAINER_VERSION=$(sw_vers -productVersion) + CONTAINER_OS_DETECTION="sw_vers" elif [ "${KERNEL_NAME}" = "FreeBSD" ]; then - CONTAINER_ID="FreeBSD" - CONTAINER_ID_LIKE="FreeBSD" - CONTAINER_NAME="FreeBSD" - CONTAINER_OS_DETECTION="uname" - CONTAINER_VERSION=$(uname -r) - KERNEL_VERSION=$(uname -K) + CONTAINER_ID="FreeBSD" + CONTAINER_ID_LIKE="FreeBSD" + CONTAINER_NAME="FreeBSD" + CONTAINER_OS_DETECTION="uname" + CONTAINER_VERSION=$(uname -r) + KERNEL_VERSION=$(uname -K) else - if [ -f "/etc/os-release" ]; then - eval "$(grep -E "^(NAME|ID|ID_LIKE|VERSION|VERSION_ID)=" </etc/os-release | sed 's/^/CONTAINER_/')" - CONTAINER_OS_DETECTION="/etc/os-release" - fi - - # shellcheck disable=SC2153 - if [ "${NAME}" = "unknown" ] || [ "${VERSION}" = "unknown" ] || [ "${ID}" = "unknown" ]; then - if [ -f "/etc/lsb-release" ]; then - if [ "${OS_DETECTION}" = "unknown" ]; then - CONTAINER_OS_DETECTION="/etc/lsb-release" - else - CONTAINER_OS_DETECTION="Mixed" - fi - DISTRIB_ID="unknown" - DISTRIB_RELEASE="unknown" - DISTRIB_CODENAME="unknown" - eval "$(grep -E "^(DISTRIB_ID|DISTRIB_RELEASE|DISTRIB_CODENAME)=" </etc/lsb-release)" - if [ "${NAME}" = "unknown" ]; then CONTAINER_NAME="${DISTRIB_ID}"; fi - if [ "${VERSION}" = "unknown" ]; then CONTAINER_VERSION="${DISTRIB_RELEASE}"; fi - if [ "${ID}" = "unknown" ]; then CONTAINER_ID="${DISTRIB_CODENAME}"; fi - fi - if [ -n "$(command -v lsb_release 2>/dev/null)" ]; then - if [ "${OS_DETECTION}" = "unknown" ]; then - CONTAINER_OS_DETECTION="lsb_release" - else - CONTAINER_OS_DETECTION="Mixed" - fi - if [ "${NAME}" = "unknown" ]; then CONTAINER_NAME="$(lsb_release -is 2>/dev/null)"; fi - if [ "${VERSION}" = "unknown" ]; then CONTAINER_VERSION="$(lsb_release -rs 2>/dev/null)"; fi - if [ "${ID}" = "unknown" ]; then CONTAINER_ID="$(lsb_release -cs 2>/dev/null)"; fi - fi - fi + if [ -f "/etc/os-release" ]; then + eval "$(grep -E "^(NAME|ID|ID_LIKE|VERSION|VERSION_ID)=" < /etc/os-release | sed 's/^/CONTAINER_/')" + CONTAINER_OS_DETECTION="/etc/os-release" + fi + + # shellcheck disable=SC2153 + if [ "${NAME}" = "unknown" ] || [ "${VERSION}" = "unknown" ] || [ "${ID}" = "unknown" ]; then + if [ -f "/etc/lsb-release" ]; then + if [ "${OS_DETECTION}" = "unknown" ]; then + CONTAINER_OS_DETECTION="/etc/lsb-release" + else + CONTAINER_OS_DETECTION="Mixed" + fi + DISTRIB_ID="unknown" + DISTRIB_RELEASE="unknown" + DISTRIB_CODENAME="unknown" + eval "$(grep -E "^(DISTRIB_ID|DISTRIB_RELEASE|DISTRIB_CODENAME)=" < /etc/lsb-release)" + if [ "${NAME}" = "unknown" ]; then CONTAINER_NAME="${DISTRIB_ID}"; fi + if [ "${VERSION}" = "unknown" ]; then CONTAINER_VERSION="${DISTRIB_RELEASE}"; fi + if [ "${ID}" = "unknown" ]; then CONTAINER_ID="${DISTRIB_CODENAME}"; fi + fi + if [ -n "$(command -v lsb_release 2> /dev/null)" ]; then + if [ "${OS_DETECTION}" = "unknown" ]; then + CONTAINER_OS_DETECTION="lsb_release" + else + CONTAINER_OS_DETECTION="Mixed" + fi + if [ "${NAME}" = "unknown" ]; then CONTAINER_NAME="$(lsb_release -is 2> /dev/null)"; fi + if [ "${VERSION}" = "unknown" ]; then CONTAINER_VERSION="$(lsb_release -rs 2> /dev/null)"; fi + if [ "${ID}" = "unknown" ]; then CONTAINER_ID="$(lsb_release -cs 2> /dev/null)"; fi + fi + fi fi # If Netdata is not running in a container then use the local detection as the host @@ -144,32 +144,32 @@ HOST_VERSION_ID="unknown" HOST_ID="unknown" HOST_ID_LIKE="unknown" if [ "${CONTAINER}" = "unknown" ]; then - for v in NAME ID ID_LIKE VERSION VERSION_ID OS_DETECTION; do - eval "HOST_$v=\$CONTAINER_$v; CONTAINER_$v=none" - done + for v in NAME ID ID_LIKE VERSION VERSION_ID OS_DETECTION; do + eval "HOST_$v=\$CONTAINER_$v; CONTAINER_$v=none" + done else -# Otherwise try and use a user-supplied bind-mount into the container to resolve the host details - if [ -e "/host/etc/os-release" ]; then - OS_DETECTION="/etc/os-release" - eval "$(grep -E "^(NAME|ID|ID_LIKE|VERSION|VERSION_ID)=" </host/etc/os-release | sed 's/^/HOST_/')" - HOST_OS_DETECTION="/host/etc/os-release" - fi - if [ "${HOST_NAME}" = "unknown" ] || [ "${HOST_VERSION}" = "unknown" ] || [ "${HOST_ID}" = "unknown" ]; then - if [ -f "/host/etc/lsb-release" ]; then - if [ "${HOST_OS_DETECTION}" = "unknown" ]; then - HOST_OS_DETECTION="/etc/lsb-release" - else - HOST_OS_DETECTION="Mixed" - fi - DISTRIB_ID="unknown" - DISTRIB_RELEASE="unknown" - DISTRIB_CODENAME="unknown" - eval "$(grep -E "^(DISTRIB_ID|DISTRIB_RELEASE|DISTRIB_CODENAME)=" </etc/lsb-release)" - if [ "${HOST_NAME}" = "unknown" ]; then HOST_NAME="${DISTRIB_ID}"; fi - if [ "${HOST_VERSION}" = "unknown" ]; then HOST_VERSION="${DISTRIB_RELEASE}"; fi - if [ "${HOST_ID}" = "unknown" ]; then HOST_ID="${DISTRIB_CODENAME}"; fi - fi - fi + # Otherwise try and use a user-supplied bind-mount into the container to resolve the host details + if [ -e "/host/etc/os-release" ]; then + OS_DETECTION="/etc/os-release" + eval "$(grep -E "^(NAME|ID|ID_LIKE|VERSION|VERSION_ID)=" < /host/etc/os-release | sed 's/^/HOST_/')" + HOST_OS_DETECTION="/host/etc/os-release" + fi + if [ "${HOST_NAME}" = "unknown" ] || [ "${HOST_VERSION}" = "unknown" ] || [ "${HOST_ID}" = "unknown" ]; then + if [ -f "/host/etc/lsb-release" ]; then + if [ "${HOST_OS_DETECTION}" = "unknown" ]; then + HOST_OS_DETECTION="/etc/lsb-release" + else + HOST_OS_DETECTION="Mixed" + fi + DISTRIB_ID="unknown" + DISTRIB_RELEASE="unknown" + DISTRIB_CODENAME="unknown" + eval "$(grep -E "^(DISTRIB_ID|DISTRIB_RELEASE|DISTRIB_CODENAME)=" < /etc/lsb-release)" + if [ "${HOST_NAME}" = "unknown" ]; then HOST_NAME="${DISTRIB_ID}"; fi + if [ "${HOST_VERSION}" = "unknown" ]; then HOST_VERSION="${DISTRIB_RELEASE}"; fi + if [ "${HOST_ID}" = "unknown" ]; then HOST_ID="${DISTRIB_CODENAME}"; fi + fi + fi fi # ------------------------------------------------------------------------------------------------- @@ -188,93 +188,93 @@ lscpu_output="" dmidecode="$(command -v dmidecode)" dmidecode_output="" -if [ -n "${lscpu}" ] && lscpu >/dev/null 2>&1 ; then - lscpu_output="$(LC_NUMERIC=C ${lscpu} 2>/dev/null)" - CPU_INFO_SOURCE="lscpu" - LCPU_COUNT="$(echo "${lscpu_output}" | grep "^CPU(s):" | cut -f 2 -d ':' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')" - CPU_VENDOR="$(echo "${lscpu_output}" | grep "^Vendor ID:" | cut -f 2 -d ':' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')" - CPU_MODEL="$(echo "${lscpu_output}" | grep "^Model name:" | cut -f 2 -d ':' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')" - possible_cpu_freq="$(echo "${lscpu_output}" | grep -F "CPU max MHz:" | cut -f 2 -d ':' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' | grep -o '^[0-9]*') MHz" - if [ "${possible_cpu_freq}" = " MHz" ] ; then - possible_cpu_freq="$(echo "${lscpu_output}" | grep -F "CPU MHz:" | cut -f 2 -d ':' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' | grep -o '^[0-9]*') MHz" - fi -elif [ -n "${dmidecode}" ] && dmidecode -t processor >/dev/null 2>&1 ; then - dmidecode_output="$(${dmidecode} -t processor 2>/dev/null)" - CPU_INFO_SOURCE="dmidecode" - LCPU_COUNT="$(echo "${dmidecode_output}" | grep -F "Thread Count:" | cut -f 2 -d ':' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')" - CPU_VENDOR="$(echo "${dmidecode_output}" | grep -F "Manufacturer:" | cut -f 2 -d ':' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')" - CPU_MODEL="$(echo "${dmidecode_output}" | grep -F "Version:" | cut -f 2 -d ':' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')" - possible_cpu_freq="$(echo "${dmidecode_output}" | grep -F "Current Speed:" | cut -f 2 -d ':' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')" +if [ -n "${lscpu}" ] && lscpu > /dev/null 2>&1; then + lscpu_output="$(LC_NUMERIC=C ${lscpu} 2> /dev/null)" + CPU_INFO_SOURCE="lscpu" + LCPU_COUNT="$(echo "${lscpu_output}" | grep "^CPU(s):" | cut -f 2 -d ':' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')" + CPU_VENDOR="$(echo "${lscpu_output}" | grep "^Vendor ID:" | cut -f 2 -d ':' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')" + CPU_MODEL="$(echo "${lscpu_output}" | grep "^Model name:" | cut -f 2 -d ':' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')" + possible_cpu_freq="$(echo "${lscpu_output}" | grep -F "CPU max MHz:" | cut -f 2 -d ':' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' | grep -o '^[0-9]*') MHz" + if [ "${possible_cpu_freq}" = " MHz" ]; then + possible_cpu_freq="$(echo "${lscpu_output}" | grep -F "CPU MHz:" | cut -f 2 -d ':' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' | grep -o '^[0-9]*') MHz" + fi +elif [ -n "${dmidecode}" ] && dmidecode -t processor > /dev/null 2>&1; then + dmidecode_output="$(${dmidecode} -t processor 2> /dev/null)" + CPU_INFO_SOURCE="dmidecode" + LCPU_COUNT="$(echo "${dmidecode_output}" | grep -F "Thread Count:" | cut -f 2 -d ':' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')" + CPU_VENDOR="$(echo "${dmidecode_output}" | grep -F "Manufacturer:" | cut -f 2 -d ':' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')" + CPU_MODEL="$(echo "${dmidecode_output}" | grep -F "Version:" | cut -f 2 -d ':' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')" + possible_cpu_freq="$(echo "${dmidecode_output}" | grep -F "Current Speed:" | cut -f 2 -d ':' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')" else - if [ -n "${nproc}" ] ; then - CPU_INFO_SOURCE="nproc" - LCPU_COUNT="$(${nproc})" - elif [ "${KERNEL_NAME}" = FreeBSD ] ; then - CPU_INFO_SOURCE="sysctl" - LCPU_COUNT="$(sysctl -n kern.smp.cpus)" - elif [ -d /sys/devices/system/cpu ] ; then - CPU_INFO_SOURCE="sysfs" - # This is potentially more accurate than checking `/proc/cpuinfo`. - LCPU_COUNT="$(find /sys/devices/system/cpu -mindepth 1 -maxdepth 1 -type d -name 'cpu*' | grep -cEv 'idle|freq')" - elif [ -r /proc/cpuinfo ] ; then - CPU_INFO_SOURCE="procfs" - LCPU_COUNT="$(grep -c ^processor /proc/cpuinfo)" - fi - - # If we have GNU uname, we can use that to get CPU info (probably). - if unmae --version 2>/dev/null | grep -qF 'GNU coreutils' ; then - CPU_INFO_SOURCE="${CPU_INFO_SOURCE} uname" - CPU_MODEL="$(uname -p)" - CPU_VENDOR="$(uname -i)" - elif [ "${KERNEL_NAME}" = FreeBSD ] ; then - if ( echo "${CPU_INFO_SOURCE}" | grep -qv sysctl ) ; then - CPU_INFO_SOURCE="${CPU_INFO_SOURCE} sysctl" - fi - - CPU_MODEL="$(sysctl -n hw.model)" - elif [ -r /proc/cpuinfo ] ; then - if ( echo "${CPU_INFO_SOURCE}" | grep -qv procfs ) ; then - CPU_INFO_SOURCE="${CPU_INFO_SOURCE} procfs" - fi - - CPU_MODEL="$(grep -F "model name" /proc/cpuinfo | head -n 1 | cut -f 2 -d ':' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')" - CPU_VENDOR="$(grep -F "vendor_id" /proc/cpuinfo | head -n 1 | cut -f 2 -d ':' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')" - fi -fi - -if [ -r /sys/devices/system/cpu/cpu0/cpufreq/base_frequency ] ; then - if ( echo "${CPU_INFO_SOURCE}" | grep -qv sysfs ) ; then - CPU_INFO_SOURCE="${CPU_INFO_SOURCE} sysfs" + if [ -n "${nproc}" ]; then + CPU_INFO_SOURCE="nproc" + LCPU_COUNT="$(${nproc})" + elif [ "${KERNEL_NAME}" = FreeBSD ]; then + CPU_INFO_SOURCE="sysctl" + LCPU_COUNT="$(sysctl -n kern.smp.cpus)" + elif [ -d /sys/devices/system/cpu ]; then + CPU_INFO_SOURCE="sysfs" + # This is potentially more accurate than checking `/proc/cpuinfo`. + LCPU_COUNT="$(find /sys/devices/system/cpu -mindepth 1 -maxdepth 1 -type d -name 'cpu*' | grep -cEv 'idle|freq')" + elif [ -r /proc/cpuinfo ]; then + CPU_INFO_SOURCE="procfs" + LCPU_COUNT="$(grep -c ^processor /proc/cpuinfo)" + fi + + # If we have GNU uname, we can use that to get CPU info (probably). + if uname --version 2> /dev/null | grep -qF 'GNU coreutils'; then + CPU_INFO_SOURCE="${CPU_INFO_SOURCE} uname" + CPU_MODEL="$(uname -p)" + CPU_VENDOR="$(uname -i)" + elif [ "${KERNEL_NAME}" = FreeBSD ]; then + if (echo "${CPU_INFO_SOURCE}" | grep -qv sysctl); then + CPU_INFO_SOURCE="${CPU_INFO_SOURCE} sysctl" fi - CPU_FREQ="$(cat /sys/devices/system/cpu/cpu0/cpufreq/base_frequency)" -elif [ -n "${possible_cpu_freq}" ] ; then - CPU_FREQ="${possible_cpu_freq}" -elif [ -r /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq ] ; then - if ( echo "${CPU_INFO_SOURCE}" | grep -qv sysfs ) ; then - CPU_INFO_SOURCE="${CPU_INFO_SOURCE} sysfs" + CPU_MODEL="$(sysctl -n hw.model)" + elif [ -r /proc/cpuinfo ]; then + if (echo "${CPU_INFO_SOURCE}" | grep -qv procfs); then + CPU_INFO_SOURCE="${CPU_INFO_SOURCE} procfs" fi - CPU_FREQ="$(cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq)" + CPU_MODEL="$(grep -F "model name" /proc/cpuinfo | head -n 1 | cut -f 2 -d ':' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')" + CPU_VENDOR="$(grep -F "vendor_id" /proc/cpuinfo | head -n 1 | cut -f 2 -d ':' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')" + fi +fi + +if [ -r /sys/devices/system/cpu/cpu0/cpufreq/base_frequency ]; then + if (echo "${CPU_INFO_SOURCE}" | grep -qv sysfs); then + CPU_INFO_SOURCE="${CPU_INFO_SOURCE} sysfs" + fi + + CPU_FREQ="$(cat /sys/devices/system/cpu/cpu0/cpufreq/base_frequency)" +elif [ -n "${possible_cpu_freq}" ]; then + CPU_FREQ="${possible_cpu_freq}" +elif [ -r /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq ]; then + if (echo "${CPU_INFO_SOURCE}" | grep -qv sysfs); then + CPU_INFO_SOURCE="${CPU_INFO_SOURCE} sysfs" + fi + + CPU_FREQ="$(cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq)" fi freq_units="$(echo "${CPU_FREQ}" | cut -f 2 -d ' ')" case "${freq_units}" in - GHz) - value="$(echo "${CPU_FREQ}" | cut -f 1 -d ' ')" - CPU_FREQ="$((value*1000*1000*1000))" - ;; - MHz) - value="$(echo "${CPU_FREQ}" | cut -f 1 -d ' ')" - CPU_FREQ="$((value*1000*1000))" - ;; - KHz) - value="$(echo "${CPU_FREQ}" | cut -f 1 -d ' ')" - CPU_FREQ="$((value*1000))" - ;; - *) - ;; + GHz) + value="$(echo "${CPU_FREQ}" | cut -f 1 -d ' ')" + CPU_FREQ="$((value * 1000 * 1000 * 1000))" + ;; + MHz) + value="$(echo "${CPU_FREQ}" | cut -f 1 -d ' ')" + CPU_FREQ="$((value * 1000 * 1000))" + ;; + KHz) + value="$(echo "${CPU_FREQ}" | cut -f 1 -d ' ')" + CPU_FREQ="$((value * 1000))" + ;; + *) ;; + esac # ------------------------------------------------------------------------------------------------- @@ -283,16 +283,16 @@ esac TOTAL_RAM="unknown" RAM_DETECTION="none" -if [ "${KERNEL_NAME}" = FreeBSD ] ; then - RAM_DETECTION="sysctl" - TOTAL_RAM="$(sysctl -n hw.physmem)" -elif [ "${KERNEL_NAME}" = Darwin ] ; then - RAM_DETECTION="sysctl" - TOTAL_RAM="$(sysctl -n hw.physmem)" -elif [ -r /proc/meminfo ] ; then - RAM_DETECTION="procfs" - TOTAL_RAM="$(grep -F MemTotal /proc/meminfo | cut -f 2 -d ':' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' | cut -f 1 -d ' ')" - TOTAL_RAM="$((TOTAL_RAM*1024))" +if [ "${KERNEL_NAME}" = FreeBSD ]; then + RAM_DETECTION="sysctl" + TOTAL_RAM="$(sysctl -n hw.physmem)" +elif [ "${KERNEL_NAME}" = Darwin ]; then + RAM_DETECTION="sysctl" + TOTAL_RAM="$(sysctl -n hw.physmem)" +elif [ -r /proc/meminfo ]; then + RAM_DETECTION="procfs" + TOTAL_RAM="$(grep -F MemTotal /proc/meminfo | cut -f 2 -d ':' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' | cut -f 1 -d ' ')" + TOTAL_RAM="$((TOTAL_RAM * 1024))" fi # ------------------------------------------------------------------------------------------------- @@ -302,65 +302,76 @@ DISK_SIZE="unknown" DISK_DETECTION="none" if [ "${KERNEL_NAME}" = "Darwin" ]; then - types='hfs' + types='hfs' - if (lsvfs | grep -q apfs) ; then - types="${types},apfs" - fi + if (lsvfs | grep -q apfs); then + types="${types},apfs" + fi - if (lsvfs | grep -q ufs) ; then - types="${types},ufs" - fi + if (lsvfs | grep -q ufs); then + types="${types},ufs" + fi - DISK_DETECTION="df" - DISK_SIZE=$(($(/bin/df -k -t ${types} | tail -n +2 | sed -E 's/\/dev\/disk([[:digit:]]*)s[[:digit:]]*/\/dev\/disk\1/g' | sort -k 1 | awk -F ' ' '{s=$NF;for(i=NF-1;i>=1;i--)s=s FS $i;print s}' | uniq -f 9 | awk '{print $8}' | tr '\n' '+' | rev | cut -f 2- -d '+' | rev) * 1024)) -elif [ "${KERNEL_NAME}" = FreeBSD ] ; then - types='ufs' + DISK_DETECTION="df" + DISK_SIZE=$(($(/bin/df -k -t ${types} | tail -n +2 | sed -E 's/\/dev\/disk([[:digit:]]*)s[[:digit:]]*/\/dev\/disk\1/g' | sort -k 1 | awk -F ' ' '{s=$NF;for(i=NF-1;i>=1;i--)s=s FS $i;print s}' | uniq -f 9 | awk '{print $8}' | tr '\n' '+' | rev | cut -f 2- -d '+' | rev) * 1024)) +elif [ "${KERNEL_NAME}" = FreeBSD ]; then + types='ufs' - if (lsvfs | grep -q zfs) ; then - types="${types},zfs" - fi + if (lsvfs | grep -q zfs); then + types="${types},zfs" + fi - DISK_DETECTION="df" - total="$(df -t ${types} -c -k | tail -n 1 | awk '{print $2}')" - DISK_SIZE="$((total * 1024))" + DISK_DETECTION="df" + total="$(df -t ${types} -c -k | tail -n 1 | awk '{print $2}')" + DISK_SIZE="$((total * 1024))" else - if [ -d /sys/block ] && [ -r /proc/devices ] ; then - dev_major_whitelist='' - - # This is a list of device names used for block storage devices. - # These translate to the prefixs of files in `/dev` indicating the device type. - # They are sorted by lowest used device major number, with dynamically assigned ones at the end. - # We use this to look up device major numbers in `/proc/devices` - device_names='hd sd mfm ad ftl pd nftl dasd intfl mmcblk ub xvd rfd vbd nvme' - - for name in ${device_names} ; do - if grep -qE " ${name}\$" /proc/devices ; then - dev_major_whitelist="${dev_major_whitelist}:$(grep -E "${name}\$" /proc/devices | sed -e 's/^[[:space:]]*//' | cut -f 1 -d ' ' | tr '\n' ':'):" - fi - done - - DISK_DETECTION="sysfs" - DISK_SIZE="0" - for disk in /sys/block/* ; do - if [ -r "${disk}/size" ] && \ - (echo "${dev_major_whitelist}" | grep -q ":$(cut -f 1 -d ':' "${disk}/dev"):") && \ - grep -qv 1 "${disk}/removable" - then - size="$(($(cat "${disk}/size") * 512))" - DISK_SIZE="$((DISK_SIZE + size))" - fi - done - elif df --version 2>/dev/null | grep -qF "GNU coreutils" ; then - DISK_DETECTION="df" - DISK_SIZE=$(($(df -x tmpfs -x devtmpfs -x squashfs -l -B1 --output=source,size | tail -n +2 | sort -u -k 1 | awk '{print $2}' | tr '\n' '+' | head -c -1))) - else - DISK_DETECTION="df" - include_fs_types="ext*|btrfs|xfs|jfs|reiser*|zfs" - DISK_SIZE=$(($(df -T -P | tail -n +2 | sort -u -k 1 | grep "${include_fs_types}" | awk '{print $3}' | tr '\n' '+' | head -c -1) * 1024)) - fi + if [ -d /sys/block ] && [ -r /proc/devices ]; then + dev_major_whitelist='' + + # This is a list of device names used for block storage devices. + # These translate to the prefixs of files in `/dev` indicating the device type. + # They are sorted by lowest used device major number, with dynamically assigned ones at the end. + # We use this to look up device major numbers in `/proc/devices` + device_names='hd sd mfm ad ftl pd nftl dasd intfl mmcblk ub xvd rfd vbd nvme' + + for name in ${device_names}; do + if grep -qE " ${name}\$" /proc/devices; then + dev_major_whitelist="${dev_major_whitelist}:$(grep -E "${name}\$" /proc/devices | sed -e 's/^[[:space:]]*//' | cut -f 1 -d ' ' | tr '\n' ':'):" + fi + done + + DISK_DETECTION="sysfs" + DISK_SIZE="0" + for disk in /sys/block/*; do + if [ -r "${disk}/size" ] \ + && (echo "${dev_major_whitelist}" | grep -q ":$(cut -f 1 -d ':' "${disk}/dev"):") \ + && grep -qv 1 "${disk}/removable"; then + size="$(($(cat "${disk}/size") * 512))" + DISK_SIZE="$((DISK_SIZE + size))" + fi + done + elif df --version 2> /dev/null | grep -qF "GNU coreutils"; then + DISK_DETECTION="df" + DISK_SIZE=$(($(df -x tmpfs -x devtmpfs -x squashfs -l -B1 --output=source,size | tail -n +2 | sort -u -k 1 | awk '{print $2}' | tr '\n' '+' | head -c -1))) + else + DISK_DETECTION="df" + include_fs_types="ext*|btrfs|xfs|jfs|reiser*|zfs" + DISK_SIZE=$(($(df -T -P | tail -n +2 | sort -u -k 1 | grep "${include_fs_types}" | awk '{print $3}' | tr '\n' '+' | head -c -1) * 1024)) + fi fi +# ------------------------------------------------------------------------------------------------- +# Detect whether the node is kubernetes node + +HOST_IS_K8S_NODE="false" + +if [ -n "${KUBERNETES_SERVICE_HOST}" ] && [ -n "${KUBERNETES_SERVICE_PORT}" ]; then + # These env vars are set for every container managed by k8s. + HOST_IS_K8S_NODE="true" +elif pgrep "kubelet"; then + # The kubelet is the primary "node agent" that runs on each node. + HOST_IS_K8S_NODE="true" +fi echo "NETDATA_CONTAINER_OS_NAME=${CONTAINER_NAME}" echo "NETDATA_CONTAINER_OS_ID=${CONTAINER_ID}" @@ -374,6 +385,7 @@ echo "NETDATA_HOST_OS_ID_LIKE=${HOST_ID_LIKE}" echo "NETDATA_HOST_OS_VERSION=${HOST_VERSION}" echo "NETDATA_HOST_OS_VERSION_ID=${HOST_VERSION_ID}" echo "NETDATA_HOST_OS_DETECTION=${HOST_OS_DETECTION}" +echo "NETDATA_HOST_IS_K8S_NODE=${HOST_IS_K8S_NODE}" echo "NETDATA_SYSTEM_KERNEL_NAME=${KERNEL_NAME}" echo "NETDATA_SYSTEM_KERNEL_VERSION=${KERNEL_VERSION}" echo "NETDATA_SYSTEM_ARCHITECTURE=${ARCHITECTURE}" @@ -390,4 +402,3 @@ echo "NETDATA_SYSTEM_TOTAL_RAM=${TOTAL_RAM}" echo "NETDATA_SYSTEM_RAM_DETECTION=${RAM_DETECTION}" echo "NETDATA_SYSTEM_TOTAL_DISK_SIZE=${DISK_SIZE}" echo "NETDATA_SYSTEM_DISK_DETECTION=${DISK_DETECTION}" - diff --git a/database/rrd.h b/database/rrd.h index 86f4226348..f52d34af8a 100644 --- a/database/rrd.h +++ b/database/rrd.h @@ -721,6 +721,7 @@ struct rrdhost_system_info { char *virt_detection; char *container; char *container_detection; + char *is_k8s_node; }; struct rrdhost { diff --git a/database/rrdhost.c b/database/rrdhost.c index e120e9d445..8b8a2dc2a6 100644 --- a/database/rrdhost.c +++ b/database/rrdhost.c @@ -758,6 +758,7 @@ void rrdhost_system_info_free(struct rrdhost_system_info *system_info) { freez(system_info->virt_detection); freez(system_info->container); freez(system_info->container_detection); + freez(system_info->is_k8s_node); freez(system_info); } } @@ -982,6 +983,10 @@ static struct label *rrdhost_load_auto_labels(void) label_list = add_label_to_list(label_list, "_virt_detection", localhost->system_info->virt_detection, LABEL_SOURCE_AUTO); + if (localhost->system_info->is_k8s_node) + label_list = + add_label_to_list(label_list, "_is_k8s_node", localhost->system_info->is_k8s_node, LABEL_SOURCE_AUTO); + label_list = add_label_to_list( label_list, "_is_parent", (localhost->next || configured_as_parent()) ? "true" : "false", LABEL_SOURCE_AUTO); @@ -1523,6 +1528,10 @@ int rrdhost_set_system_info_variable(struct rrdhost_system_info *system_info, ch freez(system_info->container_detection); system_info->container_detection = strdupz(value); } + else if(!strcmp(name, "NETDATA_HOST_IS_K8S_NODE")){ + freez(system_info->is_k8s_node); + system_info->is_k8s_node = strdupz(value); + } else if (!strcmp(name, "NETDATA_SYSTEM_CPU_VENDOR")) return res; else if (!strcmp(name, "NETDATA_SYSTEM_CPU_MODEL")) diff --git a/docs/guides/using-host-labels.md b/docs/guides/using-host-labels.md index 9d235961ab..6d4af2e5da 100644 --- a/docs/guides/using-host-labels.md +++ b/docs/guides/using-host-labels.md @@ -50,6 +50,7 @@ read the status of your agent. For example, from a VPS system running Debian 10: { ... "host_labels": { + "_is_k8s_node": "false", "_is_parent": "false", "_virt_detection": "systemd-detect-virt", "_container_detection": "none", @@ -81,6 +82,7 @@ They capture the following: - Operating system name and version - CPU architecture, system cores, CPU frequency, RAM, and disk space - Whether Netdata is running inside of a container, and if so, the OS and hardware details about the container's host +- Whether Netdata is running inside K8s node - What virtualization layer the system runs on top of, if any - Whether the system is a streaming parent or child diff --git a/streaming/sender.c b/streaming/sender.c index c112609808..d55a420ab7 100644 --- a/streaming/sender.c +++ b/streaming/sender.c @@ -221,6 +221,7 @@ static int rrdpush_sender_thread_connect_to_parent(RRDHOST *host, int default_po "&NETDATA_SYSTEM_OS_VERSION=%s" "&NETDATA_SYSTEM_OS_VERSION_ID=%s" "&NETDATA_SYSTEM_OS_DETECTION=%s" + "&NETDATA_HOST_IS_K8S_NODE=%s" "&NETDATA_SYSTEM_KERNEL_NAME=%s" "&NETDATA_SYSTEM_KERNEL_VERSION=%s" "&NETDATA_SYSTEM_ARCHITECTURE=%s" @@ -257,6 +258,7 @@ static int rrdpush_sender_thread_connect_to_parent(RRDHOST *host, int default_po , se.os_version , (host->system_info->host_os_version_id) ? host->system_info->host_os_version_id : "" , (host->system_info->host_os_detection) ? host->system_info->host_os_detection : "" + , (host->system_info->is_k8s_node) ? host->system_info->is_k8s_node : "" , se.kernel_name , se.kernel_version , (host->system_info->architecture) ? host->system_info->architecture : "" diff --git a/web/api/netdata-swagger.json b/web/api/netdata-swagger.json index 47f5fe379d..ed2555f830 100644 --- a/web/api/netdata-swagger.json +++ b/web/api/netdata-swagger.json @@ -9,7 +9,7 @@ "/info": { "get": { "summary": "Get netdata basic information", - "description": "The info endpoint returns basic information about netdata. It provides:\n* netdata version\n* netdata unique id\n* list of hosts mirrored (includes itself)\n* Operating System, Virtualization and Container technology information\n* List of active collector plugins and modules\n* number of alarms in the host\n * number of alarms in normal state\n * number of alarms in warning state\n * number of alarms in critical state\n", + "description": "The info endpoint returns basic information about netdata. It provides:\n* netdata version\n* netdata unique id\n* list of hosts mirrored (includes itself)\n* Operating System, Virtualization, K8s nodes and Container technology information\n* List of active collector plugins and modules\n* number of alarms in the host\n * number of alarms in normal state\n * number of alarms in warning state\n * number of alarms in critical state\n", "responses": { "200": { "description": "netdata basic information.", @@ -1172,6 +1172,11 @@ "description": "Kernel Version.", "example": "4.19.32-1-MANJARO" }, + "is_k8s_node": { + "type": "boolean", + "description": "Netdata is running on a K8s node.", + "example": false + }, "architecture": { "type": "string", "description": "Kernel architecture.", diff --git a/web/api/netdata-swagger.yaml b/web/api/netdata-swagger.yaml index 8ccf299812..748274216f 100644 --- a/web/api/netdata-swagger.yaml +++ b/web/api/netdata-swagger.yaml @@ -12,7 +12,7 @@ paths: * netdata version * netdata unique id * list of hosts mirrored (includes itself) - * Operating System, Virtualization and Container technology information + * Operating System, Virtualization, K8s nodes and Container technology information * List of active collector plugins and modules * number of alarms in the host * number of alarms in normal state @@ -948,6 +948,10 @@ components: type: string de |