diff options
author | Austin S. Hemmelgarn <austin@netdata.cloud> | 2024-04-25 09:21:03 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-25 09:21:03 +0300 |
commit | 9b3b4816c16fd2359d61dbdfa12366e8b294e135 (patch) | |
tree | a0e45a7fa4766becb5a3bd7380ae44686969a52a | |
parent | 0388cb719ea3c881ad6da0c93fe6ff95d1fded3c (diff) |
Move handling of legacy eBPF programs into CMake. (#17512)
* Move handling of legacy eBPF programs into CMake.
* Fix typos.
* Fix more typos
* Fix up packaging code.
-rw-r--r-- | CMakeLists.txt | 14 | ||||
-rwxr-xr-x | contrib/debian/rules | 9 | ||||
-rwxr-xr-x | netdata-installer.sh | 128 | ||||
-rw-r--r-- | netdata.spec.in | 5 | ||||
-rwxr-xr-x | packaging/bundle-ebpf.sh | 20 | ||||
-rw-r--r-- | packaging/cmake/Modules/NetdataEBPFLegacy.cmake | 39 | ||||
-rw-r--r-- | packaging/cmake/Modules/NetdataLibBPF.cmake | 31 | ||||
-rw-r--r-- | packaging/cmake/Modules/NetdataUtil.cmake | 38 | ||||
-rw-r--r-- | packaging/ebpf.checksums | 3 | ||||
-rw-r--r-- | packaging/ebpf.version | 1 |
10 files changed, 93 insertions, 195 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 67a0a20896..2d5372c83e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -119,6 +119,8 @@ option(ENABLE_PLUGIN_CGROUP_NETWORK "Enable Linux CGroup network usage monitorin option(ENABLE_PLUGIN_CUPS "Enable CUPS monitoring" ${DEFAULT_FEATURE_STATE}) option(ENABLE_PLUGIN_DEBUGFS "Enable Linux DebugFS metric collection" ${DEFAULT_FEATURE_STATE}) option(ENABLE_PLUGIN_EBPF "Enable Linux eBPF metric collection" ${DEFAULT_FEATURE_STATE}) +cmake_dependent_option(ENABLE_LEGACY_EBPF_PROGRAMS "Enable eBPF programs for kernels without BTF support" True ENABLE_PLUGIN_EBPF False) +mark_as_advanced(ENABLE_LEGACY_EBPF_PROGRAMS) option(ENABLE_PLUGIN_FREEIPMI "Enable IPMI monitoring" ${DEFAULT_FEATURE_STATE}) option(ENABLE_PLUGIN_GO "Enable metric collectors written in Go" ${DEFAULT_FEATURE_STATE}) option(ENABLE_PLUGIN_LOCAL_LISTENERS "Enable local listening socket tracking (including service auto-discovery support)" ${DEFAULT_FEATURE_STATE}) @@ -299,6 +301,10 @@ endif() include(NetdataJSONC) include(NetdataYAML) +if(ENABLE_LEGACY_EBPF_PROGRAMS) + include(NetdataEBPFLegacy) +endif() + if(ENABLE_SENTRY) include(NetdataSentry) endif() @@ -310,6 +316,10 @@ endif() netdata_detect_jsonc() netdata_detect_libyaml() +if(ENABLE_LEGACY_EBPF_PROGRAMS) + netdata_fetch_legacy_ebpf_code() +endif() + if(ENABLE_SENTRY) netdata_bundle_sentry() endif() @@ -1936,6 +1946,10 @@ if(ENABLE_PLUGIN_EBPF) install(TARGETS ebpf.plugin COMPONENT ebpf_plugin DESTINATION usr/libexec/netdata/plugins.d) + + if(ENABLE_LEGACY_EBPF_PROGRAMS) + netdata_install_legacy_ebpf_code() + endif() endif() if(ENABLE_PLUGIN_LOCAL_LISTENERS) diff --git a/contrib/debian/rules b/contrib/debian/rules index f27b623ab8..0f35bebbff 100755 --- a/contrib/debian/rules +++ b/contrib/debian/rules @@ -148,6 +148,8 @@ override_dh_install: mv -f $(TEMPTOP)/usr/libexec/netdata/plugins.d/ebpf.plugin $(TOP)-plugin-ebpf/usr/libexec/netdata/plugins.d/ebpf.plugin; \ mv -f $(TEMPTOP)/usr/lib/netdata/conf.d/ebpf.d.conf $(TOP)-plugin-ebpf/usr/lib/netdata/conf.d/ebpf.d.conf; \ mv -f $(TEMPTOP)/usr/lib/netdata/conf.d/ebpf.d $(TOP)-plugin-ebpf/usr/lib/netdata/conf.d/ebpf.d; \ + mkdir -p $(TOP)-ebpf-code-legacy/usr/libexec/netdata/plugins.d/; \ + mv -f $(TEMPTOP)/usr/libexec/netdata/plugins.d/ebpf.d $(TOP)-ebpf-code-legacy/usr/libexec/netdata/plugins.d/ebpf.d; \ fi # Add python plugin install rules @@ -236,13 +238,6 @@ override_dh_install: # cp -v packaging/installer/netdata-updater.sh $(TOP)/usr/libexec/netdata/netdata-updater.sh - # Handle eBPF code - # - if [ $(HAVE_EBPF) -eq 1 ]; then \ - mkdir -p $(TOP)-ebpf-code-legacy/usr/libexec/netdata/plugins.d/; \ - packaging/bundle-ebpf.sh . ${TOP}-ebpf-code-legacy/usr/libexec/netdata/plugins.d/ force; \ - fi - override_dh_installdocs: dh_installdocs diff --git a/netdata-installer.sh b/netdata-installer.sh index 717012533d..e95bff7fb8 100755 --- a/netdata-installer.sh +++ b/netdata-installer.sh @@ -1080,134 +1080,6 @@ detect_libc() { echo "${libc}" } -should_install_ebpf() { - if [ "${ENABLE_EBPF:-0}" -eq 0 ]; then - return 1 - fi - - if [ "$(uname -m)" != "x86_64" ]; then - if [ "${ENABLE_EBPF:-0}" -eq 1 ]; then - run_failed "Currently eBPF is only supported on Linux on x86_64." - fi - - return 1 - fi - - # Check Kernel Config - if ! run "${INSTALLER_DIR}"/packaging/check-kernel-config.sh; then - warning "Kernel unsupported or missing required config (eBPF may not work on your system)" - fi - - return 0 -} - -remove_old_ebpf() { - if [ -f "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/ebpf_process.plugin" ]; then - echo >&2 "Removing alpha eBPF collector." - rm -f "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/ebpf_process.plugin" - fi - - if [ -f "${NETDATA_PREFIX}/usr/lib/netdata/conf.d/ebpf_process.conf" ]; then - echo >&2 "Removing alpha eBPF stock file" - rm -f "${NETDATA_PREFIX}/usr/lib/netdata/conf.d/ebpf_process.conf" - fi - - if [ -f "${NETDATA_PREFIX}/etc/netdata/ebpf_process.conf" ]; then - echo >&2 "Renaming eBPF configuration file." - mv "${NETDATA_PREFIX}/etc/netdata/ebpf_process.conf" "${NETDATA_PREFIX}/etc/netdata/ebpf.d.conf" - fi - - # Added to remove eBPF programs with name pattern: NAME_VERSION.SUBVERSION.PATCH - if [ -f "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/pnetdata_ebpf_process.3.10.0.o" ]; then - echo >&2 "Removing old eBPF programs with patch." - rm -f "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/rnetdata_ebpf"*.?.*.*.o - rm -f "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/pnetdata_ebpf"*.?.*.*.o - fi - - # Remove old eBPF program to store new eBPF program inside subdirectory - if [ -f "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/pnetdata_ebpf_process.3.10.o" ]; then - echo >&2 "Removing old eBPF programs installed in old directory." - rm -f "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/rnetdata_ebpf"*.?.*.o - rm -f "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/pnetdata_ebpf"*.?.*.o - fi - - # Remove old eBPF programs that did not have "rhf" suffix - if [ ! -f "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/ebpf.d/pnetdata_ebpf_process.3.10.rhf.o" ]; then - rm -f "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/ebpf.d/"*.o - fi - - # Remove old reject list from previous directory - if [ -f "${NETDATA_PREFIX}/usr/lib/netdata/conf.d/ebpf_kernel_reject_list.txt" ]; then - echo >&2 "Removing old ebpf_kernel_reject_list.txt." - rm -f "${NETDATA_PREFIX}/usr/lib/netdata/conf.d/ebpf_kernel_reject_list.txt" - fi - - # Remove old reset script - if [ -f "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/reset_netdata_trace.sh" ]; then - echo >&2 "Removing old reset_netdata_trace.sh." - rm -f "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/reset_netdata_trace.sh" - fi -} - -install_ebpf() { - if ! should_install_ebpf; then - return 0 - fi - - [ -n "${GITHUB_ACTIONS}" ] && echo "::group::Installing eBPF code." - - remove_old_ebpf - - progress "Installing eBPF programs" - - # Detect libc - libc="$(detect_libc)" - - EBPF_VERSION="$(cat packaging/ebpf.version)" - EBPF_TARBALL="netdata-kernel-collector-${libc}-${EBPF_VERSION}.tar.xz" - - tmp="$(mktemp -d -t netdata-ebpf-XXXXXX)" - - if ! fetch_and_verify "ebpf" \ - "https://github.com/netdata/kernel-collector/releases/download/${EBPF_VERSION}/${EBPF_TARBALL}" \ - "${EBPF_TARBALL}" \ - "${tmp}" \ - "${NETDATA_LOCAL_TARBALL_OVERRIDE_EBPF}"; then - run_failed "Failed to download eBPF collector package" - echo 2>&" Removing temporary directory ${tmp} ..." - rm -rf "${tmp}" - - [ -n "${GITHUB_ACTIONS}" ] && echo "::endgroup::" - return 1 - fi - - echo >&2 " Extracting ${EBPF_TARBALL} ..." - tar --no-same-owner -xf "${tmp}/${EBPF_TARBALL}" -C "${tmp}" - - # chown everything to root:netdata before we start copying out of our package - run chown -R root:netdata "${tmp}" - - if [ ! -d "${NETDATA_PREFIX}"/usr/libexec/netdata/plugins.d/ebpf.d ]; then - mkdir "${NETDATA_PREFIX}"/usr/libexec/netdata/plugins.d/ebpf.d - RET=$? - if [ "${RET}" != "0" ]; then - rm -rf "${tmp}" - - [ -n "${GITHUB_ACTIONS}" ] && echo "::endgroup::" - return 1 - fi - fi - - run cp -a -v "${tmp}"/*netdata_ebpf_*.o "${NETDATA_PREFIX}"/usr/libexec/netdata/plugins.d/ebpf.d - - rm -rf "${tmp}" - - [ -n "${GITHUB_ACTIONS}" ] && echo "::endgroup::" -} - -progress "eBPF Kernel Collector" -install_ebpf - should_install_fluentbit() { if [ "$(uname -s)" = "Darwin" ]; then return 1 diff --git a/netdata.spec.in b/netdata.spec.in index 76701524e2..2e9d80c2e2 100644 --- a/netdata.spec.in +++ b/netdata.spec.in @@ -433,11 +433,6 @@ install -m 644 -p "%{__cmake_builddir}/system/systemd/%{name}.service.v235" "${R install -m 755 -d "${RPM_BUILD_ROOT}%{_presetdir}" install -m 644 -p "system/systemd/50-%{name}.preset" "${RPM_BUILD_ROOT}%{_presetdir}/50-%{name}.preset" -%if 0%{?_have_ebpf} -${RPM_BUILD_DIR}/%{name}-%{version}/packaging/bundle-ebpf.sh ${RPM_BUILD_DIR}/%{name}-%{version} \ -${RPM_BUILD_ROOT}%{_libexecdir}/%{name}/plugins.d -%endif - %pre if ! getent group %{name} > /dev/null; then diff --git a/packaging/bundle-ebpf.sh b/packaging/bundle-ebpf.sh deleted file mode 100755 index 11930671fe..0000000000 --- a/packaging/bundle-ebpf.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/sh - -SRCDIR="${1}" -PLUGINDIR="${2}" -FORCE="${3}" - -EBPF_VERSION="$(cat "${SRCDIR}/packaging/ebpf.version")" -EBPF_TARBALL="netdata-kernel-collector-glibc-${EBPF_VERSION}.tar.xz" - -if [ -x "${PLUGINDIR}/ebpf.plugin" ] || [ "${FORCE}" = "force" ]; then - mkdir -p "${SRCDIR}/tmp/ebpf" - curl -sSL --connect-timeout 10 --retry 3 "https://github.com/netdata/kernel-collector/releases/download/${EBPF_VERSION}/${EBPF_TARBALL}" > "${EBPF_TARBALL}" || exit 1 - grep "${EBPF_TARBALL}" "${SRCDIR}/packaging/ebpf.checksums" | sha256sum -c - || exit 1 - tar -xva --no-same-owner -f "${EBPF_TARBALL}" -C "${SRCDIR}/tmp/ebpf" || exit 1 - if [ ! -d "${PLUGINDIR}/ebpf.d" ];then - mkdir "${PLUGINDIR}/ebpf.d" - fi - # shellcheck disable=SC2046 - cp -r $(find "${SRCDIR}/tmp/ebpf" -mindepth 1 -maxdepth 1) "${PLUGINDIR}/ebpf.d" -fi diff --git a/packaging/cmake/Modules/NetdataEBPFLegacy.cmake b/packaging/cmake/Modules/NetdataEBPFLegacy.cmake new file mode 100644 index 0000000000..8bfa62dd26 --- /dev/null +++ b/packaging/cmake/Modules/NetdataEBPFLegacy.cmake @@ -0,0 +1,39 @@ +# Handling for eBPF legacy programs +# +# Copyright (c) 2024 Netdata Inc. +# SPDX-License-Identifier: GPL-3.0-or-later + +include(ExternalProject) +include(NetdataUtil) + +set(ebpf-legacy_SOURCE_DIR "${CMAKE_BINARY_DIR}/ebpf-legacy") +set(ebpf-legacy_BUILD_DIR "${CMAKE_BINARY_DIR}/ebpf-legacy-build") + +# Fetch the legacy eBPF code. +function(netdata_fetch_legacy_ebpf_code) + netdata_identify_libc(_libc) + + if(_libc STREQUAL "glibc") + set(_hash 7013753ef85c2d3681bdcfdd7544705cdaf5b640b70734ca223f43cc5adcdc53) + elseif(_libc STREQUAL "musl") + set(_hash b524d1fcbd67c82cdfc9f46d55f67c0c0c0412c3356c85b38c03ce03f6068747) + else() + message(FATAL_ERROR "Could not determine libc implementation, unable to install eBPF legacy code.") + endif() + + ExternalProject_Add( + ebpf-code-legacy + URL https://github.com/netdata/kernel-collector/releases/download/v1.4.0/netdata-kernel-collector-${_libc}-v1.4.0.tar.xz + URL_HASH SHA256=${_hash} + SOURCE_DIR "${ebpf-legacy_SOURCE_DIR}" + CONFIGURE_COMMAND "" + BUILD_COMMAND sh -c "mkdir -p ${ebpf-legacy_BUILD_DIR}/ebpf.d && mv ${ebpf-legacy_SOURCE_DIR}/*netdata_ebpf_*.o ${ebpf-legacy_BUILD_DIR}/ebpf.d" + INSTALL_COMMAND "" + ) +endfunction() + +function(netdata_install_legacy_ebpf_code) + install(DIRECTORY ${ebpf-legacy_BUILD_DIR}/ebpf.d + DESTINATION usr/libexec/netdata/plugins.d + COMPONENT ebpf-code-legacy) +endfunction() diff --git a/packaging/cmake/Modules/NetdataLibBPF.cmake b/packaging/cmake/Modules/NetdataLibBPF.cmake index 4c11f5b7e2..bfd4f6d7a7 100644 --- a/packaging/cmake/Modules/NetdataLibBPF.cmake +++ b/packaging/cmake/Modules/NetdataLibBPF.cmake @@ -8,37 +8,6 @@ include(NetdataUtil) set(libbpf_SOURCE_DIR "${CMAKE_BINARY_DIR}/libbpf") -# Check what libc we're using. -# -# Sets the specified variable to the name of the libc or "unknown" -function(netdata_identify_libc _libc_name) - message(INFO "Detecting libc implementation") - - execute_process(COMMAND ldd --version - COMMAND grep -q -i -E "glibc|gnu libc" - RESULT_VARIABLE LDD_IS_GLIBC - OUTPUT_VARIABLE LDD_OUTPUT - ERROR_VARIABLE LDD_OUTPUT) - - if(LDD_IS_GLIBC) - set(${_libc_name} glibc PARENT_SCOPE) - return() - endif() - - execute_process(COMMAND ldd --version - COMMAND grep -q -i -E "musl" - RESULT_VARIABLE LDD_IS_MUSL - OUTPUT_VARIABLE LDD_OUTPUT - ERROR_VARIABLE LDD_OUTPUT) - - if(LDD_IS_MUSL) - set(${_libc_name} musl PARENT_SCOPE) - return() - endif() - - set(${_libc_name} unknown PARENT_SCOPE) -endfunction() - # Check if the kernel is old enough that we need to use a legacy copy of eBPF. function(_need_legacy_libbpf _var) if(FORCE_LEGACY_LIBBPF) diff --git a/packaging/cmake/Modules/NetdataUtil.cmake b/packaging/cmake/Modules/NetdataUtil.cmake index ed1b723d0d..411fc7a7aa 100644 --- a/packaging/cmake/Modules/NetdataUtil.cmake +++ b/packaging/cmake/Modules/NetdataUtil.cmake @@ -30,3 +30,41 @@ function(netdata_detect_host_kernel_version) message(CHECK_PASS "${_kversion}") set(HOST_KERNEL_VERSION "${_kversion}" CACHE STRING "Detected host kernel version") endfunction() + +# Check what libc we're using. +# +# Sets the specified variable to the name of the libc or "unknown" +function(netdata_identify_libc _libc_name) + if(NOT DEFINED _ND_DETECTED_LIBC) + message(INFO "Detecting libc implementation") + + execute_process(COMMAND ldd --version + COMMAND grep -q -i -E "glibc|gnu libc" + RESULT_VARIABLE LDD_IS_GLIBC + OUTPUT_VARIABLE LDD_OUTPUT + ERROR_VARIABLE LDD_OUTPUT) + + if(LDD_IS_GLIBC) + set(${_libc_name} glibc PARENT_SCOPE) + set(_ND_DETECTED_LIBC glibc CACHE INTERNAL "") + return() + endif() + + execute_process(COMMAND ldd --version + COMMAND grep -q -i -E "musl" + RESULT_VARIABLE LDD_IS_MUSL + OUTPUT_VARIABLE LDD_OUTPUT + ERROR_VARIABLE LDD_OUTPUT) + + if(LDD_IS_MUSL) + set(${_libc_name} musl PARENT_SCOPE) + set(_ND_DETECTED_LIBC musl CACHE INTERNAL "") + return() + endif() + + set(${_libc_name} unknown PARENT_SCOPE) + set(_ND_DETECTED_LIBC unknown CACHE INTERNAL "") + else() + set(${_libc_name} ${_ND_DETECTED_LIBC} PARENT_SCOPE) + endif() +endfunction() diff --git a/packaging/ebpf.checksums b/packaging/ebpf.checksums deleted file mode 100644 index 1d90730dbd..0000000000 --- a/packaging/ebpf.checksums +++ /dev/null @@ -1,3 +0,0 @@ -7013753ef85c2d3681bdcfdd7544705cdaf5b640b70734ca223f43cc5adcdc53 ./netdata-kernel-collector-glibc-v1.4.0.tar.xz -b524d1fcbd67c82cdfc9f46d55f67c0c0c0412c3356c85b38c03ce03f6068747 ./netdata-kernel-collector-musl-v1.4.0.tar.xz -302714979470e300b81a64a4ebef9fac1f3488488482cf30c926fa98f73cabc1 ./netdata-kernel-collector-static-v1.4.0.tar.xz diff --git a/packaging/ebpf.version b/packaging/ebpf.version deleted file mode 100644 index 0d0c52f84d..0000000000 --- a/packaging/ebpf.version +++ /dev/null @@ -1 +0,0 @@ -v1.4.0 |