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

文摘   2024-11-13 09:45   中国香港  

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

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

背景

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

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

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

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

进展

OTLP Profile 类型

继  traces[2]metrics[3]logs[4] 和 baggage[5] 之后,在 OTLP 1.3[6] 中加入了新的数据类型 profiles。原定的兼容 Google PPROF[7] 的目标被放弃。

eBPF 代理的提升

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

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

收集器支持 Profile 数据

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

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

快速体验

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

  • amd64/x86_64 4.19
  • arm64/aarch64 5.5

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

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

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

Linux 主机上的代理需要访问 macOS 上的 devfiler 上报数据,如果二者在同一网络中可以直接访问。这里我用的云主机,用了 ZTM 隧道[13] 打通了网络,因此下面你会看到 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[14],需要提供 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 应用的调用栈。

参考资料
[1] 

性能分析信号(Profiling Signal): https://github.com/open-telemetry/opentelemetry-proto/pull/534

[2] 

traces: https://opentelemetry.io/docs/concepts/signals/traces

[3] 

metrics: https://opentelemetry.io/docs/concepts/signals/metrics

[4] 

logs: https://opentelemetry.io/docs/concepts/signals/logs

[5] 

baggage: https://opentelemetry.io/docs/concepts/signals/baggage

[6] 

OTLP 1.3: https://github.com/open-telemetry/opentelemetry-proto/releases/tag/v1.3.0

[7] 

Google PPROF: https://github.com/google/pprof

[8] 

性能分析代理: https://www.elastic.co/observability/universal-profiling

[9] 

opentelemetry-ebpf-profiler: https://github.com/open-telemetry/opentelemetry-ebpf-profiler

[10] 

v0.112.0: https://github.com/open-telemetry/opentelemetry-collector/releases/tag/v0.112.0

[11] 

跟踪: https://github.com/open-telemetry/opentelemetry-ebpf-profiler/issues/170

[12] 

devfiler: https://upload.elastic.co/d/87e7697991940ec37f0c6e39ac38d213f65e8dc1ef9dbedff6aab9cba0adfaba

[13] 

ZTM 隧道: https://github.com/flomesh-io/ztm

[14] 

devfiler: https://upload.elastic.co/d/87e7697991940ec37f0c6e39ac38d213f65e8dc1ef9dbedff6aab9cba0adfaba


文章转载自云原生指北点击这里阅读原文了解更多

CNCF概况(幻灯片)

扫描二维码联系我们!




CNCF (Cloud Native Computing Foundation)成立于2015年12月,隶属于Linux  Foundation,是非营利性组织。 

CNCF云原生计算基金会)致力于培育和维护一个厂商中立的开源生态系统,来推广云原生技术。我们通过将最前沿的模式民主化,让这些创新为大众所用。请关注CNCF微信公众号。

CNCF
云原生计算基金会(CNCF)致力于培育和维护一个厂商中立的开源生态系统,来推广云原生技术。我们通过将最前沿的模式民主化,让这些创新为大众所用。
 最新文章