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和服务的元数据
- 为已使用Grafana Alloy的Grafana客户简化设置
eBPF概述
eBPF允许您将应用程序附加到Linux内核的不同位置。eBPF应用程序以特权模式运行,并允许您指定Linux内核的运行时信息:系统调用、网络栈以及向用户空间应用程序中插入探针。
eBPF应用程序是安全的,并为其自己的虚拟机指令集编译,并在一个沙箱环境中运行,该环境验证每个加载的eBPF程序对内存访问安全性和有限执行时间的正确性。与之前的技术,如原生编译的内核模块不同,一个编程不良的探针无法导致Linux内核挂起。
eBPF二进制文件使用即时(JIT)编译器进行验证和编译,以实现原生主机架构(如x86-64或ARM64)的效率和快速执行。
eBPF代码从运行在用户空间的普通应用程序加载。内核和用户空间应用程序可以通过eBPF规范提供的一系列良好定义的通信机制共享信息。例如:环形缓冲区、数组、哈希表等。
要求
- Linux内核5.8或更高版本,并启用BPF类型格式(BTF)。BTF在大多数Linux发行版中默认启用,从内核5.14或更高版本开始。您可以通过检查系统上是否存在
/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应用程序。
- 拥有执行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将优雅地降级其功能,仅支持部分跟踪。
仅支持Go服务的分布式跟踪,而其他编程语言的支持仍在路线图上。其他编程语言的分布式跟踪在同一节点上工作,但不跨不同节点。