链路追踪(Tracing)其实很简单——分布式链路追踪的挑战与限制

本文涉及的产品
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
简介: 作为一门新兴技术,分布式链路追踪的技术演进史并不算长,仅有十数年。目前,它仍处于不断被探索、快速迭代的周期。为了更好的了解与应用分布式链路追踪技术,我们来看下它目前面临的几项关键挑战与限制。
作者:夏明(涯海)
创作日期:2022-07-14
专栏地址: 【稳定大于一切】

作为一门新兴技术,分布式链路追踪的技术演进史并不算长,仅有十数年。目前,它仍处于不断被探索、快速迭代的周期。为了更好的了解与应用分布式链路追踪技术,我们来看下它目前面临的几项关键挑战与限制。

关键挑战与应对

分布式链路追踪技术从诞生到大规模应用,中间经历了一段较长的蛰伏期,直到近几年才逐渐被大家广泛接受和认可。影响其快速推广的关键挑战包括如下几点:

  • 前期建设成本高: 无论是在不同组件接口上进行插桩埋点,还是保证链路上下文能够正确传播,亦或是搭建一套稳定可靠的链路数据后端处理系统,都不是一件易事,需要投入大量的研发人力。
  • 数据处理成本高: 由于链路数据与请求流量成正比,每一次请求都会记录相应的链路日志,当系统流量爆炸式增长,相应的链路数据生成、采集、处理、存储、查询的成本也会急剧上升,带来巨大的 IT 资源开销。
  • 价值没有得到普遍认可: 基础的链路数据仅仅表达了接口间的调用依赖,没有释放足够的业务价值,难以得到领导和同事们的全力支持。
  • 链路标准不统一: 分布式链路追踪发展前期没有统一的业界标准,各家厂商百花齐放,虽然一定程度上促进 Tracing 技术的多元化探索,但也为链路融合、迁移和推广带来了巨大的挑战。

当然,挑战同样也是机遇,为了应对上述问题,分布式链路追踪近几年实现了如下技术突破:

  • 无侵入探针 + 一体化解决方案: 类似 JavaAgent 的探针插桩技术,实现了0代码入侵,0改造成本的链路自动埋点,而类似 SkyWalking 的开源实现还提供了端到端的一体化解决方案,从链路数据生成到最后的可视化,中小企业可以快速搭建并享受到分布式链路追踪技术的价值,大幅降低了 Tracing 的前期建设成本和接入门槛。
  • 链路采样 + 边缘计算: 链路采样策略,例如固定比例采样、限流采样、错慢全采、自定义标签采样等,可以大幅降低链路数据的传输、处理、存储成本;结合用户网络内的指标聚合,长文本编码/压缩等边缘计算技术,可以合理控制分布式链路追踪的数据成本,保障链路系统持续健康运转。
  • 关联分析 + 立体化可观测: 单条链路的价值难以凸显,但是基于成千上万条链路的聚合/关联分析却能快速定位,导致系统异常的关键因素,比如版本、地域、用户类型等。同时,结合业务、容器、基础设施等其他层面的可观测数据,建立一套端到端、立体化的可观测体系,能够更加有效地释放分布式链路追踪的技术价值。
  • 开源标准趋向统一: 自从 2019 年 OpenTelemetry 开源立项,得到了两大主流开源实现 OpenTracing 和 OpenCensus 的大力支持,开启了可观测性的新时代。虽然,目前 OpenTelemetry 仅在 Tracing 领域拥有比较完善的技术标准,Metrics 和 Logging 仍在探索阶段,但是可观测性“三驾马车”融合一统的趋势已经势不可挡。未来基于统一完善的可观测数据标准,分布式链路追踪的“确定性关联”将得到更加广泛的应用。

现阶段能力限制

分布式链路追踪现有的模型设计与实现,可以有效满足许多经典场景的分布式诊断诉求。但是,仍然有大量场景超出了现阶段分布式链路追踪的能力范畴,需要我们去探索更好的方案。

树形 YES!图形 NO!

