链路追踪可视化利器之火焰图
随着现代化技术的发展,为了能够保证 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系统的监控和优化中发挥其不可或缺的作用。
相关文章:
链路追踪可视化利器之火焰图
随着现代化技术的发展,为了能够保证 IT 系统的稳定性、高扩容性,企业往往采用分布式的方式来构建 IT 系统。但也正因为如此,IT 系统中涉及到的服务和组件可能被分布在不同的服务器、数据中心甚至不同的地理位置,这导致应用发生故障…...
C语言 ——— 条件编译指令实际用途
目录 前言 头文件被包含的方式 嵌套文件包含 使用条件编译指令规避头文件多次包含 还有一个编译指令,同样能做到以上功能 前言 条件编译指令多用于对头文件的定义和判断以及删除 头文件被包含的方式 本地文件包含(也就是自己创建的头文件ÿ…...
备战软考Day01-计算机系统
1.数值及其转化 1.数值转化(十进制) 2.十进制推广 3.进制转化 4.数据表示 1.原码 2.反码 3.补码 4.移码 5.定点数 就是小数点的位置固定不变的数。小数点的位置通常有两种约定方式:定点整数(纯整数,小数点在最低有效数值位之后…...
从C语言过渡到C++
📔个人主页📚:秋邱-CSDN博客☀️专属专栏✨:C 🏅往期回顾🏆:单链表实现:从理论到代码-CSDN博客🌟其他专栏🌟:C语言_秋邱的博客-CSDN博客 目录 …...
Docker 的安装和使用
参考资料: 通俗易懂了解什么是docker?Docker 教程 | 菜鸟教程Ubuntu 22.04 安装 DockerDocker 超详细基础教程WSL2 支持 systemctl 命令systemd 和 systemctl 是什么?使用正确的命令重启 WSL 子系统Ubuntu 修改源镜像方法Docker 中出现 ‘/etc/resolv.…...
鸿蒙轻内核A核源码分析系列七 进程管理 (2)
往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 轻内核A核源码分析系列一 数据结构-双向循环链表 轻内核A核源码分析系列二 数据结构-位图操作 轻内核A核源码分析系列三 物理内存(1࿰…...
关于TypeScript使用讲解
TypeScript讲解 安装环境 1.安装node js 配置环境变量 2.在终端中 运行 npm i -g typescript typescript: 用于编译ts代码 提供了 tsc命令 实现了将 TS>>>> JS转换 验证: tsc -v 编译并运行 TS代码 1.创建ts文件(TS文件为后缀名的文件࿰…...
C语言 | Leetcode C语言题解之第393题UTF-8编码验证
题目: 题解: static const int MASK1 1 << 7; static const int MASK2 (1 << 7) (1 << 6);bool isValid(int num) {return (num & MASK2) MASK1; }int getBytes(int num) {if ((num & MASK1) 0) {return 1;}int n 0;in…...
Netty权威指南:Netty总结-编解码与序列化
第四章 TCP粘包/拆包问题 4.1 TCP 粘包/拆包 TCP是流协议,也就是没有界限的的一串数据,底层并不知道上层业务数据的具体含义,也就是说一个完整的包可能会被拆分成多个包进行发送,也可能把几个小包封装成一个大的数据包发送。这就…...
FIDAVL:基于视觉语言模型的假图像检测与归因 !
FIDAVL:基于视觉语言模型的假图像检测与归因 ! 这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】 作者提出了FIDAVL:使用视觉语言模型进行虚假图像检测。FIDAVL是一…...
如何通过海外云手机提升运营效率
随着技术的不断进步,市场上出现了越来越多的提高跨国电商运营效率的应用,海外云手机就是其中一个。海外云手机的优势体现在多个方面,那么如何通过使用海外云手机来提升运营效率?可以从以下几个方面了解。 首先,海外云手…...
数据库4个范式的说明
在数据库设计中,范式(Normal Form)用于消除冗余和异常,确保数据一致性。以下是第一范式、第二范式、第三范式和BCNF(Boyce-Codd Normal Form,即第四范式)的示例说明: 1. 第一范式&a…...
Excel怎么截图?快速捕捉工作表的多种方法
大家好,这里是效率办公指南! 📸 在日常工作中,我们经常需要对Excel工作表进行截图,无论是为了记录数据、制作演示还是进行数据对比。今天,我们就来学习几种在Excel中截图的方法以及它们的快捷键。 一、使…...
MyBatis动态SQL标签总结、开发手册、高阶用法(动态SQL、OGNL、批量操作、片段重用、 SQL 组合、 执行优化、嵌套查询与延迟加载)
MyBatis提供了一个非常强大的动态SQL功能,它使用了一组XML标签来帮助我们根据不同条件生成动态SQL。动态SQL的设计让开发者可以根据业务需求,灵活地构建SQL查询语句。以下是MyBatis动态SQL标签的总结。 动态SQL标签说明特点<if>条件判断语句&…...
出处不详 取数游戏
目录 取数游戏题目描述背景输入输出数据范围 题解解法优化 打赏 取数游戏 题目描述 背景 两人将 n n n个正整数围成一个圆环,规则如下: 第一名玩家随意选取数字;第二名玩家从与第一名玩家相邻的两个数字中选择一个;而后依次在…...
拉取ros2_control_demos存储库
目录 克隆存储库 方法 1: 使用 git clone 和 rosdep 安装依赖 方法 2: 使用 vcs 工具管理多个存储库 区别总结 rosdep 和 APT 的关系 网络问题 安装依赖 克隆存储库 方法 1: 使用 git clone 和 rosdep 安装依赖 下载存储库: mkdir -p ~/ros2_ws/src cd ~/ros…...
Apache Doris Flink Connector 24.0.0 版本正式发布
亲爱的社区伙伴们,Apache Doris Flink Connector 24.0.0 版本已于 2024 年 9 月 5 日正式发布。该版本新增了对 Flink 1.20 的支持,并支持通过 Arrow Flight SQL 高速读取 Doris 中数据。此外,整库同步所依赖的 FlinkCDC,也需升级…...
语音控制小夜灯的实现方案介绍
语音控制小夜灯的实现方案组成部分 语音控制小夜灯的实现方案主要包括硬件组装和软件编程两个部分。 硬件组装涉及将语音声控模块、灯泡、USB连接线等组件正确连接。首先,使用螺丝刀和螺丝将四个隔离柱固定在底板四个拐角处,同时将语音声控模…...
万龙觉醒免费辅助:VMOS云手机辅助巴克尔阵容搭配攻略!
《万龙觉醒》是一款策略类手游,选择合适的英雄阵容搭配能够极大提升战斗效果。而借助VMOS云手机的辅助功能,玩家可以更加轻松地管理游戏进程,优化操作体验。以下是VMOS云手机的三大核心功能,帮助你更好地掌控《万龙觉醒》战局。 V…...
【English】长难句翻译
这里写目录标题 技巧知识点1. 定语从句 和 状从区别2. 定从 修饰词3. who 和 whom 区别4. 除了定从、状从,还有啥?5. 怎么在长难句快速定位到主谓宾而不被各种从句中的动词影响判断6. 没有,的那种一大堆从句连起来的长难句怎么办7. 时态怎么放在翻译里总结技巧 知识点 1. 定语…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...
SQL Server 触发器调用存储过程实现发送 HTTP 请求
文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...
