火焰图:链路追踪分析的可视化利器

什么是火焰图?

火焰图用于可视化分布式链路追踪,通过使用持续时间和不同颜色的水平条形来表示请求执行路径中的每个服务调用。分布式跟踪的火焰图包括错误、延迟数据等详情,帮助开发人员识别和解决应用程序中的瓶颈问题。

链路追踪与 Span

一般来说,单个追踪(Trace)由各个 Span(跨度)构成。Span 代表一次调用或操作的单个组件,可以是一个方法调用、一个 HTTP 请求或者其他类型的操作。每个 Span 都包含了一些关键信息,如开始时间、结束时间、耗时、所属的 Trace ID、Span ID 等。Span 的核心是记录对应程序执行片段的开始时间和结束时间,而程序执行片段之间存在调用的父子关系,因而 Span 逻辑上形成树状结构。

在观测云,火焰图帮助我们以一个全局的视野来看待时间分布,从顶部往底部,根据时间分布及调用深度两个方面列出所有可能导致性能瓶颈的 Span。

在我们进一步了解火焰图之前,首先需要知悉其绘制逻辑:

  • 纵轴(Y轴):调用 Span 的层级深度,用于表示程序执行片段之间的调用关系:上面的 Span 是下面 Span 的父 Span(数据上也可以通过子 Span 的 parent_id 等于父 Span 的 Span_id 来关联来对应)。
  • 横轴(X轴):单个 Trace 下 Span 的持续时间(duration),一个格子的宽度越大,越说明该 Span 的从开始到结束的持续时间较长,可能是造成性能瓶颈的原因。

如何通过火焰图实现链路追踪分析?

火焰图

当我们来到应用性能监测 > 链路,打开某一条链路数据详情页,即可查看该链路相关的火焰图。火焰图主要关注调用 Span 的深度,从上往下依次展示各级 Span 的调用关系,从左往右显示 Span 的持续时间。

颜色

火焰图上的每个 Span 的颜色都与其服务(service)的颜色相对应。因此,我们可以直观地感知当前 Trace 中正在执行的服务请求。

服务的颜色生成逻辑:

  • 用户登录到工作空间访问应用性能监测模块时,观测云会根据服务名称自动生成颜色,该颜色的集成会继承到链路查看器等分析页面;
  • 在应用性能监测 > 服务,点击特定服务行右侧的颜色图标可以进行修改,修改后相关服务颜色均会同步改变。

在上图中,此次调用链路包含了两个服务,分别为 kodo.nsq.producer 和 kodo;同时后者还存在一个相关联的子 Span。

当我们点击某条 Span,如 kodo.nsq.producer。默认显示当前 Span 的资源(resource)或操作(operation)、持续时间(duration)以及是否存在错误(status = error)。在下图的提示中,我们可以简单得知该条 Span 的 resource 、operation 和 duration

链路详情

如果我们想获得更多详细信息,可点击该条 Span,在下方的链路详情可查看对应的 JSON 内容:

服务列表

在火焰图右侧的服务列表,显示当前 Trace 内发生请求调用的服务名称、对应颜色及该服务执行占总执行时间的比率。

火焰图中的服务执行时间占比是指该链路中每个服务的实际执行时间及占总服务对应 Span 的执行时间总和

相关计算公式如下

1.持续时间:Span 对应程序执行片段的开始时间和结束时间,一般在 Trace 的数据中用 duration 字段来做标记。

2.执行时间

1)Span 执行时间:

  • 子 Span 可能在父 Span 结束后才结束

    • 总执行时间 = Children 的结束时间 - Parent 的开始时间
    • 父 Span 的执行时间 = 总执行时间 - 子 Span 的执行时间

  • 子 Span 可能在父 Span 结束后才开始

    • 总执行时间 = Children 的结束时间 - Parent 的开始时间
    • 父 Span 的执行时间 = 总执行时间 - 子 Span 的执行时间

  • 同属于一个 Parent 的兄弟 Span 间可能重叠

    • 父 Span 执行时间 = p(1) +p(2)
    • Children 1 Span 执行时间 = c1(1) + c1(2)
    • Children 2 Span 执行时间 = c2(1) + c2(2)

2)服务执行时间:每个服务的执行时间 = Trace 内所有属于该服务的 Span 执行时间总和

3)总执行时间:总执行时间 = Trace 内 Span 最后结束的时间 - Span 最开始的时间

使用场景
示例一:

假设我们需要排查昨日服务产生的错误数。在应用性能监测 > 服务列表,可以看到 kodo.redis 这条服务产生的错误数最多。点击右侧 搜索 图标,直接前往链路查看器查看错误详细信息。

在火焰图中,该条服务下的链路详情内会给到相关的错误详情,找到错误后即可通知相关人员响应解决。

示例二:

下图是一条链路异常调用的火焰图。我们可以看到在 guance-front 这条父 Span 下存在两条 status:error 的 子 Span。分别点击这两条 Span,我们可以从 error_message 看到出现错误均是由于 Token 验证失败 引起。由此我们就可以采取针对性的优化措施。

Span 列表

瀑布图

与火焰图按照调用 Span 的层级深度来进行上下分布的逻辑不同,瀑布图主要基于开始时间的先后顺序显示 Span 数据,从上往下依次显示当前链路各个资源之间的父子关系。

链路详情页 > Span 列表 > 瀑布图,我们可以根据线段的连接来判断父子关系。

我们还是以上文示例二中的场景为例。在当前瀑布图中,我们可以看到左侧列表展示当前链路存在的所有 Span 数据及其父子关联关系及每个资源的执行时间占比。同时,产生异常的 Span 会在资源名称左侧出现错误标识。右侧则对应显示 Span 块。

