Grafana Beyla
eBPF 应用自动化 instrumentation
对应用程序进行 instrumentation 以获取指标和追踪数据通常需要在应用程序部署/包中添加语言 Agent。在某些编译型语言(如 Go 或 Rust)中,您必须手动向代码添加 tracepoints。
Grafana Beyla 是一个基于 eBPF 的应用自动化 instrumentation 工具,可帮助您轻松开始应用可观测性。Beyla 使用 eBPF 自动检查应用程序可执行文件和操作系统网络层,并捕获与 Web 事务和 Linux HTTP/S 及 gRPC 服务的 Rate Errors Duration (RED) 指标相关的追踪 span。所有数据捕获均无需修改应用程序代码或配置即可完成。
Beyla 提供以下功能:
- 自动 instrumentation 用各种编程语言编写的应用程序,例如:Go、C/C++、Rust、Python、Ruby、Java(包括 GraalVM Native)、NodeJS、.NET 等
- 高效的 instrumentation 和低开销的数据捕获,即使对于解释型语言,也可使用本地编译代码实现
- 供应商无关的数据导出,支持 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 Type Format (BTF)。内核 5.14 或更高版本的大多数 Linux 发行版默认启用了 BTF。您可以通过检查系统上是否存在
/sys/kernel/btf/vmlinux
来验证您的内核是否启用了 BTF。如果需要重新编译内核以启用 BTF,必须设置配置选项CONFIG_DEBUG_INFO_BTF=y
。 - Beyla 还支持基于 RedHat 的发行版:RHEL8、CentOS 8、Rocky8、AlmaLinux8 等,这些发行版提供了回溯移植了 eBPF 相关补丁的内核 4.18。
- 主机上启用 eBPF。
- 对于 Go 程序的 instrumentation,请使用 Go 1.17 或更高版本进行编译。Beyla 支持使用主要 Go 版本构建的 Go 应用程序,该版本不得早于当前稳定主要版本的 3 个版本。
- 执行 Beyla 需要管理员访问权限。
局限性
Beyla 也有其局限性。它只提供通用指标和事务级别的追踪 span 信息。仍然建议使用语言 agent 和手动 instrumentation,以便您可以指定要进行 instrumentation 的代码每个部分的粒度,并将重点放在关键操作上。
虽然大多数 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 所需权限的完整列表,请参阅安全性、权限和能力。
入门
按照设置文档,开始使用 Docker 或 Kubernetes 设置 Beyla。
按照语言快速入门指南,获取有关如何设置 Beyla 来 instrumentation 特定语言编写的应用程序的快速说明。