summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAustin S. Hemmelgarn <austin@netdata.cloud>2024-04-25 09:21:03 +0300
committerGitHub <noreply@github.com>2024-04-25 09:21:03 +0300
commit9b3b4816c16fd2359d61dbdfa12366e8b294e135 (patch)
treea0e45a7fa4766becb5a3bd7380ae44686969a52a
parent0388cb719ea3c881ad6da0c93fe6ff95d1fded3c (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.txt14
-rwxr-xr-xcontrib/debian/rules9
-rwxr-xr-xnetdata-installer.sh128
-rw-r--r--netdata.spec.in5
-rwxr-xr-xpackaging/bundle-ebpf.sh20
-rw-r--r--packaging/cmake/Modules/NetdataEBPFLegacy.cmake39
-rw-r--r--packaging/cmake/Modules/NetdataLibBPF.cmake31
-rw-r--r--packaging/cmake/Modules/NetdataUtil.cmake38
-rw-r--r--packaging/ebpf.checksums3
-rw-r--r--packaging/ebpf.version1
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