云原生分布式追踪

白日放歌须纵酒,青春作伴好还乡。这篇文章主要讲述云原生分布式追踪相关的知识,希望能为你提供帮助。
分布式追踪是实现应用链路追踪的一种重要技术手段,同时也是实现云原生可观测性的重要组成部分,其主要用于应用程序性能管理(APM,ApplicationPerformance Management)和故障定位等。常见的分布式追踪工具包括 Dapper、Zipkin、Jaeger、SkyWalking、Canopy、鹰眼、Hydra、Pinpoint 等,其中常用的开源分布式追踪工具为 Zipkin、Jaeger、SkyWalking 和 Pinpoint。这些分布式追踪工具大致可分为以下三类。
1)基于 SDK 的分布式追踪工具。以 Jaeger 为例,Jaeger 提供了大量可供追踪使用的 API,通过侵入微服务业务的软件系统,在系统源代码中添加追踪模块以实现分布式追踪。此类工具可以最大限度地抓取业务系统中的有效数据,提供了足够多的可参考指标;但其通用性较差,需要针对每个服务进行重新实现,部署成本较高,工作量较大。
2)基于探针的分布式追踪工具。以 SkyWalking java 探针为例,在使用 SkyWalking Java 探针时,需将探针文件打包到容器镜像中,并在镜像启动程序中添加-javaagent agent.jar 命令以实现探针的启动,并完成 SkyWalking 在微服务业务上的部署。SkyWalking 的 Java 探针实现原理为字节码注入,将需要注入的类文件转换成 byte 数组,通过设置好的拦截器注入到正在运行的程序中。这种探针通过控制 JVM 中类加载器的行为,侵入运行时环境以实现分布式追踪。此类工具无须修改业务系统的源代码,相对 SDK 有更好的通用性,但其可获取的有效数据相对 SDK 类工具较少。
3)基于代理实现。Sidecar 作为服务代理,为其所管理的容器实现服务发现、流量管理、负载均衡和路由等功能。在流量管理过程中,Sidecar 可以抓取进出容器的网络请求与响应数据,这些数据可以记录该服务所完成的一次单个操作,可与追踪中的跨度信息对应,因此可将 Sidecar 视为一种基于数据收集的分布式追踪工具。Sidecar 无须修改业务系统代码,也不会引入额外的系统的开销。但由于 Sidecar 所抓取的跨度不包含追踪链路上下文,要将 Sidecar 所抓取的跨度数据串联成追踪链路是很困难的。
若要对一个微服务业务系统进行分布式追踪,会产生两个基本问题。第一,业务系统运行时可能会产生很多脏数据或发生数据丢失,需要在这种环境下准确地生成追踪数据。第二,面对成百上千的服务所生成的追踪数据,需要设计合适的收集与存储方案。追踪链路是以跨度为根节点的树形数据结构,在微服务中,从客户端发起一次 API 调用,往往后面会产生多次服务间的 API 调用,因此追踪链路代表一次完整操作,其中包含了很多子操作。
【云原生分布式追踪】虽然分布式追踪技术在应用方面已经取得了一些进展,但其仍然存在着一定的局限性。当前的分布式追踪工具或者需要侵入微服务软件系统的源代码,或者需要侵入业务系统的镜像与运行环境,或者在生成的跨度信息与追踪链路的准确性与完整性上仍有缺失。

    推荐阅读