Grafana Beyla
eBPF 应用自动代码注入
为应用进行代码注入以获取指标和跟踪,通常需要在应用部署/软件包中添加语言代理。在某些编译型语言(如 Go 或 Rust)中,您必须手动在代码中添加跟踪点。
Grafana Beyla 是一个基于 eBPF 的应用自动代码注入工具,可让您轻松开始应用可观测性。Beyla 使用 eBPF 自动检查应用程序可执行文件和操作系统网络层,并捕获与 Web 事务相关的跟踪跨度,以及适用于 Linux HTTP/S 和 gRPC 服务的 Rate Errors Duration (RED) 指标。所有数据捕获均在不修改应用代码或配置的情况下进行。
Beyla 提供以下功能
- 自动代码注入各种编程语言编写的应用,例如:Go、C/C++、Rust、Python、Ruby、Java(包括 GraalVM Native)、NodeJS、.NET 等
- 高效的代码注入和低开销数据捕获,即使对于解释型语言也能通过原生编译代码实现
- 供应商无关的数据导出,支持 OpenTelemetry 格式和原生 Prometheus 指标
- Go 服务的分布式跟踪
- 可在任何 Linux 环境中运行
- 监听 Kubernetes API,用 Pod 和 Service 元数据装饰指标和跟踪
- 对于已使用 Grafana Alloy 的 Grafana 客户来说,设置简单
eBPF 概述
eBPF 允许您将应用程序附加到 Linux 内核的不同点。eBPF 应用程序在特权模式下运行,并允许您指定 Linux 内核的运行时信息:系统调用、网络栈,以及在用户空间应用程序中插入探针。
eBPF 应用程序是安全的,它们针对自己的虚拟机指令集进行编译,并在沙箱环境中运行,该环境会验证每个加载的 eBPF 程序是否存在内存访问安全问题以及是否具有有限的执行时间。与以前的技术(例如原生编译的内核模块)不同,编写不良的探针不会导致 Linux 内核挂起。
eBPF 二进制文件会经过验证,并使用即时 (JIT) 编译器针对原生主机架构(如 x86-64 或 ARM64)进行编译,以实现高效快速的执行。
eBPF 代码从运行在用户空间的普通应用程序加载。内核和用户空间应用程序可以通过 eBPF 规范提供的一系列定义明确的通信机制共享信息。例如:环形缓冲区、数组、哈希表等。
要求
- Linux 内核 5.8 或更高版本,且启用 BPF 类型格式 (BTF)。BTF 在内核 5.14 或更高版本的大多数 Linux 发行版中默认启用。您可以通过检查系统上是否存在
/sys/kernel/btf/vmlinux
来验证您的内核是否启用了 BTF。如果需要重新编译内核以启用 BTF,必须设置配置选项CONFIG_DEBUG_INFO_BTF=y
。 - Beyla 还支持基于 RedHat 的发行版:RHEL8、CentOS 8、Rocky8、AlmaLinux8 等,这些发行版附带了回port 了 eBPF 相关补丁的 Kernel 4.18。
- 主机中已启用 eBPF。
- 对于 Go 程序的代码注入,请使用 Go 1.17 或更高版本进行编译。Beyla 支持主要版本不低于当前稳定主要版本之前 3 个版本构建的 Go 应用。
- 执行 Beyla 的管理访问权限。
限制
Beyla 也有其局限性。它仅提供通用指标和事务级别的跟踪跨度信息。仍然推荐使用语言代理和手动代码注入,以便您可以指定要注入代码的每个部分的粒度,将重点放在您的关键操作上。
虽然大多数 eBPF 程序需要提升的权限,但 Beyla 允许您指定更精细的权限,以最低所需权限运行,例如:CAP_DAC_READ_SEARCH
、CAP_SYS_PTRACE
、CAP_PERFMON
、CAP_BPF
、CAP_CHECKPOINT_RESTORE
和 CAP_NET_RAW
。
Beyla 的某些功能需要更多权限,例如,将网络可观测性探针与 Linux Traffic Control 一起使用需要 CAP_NET_ADMIN
,但这只是一个您可以选择启用的功能。
有关 Beyla 所需功能的完整列表,请参阅安全、权限和功能。