@cryptotaxi247 / netdata-1 / commits / 9b3b4816c

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.

Austin S. Hemmelgarn committed Apr 25, 2024 at 09:21 UTC 9b3b4816c16fd2359d61dbdfa12366e8b294e135
10 files changed +93 -195
CMakeLists.txt
+14
@@ -119,6 +119,8 @@ option(ENABLE_PLUGIN_CGROUP_NETWORK "Enable Linux CGroup network usage monitorin
119 option(ENABLE_PLUGIN_CUPS "Enable CUPS monitoring" ${DEFAULT_FEATURE_STATE})
120 option(ENABLE_PLUGIN_DEBUGFS "Enable Linux DebugFS metric collection" ${DEFAULT_FEATURE_STATE})
121 option(ENABLE_PLUGIN_EBPF "Enable Linux eBPF metric collection" ${DEFAULT_FEATURE_STATE})
122 +cmake_dependent_option(ENABLE_LEGACY_EBPF_PROGRAMS "Enable eBPF programs for kernels without BTF support" True ENABLE_PLUGIN_EBPF False)
123 +mark_as_advanced(ENABLE_LEGACY_EBPF_PROGRAMS)
124 option(ENABLE_PLUGIN_FREEIPMI "Enable IPMI monitoring" ${DEFAULT_FEATURE_STATE})
125 option(ENABLE_PLUGIN_GO "Enable metric collectors written in Go" ${DEFAULT_FEATURE_STATE})
126 option(ENABLE_PLUGIN_LOCAL_LISTENERS "Enable local listening socket tracking (including service auto-discovery support)" ${DEFAULT_FEATURE_STATE})
@@ -299,6 +301,10 @@ endif()
301 include(NetdataJSONC)
302 include(NetdataYAML)
303
304 +if(ENABLE_LEGACY_EBPF_PROGRAMS)
305 + include(NetdataEBPFLegacy)
306 +endif()
307 +
308 if(ENABLE_SENTRY)
309 include(NetdataSentry)
310 endif()
@@ -310,6 +316,10 @@ endif()
316 netdata_detect_jsonc()
317 netdata_detect_libyaml()
318
319 +if(ENABLE_LEGACY_EBPF_PROGRAMS)
320 + netdata_fetch_legacy_ebpf_code()
321 +endif()
322 +
323 if(ENABLE_SENTRY)
324 netdata_bundle_sentry()
325 endif()
@@ -1936,6 +1946,10 @@ if(ENABLE_PLUGIN_EBPF)
1946 install(TARGETS ebpf.plugin
1947 COMPONENT ebpf_plugin
1948 DESTINATION usr/libexec/netdata/plugins.d)
1949 +
1950 + if(ENABLE_LEGACY_EBPF_PROGRAMS)
1951 + netdata_install_legacy_ebpf_code()
1952 + endif()
1953 endif()
1954
1955 if(ENABLE_PLUGIN_LOCAL_LISTENERS)
contrib/debian/rules
+2 -7
@@ -148,6 +148,8 @@ override_dh_install:
148 mv -f $(TEMPTOP)/usr/libexec/netdata/plugins.d/ebpf.plugin $(TOP)-plugin-ebpf/usr/libexec/netdata/plugins.d/ebpf.plugin; \
149 mv -f $(TEMPTOP)/usr/lib/netdata/conf.d/ebpf.d.conf $(TOP)-plugin-ebpf/usr/lib/netdata/conf.d/ebpf.d.conf; \
150 mv -f $(TEMPTOP)/usr/lib/netdata/conf.d/ebpf.d $(TOP)-plugin-ebpf/usr/lib/netdata/conf.d/ebpf.d; \
151 + mkdir -p $(TOP)-ebpf-code-legacy/usr/libexec/netdata/plugins.d/; \
152 + mv -f $(TEMPTOP)/usr/libexec/netdata/plugins.d/ebpf.d $(TOP)-ebpf-code-legacy/usr/libexec/netdata/plugins.d/ebpf.d; \
153 fi
154
155 # Add python plugin install rules
@@ -236,13 +238,6 @@ override_dh_install:
238 #
239 cp -v packaging/installer/netdata-updater.sh $(TOP)/usr/libexec/netdata/netdata-updater.sh
240
239 - # Handle eBPF code
240 - #
241 - if [ $(HAVE_EBPF) -eq 1 ]; then \
242 - mkdir -p $(TOP)-ebpf-code-legacy/usr/libexec/netdata/plugins.d/; \
243 - packaging/bundle-ebpf.sh . ${TOP}-ebpf-code-legacy/usr/libexec/netdata/plugins.d/ force; \
244 - fi
245 -
241
242 override_dh_installdocs:
243 dh_installdocs
netdata-installer.sh
-128
@@ -1080,134 +1080,6 @@ detect_libc() {
1080 echo "${libc}"
1081 }
1082
1083 -should_install_ebpf() {
1084 - if [ "${ENABLE_EBPF:-0}" -eq 0 ]; then
1085 - return 1
1086 - fi
1087 -
1088 - if [ "$(uname -m)" != "x86_64" ]; then
1089 - if [ "${ENABLE_EBPF:-0}" -eq 1 ]; then
1090 - run_failed "Currently eBPF is only supported on Linux on x86_64."
1091 - fi
1092 -
1093 - return 1
1094 - fi
1095 -
1096 - # Check Kernel Config
1097 - if ! run "${INSTALLER_DIR}"/packaging/check-kernel-config.sh; then
1098 - warning "Kernel unsupported or missing required config (eBPF may not work on your system)"
1099 - fi
1100 -
1101 - return 0
1102 -}
1103 -
1104 -remove_old_ebpf() {
1105 - if [ -f "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/ebpf_process.plugin" ]; then
1106 - echo >&2 "Removing alpha eBPF collector."
1107 - rm -f "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/ebpf_process.plugin"
1108 - fi
1109 -
1110 - if [ -f "${NETDATA_PREFIX}/usr/lib/netdata/conf.d/ebpf_process.conf" ]; then
1111 - echo >&2 "Removing alpha eBPF stock file"
1112 - rm -f "${NETDATA_PREFIX}/usr/lib/netdata/conf.d/ebpf_process.conf"
1113 - fi
1114 -
1115 - if [ -f "${NETDATA_PREFIX}/etc/netdata/ebpf_process.conf" ]; then
1116 - echo >&2 "Renaming eBPF configuration file."
1117 - mv "${NETDATA_PREFIX}/etc/netdata/ebpf_process.conf" "${NETDATA_PREFIX}/etc/netdata/ebpf.d.conf"
1118 - fi
1119 -
1120 - # Added to remove eBPF programs with name pattern: NAME_VERSION.SUBVERSION.PATCH
1121 - if [ -f "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/pnetdata_ebpf_process.3.10.0.o" ]; then
1122 - echo >&2 "Removing old eBPF programs with patch."
1123 - rm -f "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/rnetdata_ebpf"*.?.*.*.o
1124 - rm -f "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/pnetdata_ebpf"*.?.*.*.o
1125 - fi
1126 -
1127 - # Remove old eBPF program to store new eBPF program inside subdirectory
1128 - if [ -f "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/pnetdata_ebpf_process.3.10.o" ]; then
1129 - echo >&2 "Removing old eBPF programs installed in old directory."
1130 - rm -f "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/rnetdata_ebpf"*.?.*.o
1131 - rm -f "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/pnetdata_ebpf"*.?.*.o
1132 - fi
1133 -
1134 - # Remove old eBPF programs that did not have "rhf" suffix
1135 - if [ ! -f "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/ebpf.d/pnetdata_ebpf_process.3.10.rhf.o" ]; then
1136 - rm -f "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/ebpf.d/"*.o
1137 - fi
1138 -
1139 - # Remove old reject list from previous directory
1140 - if [ -f "${NETDATA_PREFIX}/usr/lib/netdata/conf.d/ebpf_kernel_reject_list.txt" ]; then
1141 - echo >&2 "Removing old ebpf_kernel_reject_list.txt."
1142 - rm -f "${NETDATA_PREFIX}/usr/lib/netdata/conf.d/ebpf_kernel_reject_list.txt"
1143 - fi
1144 -
1145 - # Remove old reset script
1146 - if [ -f "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/reset_netdata_trace.sh" ]; then
1147 - echo >&2 "Removing old reset_netdata_trace.sh."
1148 - rm -f "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/reset_netdata_trace.sh"
1149 - fi
1150 -}
1151 -
1152 -install_ebpf() {
1153 - if ! should_install_ebpf; then
1154 - return 0
1155 - fi
1156 -
1157 - [ -n "${GITHUB_ACTIONS}" ] && echo "::group::Installing eBPF code."
1158 -
1159 - remove_old_ebpf
1160 -
1161 - progress "Installing eBPF programs"
1162 -
1163 - # Detect libc
1164 - libc="$(detect_libc)"
1165 -
1166 - EBPF_VERSION="$(cat packaging/ebpf.version)"
1167 - EBPF_TARBALL="netdata-kernel-collector-${libc}-${EBPF_VERSION}.tar.xz"
1168 -
1169 - tmp="$(mktemp -d -t netdata-ebpf-XXXXXX)"
1170 -
1171 - if ! fetch_and_verify "ebpf" \
1172 - "https://github.com/netdata/kernel-collector/releases/download/${EBPF_VERSION}/${EBPF_TARBALL}" \
1173 - "${EBPF_TARBALL}" \
1174 - "${tmp}" \
1175 - "${NETDATA_LOCAL_TARBALL_OVERRIDE_EBPF}"; then
1176 - run_failed "Failed to download eBPF collector package"
1177 - echo 2>&" Removing temporary directory ${tmp} ..."
1178 - rm -rf "${tmp}"
1179 -
1180 - [ -n "${GITHUB_ACTIONS}" ] && echo "::endgroup::"
1181 - return 1
1182 - fi
1183 -
1184 - echo >&2 " Extracting ${EBPF_TARBALL} ..."
1185 - tar --no-same-owner -xf "${tmp}/${EBPF_TARBALL}" -C "${tmp}"
1186 -
1187 - # chown everything to root:netdata before we start copying out of our package
1188 - run chown -R root:netdata "${tmp}"
1189 -
1190 - if [ ! -d "${NETDATA_PREFIX}"/usr/libexec/netdata/plugins.d/ebpf.d ]; then
1191 - mkdir "${NETDATA_PREFIX}"/usr/libexec/netdata/plugins.d/ebpf.d
1192 - RET=$?
1193 - if [ "${RET}" != "0" ]; then
1194 - rm -rf "${tmp}"
1195 -
1196 - [ -n "${GITHUB_ACTIONS}" ] && echo "::endgroup::"
1197 - return 1
1198 - fi
1199 - fi
1200 -
1201 - run cp -a -v "${tmp}"/*netdata_ebpf_*.o "${NETDATA_PREFIX}"/usr/libexec/netdata/plugins.d/ebpf.d
1202 -
1203 - rm -rf "${tmp}"
1204 -
1205 - [ -n "${GITHUB_ACTIONS}" ] && echo "::endgroup::"
1206 -}
1207 -
1208 -progress "eBPF Kernel Collector"
1209 -install_ebpf
1210 -
1083 should_install_fluentbit() {
1084 if [ "$(uname -s)" = "Darwin" ]; then
1085 return 1
netdata.spec.in
-5
@@ -433,11 +433,6 @@ install -m 644 -p "%{__cmake_builddir}/system/systemd/%{name}.service.v235" "${R
433 install -m 755 -d "${RPM_BUILD_ROOT}%{_presetdir}"
434 install -m 644 -p "system/systemd/50-%{name}.preset" "${RPM_BUILD_ROOT}%{_presetdir}/50-%{name}.preset"
435
436 -%if 0%{?_have_ebpf}
437 -${RPM_BUILD_DIR}/%{name}-%{version}/packaging/bundle-ebpf.sh ${RPM_BUILD_DIR}/%{name}-%{version} \
438 -${RPM_BUILD_ROOT}%{_libexecdir}/%{name}/plugins.d
439 -%endif
440 -
436 %pre
437
438 if ! getent group %{name} > /dev/null; then
packaging/bundle-ebpf.sh deleted
-20
@@ -1,20 +0,0 @@
1 -#!/bin/sh
2 -
3 -SRCDIR="${1}"
4 -PLUGINDIR="${2}"
5 -FORCE="${3}"
6 -
7 -EBPF_VERSION="$(cat "${SRCDIR}/packaging/ebpf.version")"
8 -EBPF_TARBALL="netdata-kernel-collector-glibc-${EBPF_VERSION}.tar.xz"
9 -
10 -if [ -x "${PLUGINDIR}/ebpf.plugin" ] || [ "${FORCE}" = "force" ]; then
11 - mkdir -p "${SRCDIR}/tmp/ebpf"
12 - curl -sSL --connect-timeout 10 --retry 3 "https://github.com/netdata/kernel-collector/releases/download/${EBPF_VERSION}/${EBPF_TARBALL}" > "${EBPF_TARBALL}" || exit 1
13 - grep "${EBPF_TARBALL}" "${SRCDIR}/packaging/ebpf.checksums" | sha256sum -c - || exit 1
14 - tar -xva --no-same-owner -f "${EBPF_TARBALL}" -C "${SRCDIR}/tmp/ebpf" || exit 1
15 - if [ ! -d "${PLUGINDIR}/ebpf.d" ];then
16 - mkdir "${PLUGINDIR}/ebpf.d"
17 - fi
18 - # shellcheck disable=SC2046
19 - cp -r $(find "${SRCDIR}/tmp/ebpf" -mindepth 1 -maxdepth 1) "${PLUGINDIR}/ebpf.d"
20 -fi
packaging/cmake/Modules/NetdataEBPFLegacy.cmake new
+39
@@ -0,0 +1,39 @@
1 +# Handling for eBPF legacy programs
2 +#
3 +# Copyright (c) 2024 Netdata Inc.
4 +# SPDX-License-Identifier: GPL-3.0-or-later
5 +
6 +include(ExternalProject)
7 +include(NetdataUtil)
8 +
9 +set(ebpf-legacy_SOURCE_DIR "${CMAKE_BINARY_DIR}/ebpf-legacy")
10 +set(ebpf-legacy_BUILD_DIR "${CMAKE_BINARY_DIR}/ebpf-legacy-build")
11 +
12 +# Fetch the legacy eBPF code.
13 +function(netdata_fetch_legacy_ebpf_code)
14 + netdata_identify_libc(_libc)
15 +
16 + if(_libc STREQUAL "glibc")
17 + set(_hash 7013753ef85c2d3681bdcfdd7544705cdaf5b640b70734ca223f43cc5adcdc53)
18 + elseif(_libc STREQUAL "musl")
19 + set(_hash b524d1fcbd67c82cdfc9f46d55f67c0c0c0412c3356c85b38c03ce03f6068747)
20 + else()
21 + message(FATAL_ERROR "Could not determine libc implementation, unable to install eBPF legacy code.")
22 + endif()
23 +
24 + ExternalProject_Add(
25 + ebpf-code-legacy
26 + URL https://github.com/netdata/kernel-collector/releases/download/v1.4.0/netdata-kernel-collector-${_libc}-v1.4.0.tar.xz
27 + URL_HASH SHA256=${_hash}
28 + SOURCE_DIR "${ebpf-legacy_SOURCE_DIR}"
29 + CONFIGURE_COMMAND ""
30 + 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"
31 + INSTALL_COMMAND ""
32 + )
33 +endfunction()
34 +
35 +function(netdata_install_legacy_ebpf_code)
36 + install(DIRECTORY ${ebpf-legacy_BUILD_DIR}/ebpf.d
37 + DESTINATION usr/libexec/netdata/plugins.d
38 + COMPONENT ebpf-code-legacy)
39 +endfunction()
packaging/cmake/Modules/NetdataLibBPF.cmake
-31
@@ -8,37 +8,6 @@ include(NetdataUtil)
8
9 set(libbpf_SOURCE_DIR "${CMAKE_BINARY_DIR}/libbpf")
10
11 -# Check what libc we're using.
12 -#
13 -# Sets the specified variable to the name of the libc or "unknown"
14 -function(netdata_identify_libc _libc_name)
15 - message(INFO "Detecting libc implementation")
16 -
17 - execute_process(COMMAND ldd --version
18 - COMMAND grep -q -i -E "glibc|gnu libc"
19 - RESULT_VARIABLE LDD_IS_GLIBC
20 - OUTPUT_VARIABLE LDD_OUTPUT
21 - ERROR_VARIABLE LDD_OUTPUT)
22 -
23 - if(LDD_IS_GLIBC)
24 - set(${_libc_name} glibc PARENT_SCOPE)
25 - return()
26 - endif()
27 -
28 - execute_process(COMMAND ldd --version
29 - COMMAND grep -q -i -E "musl"
30 - RESULT_VARIABLE LDD_IS_MUSL
31 - OUTPUT_VARIABLE LDD_OUTPUT
32 - ERROR_VARIABLE LDD_OUTPUT)
33 -
34 - if(LDD_IS_MUSL)
35 - set(${_libc_name} musl PARENT_SCOPE)
36 - return()
37 - endif()
38 -
39 - set(${_libc_name} unknown PARENT_SCOPE)
40 -endfunction()
41 -
11 # Check if the kernel is old enough that we need to use a legacy copy of eBPF.
12 function(_need_legacy_libbpf _var)
13 if(FORCE_LEGACY_LIBBPF)
packaging/cmake/Modules/NetdataUtil.cmake
+38
@@ -30,3 +30,41 @@ function(netdata_detect_host_kernel_version)
30 message(CHECK_PASS "${_kversion}")
31 set(HOST_KERNEL_VERSION "${_kversion}" CACHE STRING "Detected host kernel version")
32 endfunction()
33 +
34 +# Check what libc we're using.
35 +#
36 +# Sets the specified variable to the name of the libc or "unknown"
37 +function(netdata_identify_libc _libc_name)
38 + if(NOT DEFINED _ND_DETECTED_LIBC)
39 + message(INFO "Detecting libc implementation")
40 +
41 + execute_process(COMMAND ldd --version
42 + COMMAND grep -q -i -E "glibc|gnu libc"
43 + RESULT_VARIABLE LDD_IS_GLIBC
44 + OUTPUT_VARIABLE LDD_OUTPUT
45 + ERROR_VARIABLE LDD_OUTPUT)
46 +
47 + if(LDD_IS_GLIBC)
48 + set(${_libc_name} glibc PARENT_SCOPE)
49 + set(_ND_DETECTED_LIBC glibc CACHE INTERNAL "")
50 + return()
51 + endif()
52 +
53 + execute_process(COMMAND ldd --version
54 + COMMAND grep -q -i -E "musl"
55 + RESULT_VARIABLE LDD_IS_MUSL
56 + OUTPUT_VARIABLE LDD_OUTPUT
57 + ERROR_VARIABLE LDD_OUTPUT)
58 +
59 + if(LDD_IS_MUSL)
60 + set(${_libc_name} musl PARENT_SCOPE)
61 + set(_ND_DETECTED_LIBC musl CACHE INTERNAL "")
62 + return()
63 + endif()
64 +
65 + set(${_libc_name} unknown PARENT_SCOPE)
66 + set(_ND_DETECTED_LIBC unknown CACHE INTERNAL "")
67 + else()
68 + set(${_libc_name} ${_ND_DETECTED_LIBC} PARENT_SCOPE)
69 + endif()
70 +endfunction()
packaging/ebpf.checksums deleted
-3
@@ -1,3 +0,0 @@
1 -7013753ef85c2d3681bdcfdd7544705cdaf5b640b70734ca223f43cc5adcdc53 ./netdata-kernel-collector-glibc-v1.4.0.tar.xz
2 -b524d1fcbd67c82cdfc9f46d55f67c0c0c0412c3356c85b38c03ce03f6068747 ./netdata-kernel-collector-musl-v1.4.0.tar.xz
3 -302714979470e300b81a64a4ebef9fac1f3488488482cf30c926fa98f73cabc1 ./netdata-kernel-collector-static-v1.4.0.tar.xz
packaging/ebpf.version deleted
-1
@@ -1 +0,0 @@
1 -v1.4.0