统包式分布式追踪
Zipkin UI是我们在Jaeger中使用的最后一个第三方软件。由于要将Span以Zipkin Thrift格式存储在Cassandra中并与UI兼容,这对我们的后端和数据模型产生了一定的限制。尤其是Zipkin模型不支持OpenTracing标准和我们的客户端库中两个非常重要的功能:键-值日志API,以及用更为通用的有向无环图(Directed acyclic graph)而非Span树所代表的追踪。因此我们毅然决定彻底革新后端所用的数据模型,并编写新的UI。如下图所示,新的数据模型可原生支持键-值日志和Span的引用,此外还对发送到进程外的数据量进行了优化,避免进程标签在每个Span上重复:Jaeger数据模型可原生支持键-值日志和Span引用。
目前我们正在将后端管道全面升级到新的数据模型,以及全新的,更为优化的Cassandra架构。为了充分利用新的数据模型,我们还用Go语言实现了一个全新的Jaeger查询服务,并用React实现了一套全新的Web UI。最初版本的UI主要重现了Zipkin UI的原有功能,但在设计上更易于通过扩展提供新的功能和组件,并能作为React组件嵌入到其他UI。例如,用户可以选择用多种不同视图对追踪结果进行可视化,例如追踪时段内的直方图,或服务在追踪过程中的累积时间:
Jaeger UI显示的追踪信息搜索结果。右上角显示的时刻和持续时间散点图用可视化方式呈现了结果,并提供了向下挖掘能力。
另一个例子,可以根据不同用例查看同一条追踪记录。除了使用默认的时序渲染方式,还可以通过其他视图渲染为有向无环图或关键路径图:
Jaeger UI显示了一条追踪记录的详情。界面顶部是一条追踪记录的迷你地图示意图,借此可在更大规模的追踪记录中进行更轻松的导航。
通过将架构中剩余的Zipkin组件替代为Jaeger自己的组件,我们将Jaeger彻底变为一种统包式的端到端分布式追踪系统。
我们认为编排库是Jaeger固有的一部分,这样可以确保与Jaeger后端的兼容性,以及通过持续集成测试保障相互之间的互操作性。(Zipkin生态系统做不到这些。)尤其是跨越所有可支持语言(目前支持Go、Java、Python和Node.js)和可支持的传输方式(目前支持HTTP和TChannel)实现的互操作性会在每个Pull请求中测试,并用到了Uber工程部门RPC团队所开发的Crossdock框架。Jaeger客户端集成测试的详细信息请参阅jaeger-client-go crossdock代码库。目前所有Jaeger客户端库都已开源:
• Go
• Java
• Node.js
• Python
我们正在将后端和UI代码迁移至GitHub,并计划尽快将Jaeger的源代码全部公开。如果你对这个过程感兴趣,可以关注主代码库。我们欢迎大家为此做贡献,也很乐于看到更多人尝试使用Jaeger。虽然我们对目前的进展很满意,但Uber的分布式追踪工作还有很长的路要走。