探索 OpenTelemetry Profiling 进展:eBPF 代理快速上手

探索 OpenTelemetry Profiling 进展:eBPF 代理快速上手

本文将介绍 OpenTelemetry Profiling 的进展,以及快速体验 Profiling 的 eBPF 代理。关于有 OTEL Profile 的概念和实现,将在下一篇介绍。

虽然 Profiling 进展迅速,Profile 功能仍然在实验阶段,不建议在生产环境使用。

背景

在软件工程中,可观测性(Observability)是指收集和分析程序执行情况、模块内部状态以及组件间通信数据的能力。可观测性的三大支柱——指标、跟踪和日志——为我们提供了深入了解应用程序行为的关键手段,尤其在分布式系统中尤为重要。

分布式系统的应用组件分布在多个节点上,导致事件链条和数据流的复杂化。通过有效运用这三大可观测性手段,可以帮助我们识别潜在问题、定位故障源,从而显著提高系统的稳定性和可维护性。

尽管可观测性的三大手段能够提供大量关于系统行为和性能的洞察,但无法探究程序内部代码函数层级的运行时表现。性能分析(Profiling)为深入了解应用程序的资源使用和执行效率提供了方法指导。持续性能分析(Continuous profiling)可以在应用程序运行期间连续进行性能剖析,帮助开发人员准确理解代码随着时间推移的运行情况。

今年 3 月,成立两年的 OpenTelemetry Profiling SIG 宣布支持 性能分析信号(Profiling Signal),半年多过去了,从规范到工具层面 Profiling 的支持取得了很大的进展。

进展

OTLP Profile 类型

继  tracesmetricslogs 和 baggage 之后,在 OTLP 1.3 中加入了新的数据类型 profiles。原定的兼容 Google PPROF 的目标被放弃。

eBPF 代理的提升

在 6 月份,Elastic 向 OpenTelemetry 社区捐赠了自家的 性能分析代理,然后就有了 opentelemetry-ebpf-profiler 项目。

eBPF 代理的最终目标 是作为收集接收器运行在每个节点上,收集主机的性能分析数据然后通过 OTLP 转发。

收集器支持 Profile 数据

v0.112.0 起,OpenTelemetry Collector 能够接收、处理和导出分析数据,并支持使用 OTLP 提取和导出分析数据。当前,还需要通过 service.profilesSupport 来开启。

接下来,我们快速体验一下 Profiling 的 eBPF 代理(eBPF agent)。

快速体验

eBPF 代理对操作系统内核有一定要求,不同的平台最低内核版本不同:

  • amd64/x86_64 4.19
  • arm64/aarch64 5.5

本文的实验环境是 macOS + Linux 云主机,在 M1 的虚拟机上还无法获取内核之外的数据,可以 跟踪 未来官方是有解决方案。

在 Linux 主机上,我们用于构建和运行 eBPF 代理。代理的构建需要 Docker 环境,官方提供了 Docker 镜像方便构建。

在 macOS 上我们将运行 Elastic 提供的 devfiler,可以可视化查看采集的数据。devfilter 支持 x86/arm65 的 macOS 和 Linux。在开发环境下,devfiler 可以作为 profiling 的数据接收器,启动后监听在 0.0.0.0:11000

Linux 主机上的代理需要访问 macOS 上的 devfiler 上报数据,如果二者在同一网络中可以直接访问。这里我用的云主机,用了 ZTM 隧道 打通了网络,因此下面你会看到 agent 启动时我配置的地址时 127.0.0.1:11000。网络的打通可以参考我 使用 ZTM 增强极空间 NAS 的远程访问能力 中的方案。

让我们开始吧!

编译构建

克隆代码并使用 make 进行编译,编译成功在目录中可以找到可执行文件 ebpf-profiler

git https://github.com/open-telemetry/opentelemetry-ebpf-profiler.git
cd opentelemetry-ebpf-profiler
make docker-image
make agent

eBPF agent 目前还没发布版本,版本号还是 v0.0.0 🤣 。

./ebpf-profiler --version
v0.0.0

启动 devfiler

从 Elastic 官方下载 devfiler,需要提供 Authentication token c74dfc4db2212015

macOS 应用程序未使用 Apple 开发者证书正确签名,下载解压后执行下面的命令。

xattr -d com.apple.quarantine ~/Downloads/devfiler-apple-silicon.app.zip

启动后没有数据进来,不会显示任何内容。

启动代理

在 Linux 主机上执行下面的命令,通过 collection-agent 参数配置 devfiler 的访问地址。

sudo ./ebpf-profiler -collection-agent=127.0.0.1:11000 -disable-tls

这里我还是用 Docker 运行了一个 Java 应用,模拟应用的运行。

docker run --rm addozhang/spring-boot-rest:latest

查看数据

如果 eBPF 代理和网络没有问题,这时在 devfiler 中可以看到类似的数据。比如下面的火焰图展示了 Java 应用的调用栈。

(转载本站文章请注明作者和出处乱世浮生,请勿用于任何商业用途)

comments powered by Disqus