菜单
文档导航箭头 Beyla
Grafana Cloud

Grafana Beyla

Grafana Beyla Logo

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规范提供的一系列良好定义的通信机制共享信息。例如:环形缓冲区、数组、哈希表等。

Beyla eBPF architecture

要求

  • 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_SEARCHCAP_SYS_PTRACECAP_PERFMONCAP_BPFCAP_CHECKPOINT_RESTORECAP_NET_RAW

一些Beyla功能需要进一步权限,例如使用Linux流量控制进行网络可观察性探针需要CAP_NET_ADMIN,但这是一个可选功能。

CAP_SYS_ADMIN仅用于在多个节点之间启用Go的上下文传播,然而如果没有获得此权限,Beyla将优雅地降级其功能,仅支持部分跟踪。

仅支持Go服务的分布式跟踪,而其他编程语言的支持仍在路线图上。其他编程语言的分布式跟踪在同一节点上工作,但不跨不同节点。

开始使用

  • 按照设置文档,使用Docker或Kubernetes开始使用Beyla。

  • 按照语言快速入门指南获取有关如何为特定语言编写的应用程序设置Beyla的快速说明。

了解更多关于Grafana Beyla的信息