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