菜单
文档breadcrumb arrow Beyla
Grafana Cloud

Grafana Beyla

Grafana Beyla Logo

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

Beyla eBPF architecture

要求

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

Beyla 的某些功能需要更多权限,例如,将网络可观测性探针与 Linux Traffic Control 一起使用需要 CAP_NET_ADMIN,但这只是一个您可以选择启用的功能。

有关 Beyla 所需功能的完整列表,请参阅安全、权限和功能

入门

  • 请参阅设置文档,以开始使用 Docker 或 Kubernetes 设置 Beyla。

  • 请参阅语言快速入门指南,了解如何设置 Beyla 来对特定语言编写的应用进行代码注入的快速说明。

了解更多关于 Grafana Beyla 的信息