火焰图:链路追踪分析的可视化利器
什么是火焰图?
火焰图用于可视化分布式链路追踪,通过使用持续时间和不同颜色的水平条形来表示请求执行路径中的每个服务调用。分布式跟踪的火焰图包括错误、延迟数据等详情,帮助开发人员识别和解决应用程序中的瓶颈问题。
链路追踪与 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)的平均值、执行时间以及执行时间占比。

结论
本篇文章仅为您简单讲述如何在观测云的火焰图中进行链路追踪分析。关于更多背后逻辑的实现和未来更多关联功能的探索,敬请期待后续好文!
相关文章:
火焰图:链路追踪分析的可视化利器
什么是火焰图? 火焰图用于可视化分布式链路追踪,通过使用持续时间和不同颜色的水平条形来表示请求执行路径中的每个服务调用。分布式跟踪的火焰图包括错误、延迟数据等详情,帮助开发人员识别和解决应用程序中的瓶颈问题。 链路追踪与 Span …...
中睿天下Coremail | 2023年Q3企业邮箱安全态势观察报告
10月25日,北京中睿天下信息技术有限公司联合Coremail邮件安全发布《2023年第三季度企业邮箱安全性研究报告》。2023年第三季度企业邮箱安全呈现出何种态势?作为邮箱管理员,我们又该如何做好防护? 以下为精华版阅读,如需…...
HBuilderX vue项目打包上传到服务器
完成后有个’dist’目录,把真个目录通过FTP 上传到服务器,Mac电脑使用cyberduck 上传 服务器使用‘宝塔’进行一件部署,基本上就是傻瓜式的点击下一步...
2656. K 个元素的最大和 --力扣 --JAVA
题目 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。你需要执行以下操作 恰好 k 次,最大化你的得分: 从 nums 中选择一个元素 m 。 将选中的元素 m 从数组中删除。 将新元素 m 1 添加到数组中。 你的得分增加 m 。 请你返回执行以上操作恰好 k …...
从HTTP到Tomcat:揭秘Web应用的底层协议与高性能容器
WEB服务器 1. HTTP协议1.1 HTTP-概述1.1.1 介绍1.2.2 特点 2.2 HTTP-请求协议2.3 HTTP-响应协议2.3.1 格式介绍2.3.2 响应状态码 2.4 HTTP-协议解析 2. WEB服务器-Tomcat2.1 简介2.1.1 服务器概述2.1.2 Web服务器2.1.3 Tomcat 2.2 基本使用2.2.1 下载2.2.2 安装与卸载2.2.3 启动…...
百度搜索智能化算力调控分配方法
作者 | 泰来 导读 随着近年深度学习技术的发展,搜索算法复杂度不断上升,算力供给需求出现了爆发式的增长。伴随着AI技术逐步走到深水区,算法红利在逐步消失,边际效应日益显著,算力效能的提升尤为重要,同时随…...
如何搭建接口自动化测试框架?
经过了一年多的接口测试工作,旧的框架也做了一些新的调整,删除了很多冗余的功能,只保留了最基本的接口结构验证、接口回归测试、线上定时巡检功能。 一、框架的演进 界面 UI 做了优化,整个框架的画风突然不一样了(人靠…...
ubuntu 20.04+ORB_SLAM3 安装配库教程
目录 安装ros(如果只是运行ORB-SLAM3,可以跳过安装)0. ros 安装教程1. 安装opencv2. 安装Pangolin3. 安装Eigen34.安装Python & libssl-dev5.安装boost库6.安装ceres库(不必须)7.安装Sophus库(不必须)8. 安装g20库…...
Poly风格模型的创建与使用_unity基础开发教程
Poly风格模型的创建与使用 安装Poly相关组件Poly模型的创建Poly模型编辑 安装Poly相关组件 打开资源包管理器Package Manager 在弹出的窗口左上角Packages选择Unity Registry 搜索框搜索 Poly 搜索结果点击Polybrush 点击右下角 Install 同时也别忘了导入一下模型示例&#…...
终于有人把VMware虚拟机三种网络模式讲清楚了!
前段时间VMware更新了,你用上最新版了吗? 有几个网工在操作中遇到过各种各样的问题。 比如说由于公司服务器重启导致出现下面的问题:在Xshell里连接虚拟机映射时连接失败;能够连接上虚拟机的映射地址,但git pull时报…...
Flutter实践二:repository模式
1.repository 几乎所有的APP,从简单的到最复杂的,在它们的架构里几乎都包括状态管理和数据源这两部分。状态管理常见的有Bloc、Cubit、Provider、ViewModel等,数据源则是一些直接和数据库或者网络客户端进行交互,取得相应的数据&…...
交换机Vlan和端口配置(H3C)
交换机Vlan配置(H3C) 配置VLAN配置VLAN接口的IP地址开启ARP网关保护功能,配置被保护的网关IP地址 配置VLAN Vlan物理端口3GigabitEthernet 1/0/1 ~ GigabitEthernet 1/0/14 ;GigabitEthernet 2/0/1 ~ GigabitEthernet 2/0/1450Gi…...
vue自定义指令控制权限
1、在main.js中注册全局指令 import Vue from vue;// 按钮权限控制指令 Vue.directive(permission, {inserted: (el, binding)>{const { value } binding;// 判断当前用户是否拥有该按钮权限if (!checkPermission(value)) {el.parentNode.removeChild(el);}} }); // 判断…...
jquery获取url参数
使用jquery获取url以及使用jquery获取url参数是我们经常要用到的操作,下面通过文字说明加代码分析的形式给大家解析,具体详情请看下文。 1、jquery获取url很简单,代码如下: window.location.href; 其实只是用到了javascript的基…...
SpringBoot和Spring源码下载
1.下载:在一个空的干净地创建一个文件夹叫springsourcecode,其实叫什么都行的。 git clone https://github.com/spring-projects/spring-framework.git 2.JDK要和gradle匹配 我们要21的,今天为止2023年11月13日,idea是2023.2。 …...
【算法练习Day49】每日温度下一个更大元素 I
📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:练题 🎯长路漫漫浩浩,万事皆有期待 文章目录 每日温度下一个更大元素 I总…...
Maven打包时跳过测试代码
Maven 打包时会把一些用于测试的类或文件也一起打包,无疑增加了打包失败的风险,也加剧了文件占用磁盘的大小。 所以本次写一下如何跳过测试类。 命令行方式跳过测试 我们可以用两种命令来跳过测试 mvn clean package -DskipTestsmvn clean package -D…...
2023-2024 年适用于 Windows 电脑的顶级视频录制软件
想捕捉您正在在线观看的视频吗?使用网络摄像头录制视频会议以供日后参考。正在寻找可以完成这些任务的视频捕捉软件?这篇文章说明了一切。以下是一些适用于 Windows PC 的最佳视频录制工具。 什么是视频录制软件? 顾名思义,视频捕…...
2023-11-14 mysql-主从复制-重置主从连接-记录
摘要: mysql的主从复制, 当从库执行binlog出错后, 会中止主从复制. 此时需要重置主从连接, 以重建主从关系. 主库操作: 一. 清理同步的数据库 drop database test;二. 重置主库状态 reset master;reset slave all;三. 检测主库状态 show master status;mysql> show master…...
go语言学习之旅之安装sdk环境,hello world!
学无止境 为什么学习Go语言 高效编程: Go语言被设计为一门高效的编程语言。其编译速度快,执行速度也相对较快,适合用于构建高性能的应用程序。 并发支持: Go语言天生支持并发编程,通过goroutine和channel提供了简单而…...
SeqGPT-560M入门指南:Web界面操作+Jupyter调试+API调用三路径并行
SeqGPT-560M入门指南:Web界面操作Jupyter调试API调用三路径并行 1. 从零开始:认识SeqGPT-560M 如果你正在寻找一个开箱即用、能快速处理中文文本分类和信息抽取的AI工具,那么SeqGPT-560M绝对值得你花十分钟了解一下。 简单来说,…...
OpenClaw学术研究助手:Qwen3.5-9B-AWQ-4bit解析论文图表数据
OpenClaw学术研究助手:Qwen3.5-9B-AWQ-4bit解析论文图表数据 1. 为什么需要自动化论文图表解析 去年冬天,我在整理一篇关于机器学习模型压缩的综述论文时,遇到了一个典型的研究痛点:需要从32篇相关文献的PDF中提取实验数据表格进…...
全球不到3%的C++开发者掌握的量子模拟技巧:利用constexpr量子门编译期展开,启动速度提升41倍
第一章:量子计算 C 量子比特模拟示例在经典C环境中模拟量子比特行为,是理解量子门操作与叠加态演化的有效教学手段。本节基于线性代数原理,使用标准C17及以上特性(无需外部量子SDK),通过复数向量与酉矩阵实…...
2025届学术党必备的十大降AI率助手实际效果
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 知网 AI 检测系统借助对文本的分析来生成逻辑以及进行语言模式识别,以此识别机器…...
事件驱动:为AI原生应用领域注入新活力
事件驱动:为AI原生应用领域注入新活力关键词:事件驱动、AI原生应用、事件流、实时响应、异步架构、微服务、事件溯源摘要:本文将带你走进「事件驱动」与「AI原生应用」的交叉领域,通过生活案例、技术原理解析和实战代码࿰…...
BLE HID库:嵌入式设备实现HID-over-GATT的轻量级方案
1. BLE_HID 库概述:面向嵌入式设备的 HID-over-GATT 实现BLE_HID 是一个专为资源受限嵌入式平台设计的轻量级开源库,其核心目标是将传统 USB HID(Human Interface Device)协议栈无缝迁移至 Bluetooth Low Energy(BLE&a…...
2026届学术党必备的五大AI辅助写作网站推荐
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在当下这个学术写作的场景范围里,论文AI工具已然变成辅助研究者去完成文献梳理的…...
XXL-SSO开源项目未来展望:技术趋势与roadmap解读
XXL-SSO开源项目未来展望:技术趋势与roadmap解读 XXL-SSO作为一款分布式单点登录框架,已在众多企业中得到广泛应用,为多系统统一认证提供了轻量级且高扩展性的解决方案。随着分布式系统架构的不断演进,XXL-SSO正面临新的技术挑战…...
C++ 打破常识:无需传参,真正实现「调用时才触发 static_assert」
文章目录前言一、传统写法的死胡同二、核心突破思路三、可直接验证的终极代码效果承诺:报错效果:四、关键细节解释(最重要的部分)1. template<int 0> 到底是什么?2. 为什么不用参数也能实现延迟?3. …...
Minecraft启动器与游戏配置工具全攻略:从新手到大师的进阶指南
Minecraft启动器与游戏配置工具全攻略:从新手到大师的进阶指南 Minecraft启动器是每一位玩家进入方块世界的第一道门,而一款优秀的游戏配置工具则能让你的冒险之旅更加顺畅。本文将以玩家视角,带你深入了解如何利用PCL2-CE这款强大的开源工具…...
