使用 Jaeger 在 Ceph 中进行分布式追踪

像 Ceph 这样的分布式系统由于没有单一故障点,因此调试起来可能是一场噩梦。为了解决这个问题,我们一直在致力于添加标准的分布式追踪解决方案 Jaeger 到 Ceph。Jaeger 是一个分布式追踪开源库,也是 CNCF 下的一个项目。Jaeger 将提供更多关于 Ceph 分布式后台进程的可视性,并帮助用户识别异常,从而“使 Ceph 更加透明”。
这篇博客提供了一个学习如何使用追踪来调试 Ceph 的机会 - 非常适合那些希望识别性能瓶颈、延迟优化和分布式事务中异常的人。
我们很高兴地宣布在 Ceph 的 Pacific 版本中对 Jaeger 的初步支持!
它是如何工作的?
Jaeger(追踪后端)以及 Opentracing(API)为分布式系统提供现成的追踪服务,并且由于其简单性而正在成为一种广泛使用的事实标准。
Jaeger 负责收集 spans。这些 spans 是使用智能指针创建的。它们包括时间戳、TraceID 和其他元信息,例如与 span 关联的特定标签/日志,以便在整个分布式系统中唯一标识。然后将它们关联起来生成请求生命周期的可视化(trace)。

credits: jaeger documentation
让我们尝试一下! ¶
让我们看一下追踪 Ceph 输入/输出事务中涉及的核心函数。如果您已经设置了用于与 Ceph 配合使用的 jaeger 后端,请跳过下一节。
有关如何设置它的信息,请参阅文档:https://docs.ceph.net.cn/en/latest/dev/developer_guide/jaegertracing/
部署 Jaeger 服务 ¶
我们将使用 vstart 来开始追踪。
为此,请确保您已
- 使用
WITH_JAEGER=ON编译 Ceph。 - 部署了 jaeger 后端服务 - 要使用 vstart 开发集群部署 Jaeger 后端服务,您只需要传递
--jaeger选项。
$ ../src/vstart.sh --jaeger
通过执行上述步骤,您应该能够设置所有 Jaeger 服务,并在 https://:16686 处访问 JaegerUI。
更多信息:https://jaeger.golang.ac.cn/docs/1.20/getting-started/#all-in-one

(JaegerUI 在 https://:16686)
如果由于某种原因您无法访问 JaegerUI,请尝试手动运行 Jaeger 服务使用
$ docker run -d --name jaeger \
-e COLLECTOR_ZIPKIN_HTTP_PORT=9411 \
-p 5775:5775/udp \
-p 6831:6831/udp \
-p 6832:6832/udp \
-p 5778:5778 \
-p 16686:16686 \
-p 14268:14268 \
-p 14250:14250 \
-p 9411:9411 \
jaegertracing/all-in-one:1.20
追踪核心服务 ¶
现在我们已经启动并运行了 Jaeger 服务,让我们看一下 Ceph 的核心服务追踪。
Ceph 当前可以追踪 OSD I/O 路径中的操作,我们将在演示这里
我们将执行一个简单的写入操作,为此我们使用 rados bench write。您可以使用任何其他可用的写入接口。
[ideepika@vossi03 build]$ bin/ceph osd pool create test; //create a pool
[ideepika@vossi03 build]$ bin/rados -p test bench 5 write --no-cleanup //perform a rados bench write for 5 sec
在刷新 JaegerUI (https://:16686) 时,您应该能够在 services 字段中看到 osd-services,它指定了请求生命周期中追踪的 OSD 进程。


紧接着是 Operations 字段,其中列出了收集到的 spans,单击它将显示包含它的 traces。

我们看到一个列表,其中包含我们最近的写入操作收集到的 traces,以及一个 x(时间)-y(持续时间)图,其中 traces 作为数据点。


当您单击任何 trace 时,它应该会展开到其中存储的所有 spans 和元数据中。

我们可以在创建 span 时以标签和日志的形式存储 Ceph 的元数据,如下所示;logs 字段携带 Ceph 的相关元数据。

这就是您可视化的内部流程!
将 Traces 导出为 JSON
这些 traces 是可移植的!它们可以转换为 JSON 输出,可以使用 JaegerUI 在其他系统上渲染。

演示
接下来会发生什么
这个项目仍在进行中,但是通过协调正确的实时 traces 信息,我们将拥有端到端追踪,这将使调试更容易,从而了解 Ceph 的内部结构!
我们期待改进 Ceph 的整体可观察性。
我们有一些任务排队以改进追踪支持,扩展对客户端(RGW、CephFS、RBD)的追踪支持,以及与 OSD traces 的集成,改进始终在线监控高级 traces 的部署策略。
如果这让您感到兴奋,我们欢迎以 PR 的形式进行贡献!
请随时通过 dev@ceph.io 或 OFTC 上的 #ceph-devel IRC 提出问题!