探索 OpenTelemetry Profiling 进展:eBPF 代理快速上手
本文将介绍 OpenTelemetry Profiling 的进展,以及快速体验 Profiling 的 eBPF 代理。关于有 OTEL Profile 的概念和实现,将在下一篇介绍。
虽然 Profiling 进展迅速,Profile 功能仍然在实验阶段,不建议在生产环境使用。
背景
在软件工程中,可观测性(Observability)是指收集和分析程序执行情况、模块内部状态以及组件间通信数据的能力。可观测性的三大支柱——指标、跟踪和日志——为我们提供了深入了解应用程序行为的关键手段,尤其在分布式系统中尤为重要。
分布式系统的应用组件分布在多个节点上,导致事件链条和数据流的复杂化。通过有效运用这三大可观测性手段,可以帮助我们识别潜在问题、定位故障源,从而显著提高系统的稳定性和可维护性。
尽管可观测性的三大手段能够提供大量关于系统行为和性能的洞察,但无法探究程序内部代码函数层级的运行时表现。性能分析(Profiling)为深入了解应用程序的资源使用和执行效率提供了方法指导。持续性能分析(Continuous profiling)可以在应用程序运行期间连续进行性能剖析,帮助开发人员准确理解代码随着时间推移的运行情况。
今年 3 月,成立两年的 OpenTelemetry Profiling SIG 宣布支持 性能分析信号(Profiling Signal),半年多过去了,从规范到工具层面 Profiling 的支持取得了很大的进展。
进展
OTLP Profile 类型
继 traces、metrics、logs 和 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 应用的调用栈。