随着现代化技术的发展,为了能够保证 IT 系统的稳定性、高扩容性,企业往往采用分布式的方式来构建 IT 系统。但也正因为如此,IT 系统中涉及到的服务和组件可能被分布在不同的服务器、数据中心甚至不同的地理位置,这导致应用发生故障时从架构上我们很难追踪到实际发生问题的节点位置。链路追踪是监控和诊断这些分布式系统的关键技术之一,通过链路追踪我们可以更直观的了解用户请求路径,分析应用服务之间的交互依赖调用甚至可以快速识别定位发生错误的位置。
火焰图是链路追踪数据可视化分析的利器,通过持续时间和不同颜色的水平条形来表示请求执行路径中的每个服务的代码调用,帮助开发人员识别和解决应用程序中的瓶颈问题。本文将通过一些示例拆解说明观测云火焰图的实际绘制逻辑以及如何进行图表数据的分析查看。
在了解火焰图的绘制原理之前,我们以一个小示例先来了解下什么是 Trace。
什么是 Trace
“Trace” 通常指的是分布式追踪中的一个跟踪单元,它代表了在分布式系统中一个请求或事务的完整生命周期。一般来说,单个追踪(Trace)由各个 Span(跨度)构成。Span 代表一次调用或操作的单个组件,可以是一个方法调用、一个 HTTP 请求或者其他类型的操作。每个 Span 都包含了一些关键信息,如开始时间、结束时间、耗时、所属的 Trace ID、Span ID 等。Span 的核心是记录对应程序执行片段的开始时间和结束时间,而程序执行片段之间存在调用的父子关系,因而 Span 逻辑上形成树状结构。
火焰图
观测云的火焰图正是基于上述概念将一个完整的 Trace 通过图表的方式直观的展示并支持分析。
基础概念
在使用火焰图来查看 Trace 的信息之前,我们先来了解一下火焰图的基本绘制逻辑:
- 纵轴:也称 Y 轴,代表了当前 Trace 调用 Span 的层级深度,从上往下则表示程序执行片段之间的调用关系:上面为父级 Span,下面的为子级 Span,Trace 的顶层 Span 我们又称 Root Span。
- 横轴:也称 X 轴,代表了当前 Trace 执行的持续时间,Span 通过色块显示其持续时间,一个色块的宽度越大,则说明该 Span 的从开始到结束的持续时间较长,同时也是可能造成性能瓶颈的原因。
- 连接线:若存在相同层级上存在多个 Span 且 Span 的执行时间存在重叠,则会采用连接线的方式将相关 Span 拉到下方展示区域显示,以便更直观的看到 Span 的执行情况。
指标定义
此处指标特指火焰图展示的指标数值,火焰图的数据来源均为链路数据。
Span 持续时间
持续时间通常指的是 Span 的开始时间到结束时间之间的间隔,一般由链路数据原生提供支持。
Span 执行时间
执行时间是指一个操作或事件真正开始执行到完成所需的时间。这个时间可能包括了等待时间(例如,等待资源、等待前一个操作完成等)和真正的处理时间。因此实际执行时间通常小于或等于 Span 的持续时间,因为Span的持续时间还包括了等待时间。(此指标数据当前由观测云后计算得出)
- 同步情况下,执行时间计算
(1) 子 Span 结束时间 >= 父 Span 结束时间
(2) 子 Span 结束时间 < 父 Span 结束时间
- 异步情况下,执行时间计算
(1) 存在 2 个子 Span 执行有重叠
(2) 复杂的异步场景示例
服务执行时长
每个服务的执行时间 = Trace 内所有属于该服务的 Span 执行时间总和
服务执行占比
服务执行占比 = 服务执行时长 / Trace 执行总长 * 100%
Trace 执行时间总长
一般情况下,存在以下两种情况:
1、Root span 的执行结束时间 > 所有 Span 的执行结束时间,则 Trace 的执行时间总长 = Root Span 的持续时间
2、Root span 的执行结束时间 < 某个或某些 Span 的执行结束时间,则 Trace 的执行时间总长 = Span 最晚的执行结束时间 - Root Span 的执行开始时间
场景示例
1、登录观测云工作空间,查看服务性能指标列表,从页面已经可以看出 df-front-api 服务的 P90 响应时间是比较长的。
2、点击服务进入分析看板,通过【资源调用分析】列表可以看出,当前服务发起的资源调用里面 query_data 这个资源的耗时是比较长的,这个是观测云的一个数据查询接口,接下来我们看下这个接口在查询过程当中,到底是因为什么导致耗时较长。
3、下钻到链路查看器,筛选此资源,通过点击 持续时间 列表做一下数据排序找到持续时间最长的那条链路。
4、点击数据进入链路详情页,点击右上角【全屏】模式按钮,全屏查看当前 Trace 火焰图,从火焰图中我们可以看出整个 Trace 链路里面执行时长占比比较大的是 kodo-inner 这个服务。
5、点击选中 kodo-inner 服务的关联 Span,我们可以通过关联标签页发现在此 Span 执行过程中发现 7 条日志数据,点击展示日志页面,我们可以看出红框截出的这条日志内记录了实际耗时比较长的这条 DQL 查询语句以及查询时间范围,通过 time_range 参数值可以看出来是因为选中的查询时间范围有 16 小时导致的耗时较长。
总结
在本文中,我们深入探讨了链路追踪技术的核心概念,特别是火焰图在监控和诊断分布式 IT 系统中的关键作用。火焰图以其独特的可视化方式,通过纵轴和横轴的层级深度和执行持续时间,清晰地展示了服务间的调用关系和性能瓶颈。通过火焰图,我们能够精确地识别出影响系统性能的关键 Span,计算出服务的执行时长和服务执行占比,从而为性能优化提供了有力的数据支持。文章通过实际案例,展示了如何利用火焰图分析服务性能,定位问题,并采取相应的优化措施。火焰图不仅增强了我们对分布式系统复杂性的理解,也为提升系统稳定性和效率提供了有效的工具。随着技术的不断进步,火焰图将继续在IT系统的监控和优化中发挥其不可或缺的作用。