当 Hover 在左侧资源名称,我们还可以查看该条 Span 的服务、资源名称以及开始时间、执行时间、持续时间:

列表模式

当然,我们也可以切换为列表模式,借助表格,原先瀑布图中的信息一览无余。

列表模式下,存在两种状态:

  • 全收起状态:从左往右,依次显示服务类型、服务颜色及当前服务下是否存在 status = error 的 Span、服务名称、当前服务下面的 Span 数量、Span 持续时间(duration)的平均值、执行时间总和以及执行时间占比;

  • 全展开状态:从左往右,依次显示服务类型、服务颜色当前 Span 是否存在 status = error、服务名称、当前 Span 持续时间(duration)的平均值、执行时间以及执行时间占比。

结论

本篇文章仅为您简单讲述如何在观测云的火焰图中进行链路追踪分析。关于更多背后逻辑的实现和未来更多关联功能的探索,敬请期待后续好文!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/178125.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NumLevels

NumLevels:输入参数,最大的金字塔层数。默认auto,范围【0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, auto】。 AngleStart:输入参数,输入匹配时的起始角度。默认-0.39,建议值【 -3.14, -1.57, -0.79, -0.39, -0.20,…

瑞吉外卖Day04

1.文件的上传下载 Value("${reggie.path}")private String basePath;/*** 文件上传** param file* return*/PostMapping("/upload")public R<String> upload(MultipartFile file) {log.info("文件上传");//原始文件名String originalFilen…

面向电网巡检的多尺度目标检测算法研究-蛮不错的工作

面向电网巡检的多尺度目标检测算法研究 电网是国民经济发展的重要基础。为确保电网安全稳定运行&#xff0c;需定期开展电网巡检&#xff0c;及时发现并排除输电线路异常。随着无人机技术发展日渐成熟&#xff0c;已经可以支持从不同距离采集到高分辨率的电网巡检图像&#xff…

RedCap推动5G规模应用,紫光展锐赋能产业高质量发展

5G R17 RedCap作为面向中高速物联网场景的关键技术和解决方案&#xff0c;可以大幅降低终端的复杂度、成本和功耗。在当前国内5G应用规模化发展关键时期&#xff0c;5G R17 RedCap拥有广大的市场潜力与广泛的应用场景&#xff0c;将有助于推动5G规模应用、构建融通发展的5G生态…

黄金投资面对K线图有哪些好用的交易策略?

在现货黄金交易中&#xff0c;学会观察K线图能够帮助投资者进行市场分析&#xff0c;根据K线图呈现出来的市场走势制定交易策略&#xff0c;是技术分析的主要作用。在黄金买卖过程中掌握K线交易技巧能够提升理财效率&#xff0c;所以这也就成为了炒金者的必修课。 K线图是以交…

【23-24 秋学期】NNDL 作业7 基于CNN的XO识别

一、用自己的语言解释以下概念 &#xff08;一&#xff09;、局部感知、权值共享 &#xff08;1&#xff09;局部感知 定义&#xff1a;在进行卷积计算的时候&#xff0c;将图片划分为一个个的区域进行计算/考虑&#xff1b; 由于越是接近的像素点之间的关联性越强, 反之则越…

mac下vue-cli从2.9.6升级到最新版本

由于mac之前安装了 vue 2.9.6 的版本&#xff0c;现在想升级到最新版本&#xff0c;用官方给的命令&#xff1a; npm uninstall vue-cli -g 发现不行。 1、究其原因&#xff1a;从vue-cli 3.0版本开始原来的npm install -g vue-cli 安装的都是旧版&#xff0c;最高到2.9.6。安…

SLAM中提到的相机位姿到底指什么?

不小心又绕进去了&#xff0c;所以掰一下。 以我个人最直观的理解&#xff0c;假设无旋转&#xff0c;相机在世界坐标系的(5,0,0)^T的位置上&#xff0c;所谓“位姿”&#xff0c;应该反映相机的位置&#xff0c;所以相机位姿应该如下&#xff1a; Eigen::Matrix4d T Eigen::M…

ubuntu 18.04安裝QT+PCL+VTK+Opencv

资源 qt5.14.1:qt5.14.1.run opencv4.5.5:opecv4.5.5压缩包 1.国内换中科大源&#xff0c;加快下载速度 cd /etc/apt/ sudo gedit sources.list 替换成如下内容 deb https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiverse deb-src https://mirro…

初试 jmeter做压力测试

一.前言 压力测试是每一个Web应用程序上线之前都需要做的一个测试&#xff0c;他可以帮助我们发现系统中的瓶颈问题&#xff0c;减少发布到生产环境后出问题的几率&#xff1b;预估系统的承载能力&#xff0c;使我们能根据其做出一些应对措施。所以压力测试是一个非常重要的步…

《QT从基础到进阶·二十八》QProcess使用,从一个exe程序启动另一个exe程序

QString exePath QCoreApplication::applicationDirPath(); //获取要启动的另一个exe路径 exePath exePath “/OffLineProcess.exe”; //路径exe名称 QProcess* Process new QProcess; //创建新的进程 Process->start(exePath)…

【Springboot】基于注解式开发Springboot-Vue3整合Mybatis-plus实现分页查询(二)——前端el-pagination实现

系列文章 【Springboot】基于注解式开发Springboot-Vue3整合Mybatis-plus实现分页查询—后端实现 文章目录 系列文章系统版本实现功能实现思路后端传入的数据格式前端el-table封装axois接口引入Element-plus的el-pagination分页组件Axois 获取后台数据 系统版本 后端&#xf…