本章第2小节介绍了分布式链路追踪是通过 ParentSpanId 和 SpanId 来标识依赖关系,从而准确还原链路层级与顺序。但是,每个 Span 有且仅有一个 ParentSpanId,这就限制了所有链路形态只能是单个父节点的树形结构,而不能是多个父节点的图形结构。

某些系统为了提供重复调用的效率,会将多次 RPC 调用打包成一次 RPC 调用合并发送,这种入度大于1的图形结构,就无法通过调用链真实还原调用状态,而是会被拆成多条调用链,如下图所示:

人工插桩 YES!智能插桩 NO!

无论是 SDK 或是 Agent 模式,目前工业界的链路插桩主要是依赖人工发现插桩点并实现插桩过程,很难通过算法自适应的实现插桩点的智能发现。然而,学术界在这方面已经进行了一些有意思的探索,虽然在性能开销、安全等方面还不够成熟,但是值得关注。

2019 年波士顿大学发表了一篇研究智能插桩的文章,他们实现的 Pythia 原型系统针对性能退化问题,可以自动发现更有价值的内部插桩点。例如,我们在请求一个存储系统时,可能会直接命中缓存快速返回结果,也可能未命中缓存导致加载磁盘花费了较多时间。我们仅在 RPC 层面进行插桩,只能看到请求耗时高低起伏,呈现一种双峰式的分布,但无法确认根因是什么。Pythia 通过比对分析不同的链路数据,会自动发现影响性能的潜在插桩点,比如慢请求可能会额外调用一次 fetchFromDisk 方法,从而更清晰的解释影响请求耗时的根因,如下图所示。


分布式链路追踪的能力限制远不止以上两种场景,在离线分析、机器学习等多个领域也等待我们去探索攻克。我们既要充分发挥现有的分布式链路追踪技术价值,解决当下的企业运维困难;同时也要把视野放宽,在未来更多的领域中去拓展分布式链路追踪的边界。

推荐产品

推荐社区

【稳定大于一切】打造国内稳定性领域知识库,让无法解决的问题少一点点,让世界的确定性多一点点。

  • GitHub 专栏地址:https://github.com/StabilityMan/StabilityGuide
  • 微信公众号:万物可观测
  • 钉钉交流群号:30000312
  • 如果阅读本文有所收获,欢迎分享给身边的朋友,期待更多同学的加入!
