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