链路追踪可视化利器之火焰图
随着现代化技术的发展,为了能够保证 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. 定语…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...

高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建
【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...

负载均衡器》》LVS、Nginx、HAproxy 区别
虚拟主机 先4,后7...

【Java多线程从青铜到王者】单例设计模式(八)
wait和sleep的区别 我们的wait也是提供了一个还有超时时间的版本,sleep也是可以指定时间的,也就是说时间一到就会解除阻塞,继续执行 wait和sleep都能被提前唤醒(虽然时间还没有到也可以提前唤醒),wait能被notify提前唤醒…...

spring boot使用HttpServletResponse实现sse后端流式输出消息
1.以前只是看过SSE的相关文章,没有具体实践,这次接入AI大模型使用到了流式输出,涉及到给前端流式返回,所以记录一下。 2.resp要设置为text/event-stream resp.setContentType("text/event-stream"); resp.setCharacter…...
【R语言编程——数据调用】
这里写自定义目录标题 可用库及数据集外部数据导入方法查看数据集信息 在R语言中,有多个库支持调用内置数据集或外部数据,包括studentdata等教学或示例数据集。以下是常见的库和方法: 可用库及数据集 openintro库 该库包含多个教学数据集&a…...