相关实践学习
基于OpenTelemetry构建全链路追踪与监控
本实验将带领您快速上手可观测链路OpenTelemetry版,包括部署并接入多语言应用、体验TraceId自动注入至日志以实现调用链与日志的关联查询、以及切换调用链透传协议以满足全链路打通的需求。
分布式链路追踪Skywalking
Skywalking是一个基于分布式跟踪的应用程序性能监控系统,用于从服务和云原生等基础设施中收集、分析、聚合以及可视化数据,提供了一种简便的方式来清晰地观测分布式系统,具有分布式追踪、性能指标分析、应用和服务依赖分析等功能。 分布式追踪系统发展很快,种类繁多,给我们带来很大的方便。但在数据采集过程中,有时需要侵入用户代码,并且不同系统的 API 并不兼容,这就导致了如果希望切换追踪系统,往往会带来较大改动。OpenTracing为了解决不同的分布式追踪系统 API 不兼容的问题,诞生了 OpenTracing 规范。OpenTracing 是一个轻量级的标准化层,它位于应用程序/类库和追踪或日志分析程序之间。Skywalking基于OpenTracing规范开发,具有性能好,支持多语言探针,无侵入性等优势,可以帮助我们准确快速的定位到线上故障和性能瓶颈。 在本套课程中,我们将全面的讲解Skywalking相关的知识。从APM系统、分布式调用链等基础概念的学习加深对Skywalking的理解,从0开始搭建一套完整的Skywalking环境,学会对各类应用进行监控,学习Skywalking常用插件。Skywalking原理章节中,将会对Skywalking使用的agent探针技术进行深度剖析,除此之外还会对OpenTracing规范作整体上的介绍。通过对本套课程的学习,不止能学会如何使用Skywalking,还将对其底层原理和分布式架构有更深的理解。本课程由黑马程序员提供。
相关文章
|
2月前
|
存储 Prometheus Cloud Native
分布式系统架构6:链路追踪
本文深入探讨了分布式系统中的链路追踪理论,涵盖追踪与跨度的概念、追踪系统的模块划分及数据收集的三种方式。链路追踪旨在解决复杂分布式系统中请求流转路径不清晰的问题,帮助快速定位故障和性能瓶颈。文中介绍了基于日志、服务探针和边车代理的数据收集方法,并简述了OpenTracing、OpenCensus和OpenTelemetry等链路追踪协议的发展历程及其特点。通过理解这些概念,可以更好地掌握开源链路追踪框架的使用。
115 41
|
7月前
|
存储 监控 开发者
分布式链路监控系统问题之系统拆分后链路追踪技术的问题如何解决
分布式链路监控系统问题之系统拆分后链路追踪技术的问题如何解决
|
10月前
|
存储 监控 搜索推荐
链路追踪(Tracing)其实很简单——链路成本进阶指南
广义上的链路成本,既包含使用链路追踪产生的数据生成、采集、计算、存储、查询等额外资源开销,也包含链路系统接入、变更、维护、协作等人力运维成本。为了便于理解,本小节将聚焦在狭义上的链路追踪机器资源成本,人力成本将在下一小节(效率)进行介绍。
416 0
链路追踪(Tracing)其实很简单——链路成本进阶指南
|
10月前
|
运维 监控 算法
链路追踪(Tracing)其实很简单——链路功能进阶指南
经过前面两章的学习,小玉已经熟练掌握分布式链路追踪的基础用法,比如回溯链路请求轨迹,定位耗时瓶颈点;配置核心接口黄金三指标告警,第一时间发现流量异常;大促前梳理应用上下游关键依赖,联系相关方协同备战等等。随...
678 0
链路追踪(Tracing)其实很简单——链路功能进阶指南
|
10月前
|
SQL 运维 测试技术
链路追踪(Tracing)其实很简单——链路拓扑
最近一年,小玉所在的业务部门发起了轰轰烈烈的微服务化运动,大量业务中台应用被拆分成更细粒度的微服务应用。为了迎接即将到来的双十一大促重保活动,小玉的主管让她在一周内梳理出订单中心的全局关键上下游依赖,提前拉...
293 0
链路追踪(Tracing)其实很简单——链路拓扑
|
10月前
|
SQL 缓存 监控
链路追踪(Tracing)其实很简单——链路实时分析、监控与告警
作者:夏明(涯海) 创作日期:2022-07-17 专栏地址:【稳定大于一切】【稳定大于一切】前面两小节我们介绍了单链路的筛选与轨迹回溯,是从单次请求的视角来分析问题,类似查询某个快递订单的物流轨迹。但是,单次请求无法直观的反映应用或接口的整体服务状态,经常会由于网络抖动、宿主机 GC 等原因出现偶...
361 0
链路追踪(Tracing)其实很简单——链路实时分析、监控与告警
|
10月前
|
SQL 运维 前端开发
链路追踪(Tracing)其实很简单——多维链路筛选
作者:夏明(涯海) 创作日期:2022-07-14 专栏地址:【稳定大于一切】【稳定大于一切】上一小节我们介绍了如何通过调用链和关联信息进行问题诊断,但是,细心的读者可能会有一个疑问,整个系统有那么多的调用链,我怎么知道哪条链路才是真正描述我在排查的这个问题?如果找到了不相符的链路岂不是会南辕北辙?...
393 0
链路追踪(Tracing)其实很简单——多维链路筛选
|
10月前
|
消息中间件 SpringCloudAlibaba Java
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(八)Config服务配置+bus消息总线+stream消息驱动+Sleuth链路追踪
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(八)Config服务配置+bus消息总线+stream消息驱动+Sleuth链路追踪
1138 0
|
存储 监控 数据可视化
Golang链路追踪:实现高效可靠的分布式系统监控
Golang链路追踪:实现高效可靠的分布式系统监控
|
消息中间件 监控 安全
RocketMQ x OpenTelemetry 分布式全链路追踪最佳实践(3)
RocketMQ x OpenTelemetry 分布式全链路追踪最佳实践
200 0
RocketMQ x OpenTelemetry 分布式全链路追踪最佳实践(3)