当前位置: 首页 > news >正文

链路追踪可视化利器之火焰图

随着现代化技术的发展,为了能够保证 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系统的监控和优化中发挥其不可或缺的作用。

相关文章:

链路追踪可视化利器之火焰图

随着现代化技术的发展&#xff0c;为了能够保证 IT 系统的稳定性、高扩容性&#xff0c;企业往往采用分布式的方式来构建 IT 系统。但也正因为如此&#xff0c;IT 系统中涉及到的服务和组件可能被分布在不同的服务器、数据中心甚至不同的地理位置&#xff0c;这导致应用发生故障…...

C语言 ——— 条件编译指令实际用途

目录 前言 头文件被包含的方式 嵌套文件包含 使用条件编译指令规避头文件多次包含 还有一个编译指令&#xff0c;同样能做到以上功能 前言 条件编译指令多用于对头文件的定义和判断以及删除 头文件被包含的方式 本地文件包含&#xff08;也就是自己创建的头文件&#xff…...

备战软考Day01-计算机系统

1.数值及其转化 1.数值转化&#xff08;十进制&#xff09; 2.十进制推广 3.进制转化 4.数据表示 1.原码 2.反码 3.补码 4.移码 5.定点数 就是小数点的位置固定不变的数。小数点的位置通常有两种约定方式&#xff1a;定点整数(纯整数&#xff0c;小数点在最低有效数值位之后…...

从C语言过渡到C++

&#x1f4d4;个人主页&#x1f4da;&#xff1a;秋邱-CSDN博客☀️专属专栏✨&#xff1a;C &#x1f3c5;往期回顾&#x1f3c6;&#xff1a;单链表实现&#xff1a;从理论到代码-CSDN博客&#x1f31f;其他专栏&#x1f31f;&#xff1a;C语言_秋邱的博客-CSDN博客 目录 ​…...

Docker 的安装和使用

参考资料&#xff1a; 通俗易懂了解什么是docker?Docker 教程 | 菜鸟教程Ubuntu 22.04 安装 DockerDocker 超详细基础教程WSL2 支持 systemctl 命令systemd 和 systemctl 是什么&#xff1f;使用正确的命令重启 WSL 子系统Ubuntu 修改源镜像方法Docker 中出现 ‘/etc/resolv.…...

鸿蒙轻内核A核源码分析系列七 进程管理 (2)

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 轻内核A核源码分析系列一 数据结构-双向循环链表 轻内核A核源码分析系列二 数据结构-位图操作 轻内核A核源码分析系列三 物理内存&#xff08;1&#xff0…...

关于TypeScript使用讲解

TypeScript讲解 安装环境 1.安装node js 配置环境变量 2.在终端中 运行 npm i -g typescript typescript: 用于编译ts代码 提供了 tsc命令 实现了将 TS>>>> JS转换 验证: tsc -v 编译并运行 TS代码 1.创建ts文件&#xff08;TS文件为后缀名的文件&#xff0…...

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目&#xff1a; 题解&#xff1a; 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是流协议&#xff0c;也就是没有界限的的一串数据&#xff0c;底层并不知道上层业务数据的具体含义&#xff0c;也就是说一个完整的包可能会被拆分成多个包进行发送&#xff0c;也可能把几个小包封装成一个大的数据包发送。这就…...

FIDAVL:基于视觉语言模型的假图像检测与归因 !

FIDAVL:基于视觉语言模型的假图像检测与归因 &#xff01; 这份完整版的大模型 AI 学习资料已经上传CSDN&#xff0c;朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】 作者提出了FIDAVL&#xff1a;使用视觉语言模型进行虚假图像检测。FIDAVL是一…...

如何通过海外云手机提升运营效率

随着技术的不断进步&#xff0c;市场上出现了越来越多的提高跨国电商运营效率的应用&#xff0c;海外云手机就是其中一个。海外云手机的优势体现在多个方面&#xff0c;那么如何通过使用海外云手机来提升运营效率&#xff1f;可以从以下几个方面了解。 首先&#xff0c;海外云手…...

数据库4个范式的说明

在数据库设计中&#xff0c;范式&#xff08;Normal Form&#xff09;用于消除冗余和异常&#xff0c;确保数据一致性。以下是第一范式、第二范式、第三范式和BCNF&#xff08;Boyce-Codd Normal Form&#xff0c;即第四范式&#xff09;的示例说明&#xff1a; 1. 第一范式&a…...

Excel怎么截图?快速捕捉工作表的多种方法

大家好&#xff0c;这里是效率办公指南&#xff01; &#x1f4f8; 在日常工作中&#xff0c;我们经常需要对Excel工作表进行截图&#xff0c;无论是为了记录数据、制作演示还是进行数据对比。今天&#xff0c;我们就来学习几种在Excel中截图的方法以及它们的快捷键。 一、使…...

MyBatis动态SQL标签总结、开发手册、高阶用法(动态SQL、OGNL、批量操作、片段重用、 SQL 组合、 执行优化、嵌套查询与延迟加载)

MyBatis提供了一个非常强大的动态SQL功能&#xff0c;它使用了一组XML标签来帮助我们根据不同条件生成动态SQL。动态SQL的设计让开发者可以根据业务需求&#xff0c;灵活地构建SQL查询语句。以下是MyBatis动态SQL标签的总结。 动态SQL标签说明特点<if>条件判断语句&…...

出处不详 取数游戏

目录 取数游戏题目描述背景输入输出数据范围 题解解法优化 打赏 取数游戏 题目描述 背景 两人将 n n n个正整数围成一个圆环&#xff0c;规则如下&#xff1a; 第一名玩家随意选取数字&#xff1b;第二名玩家从与第一名玩家相邻的两个数字中选择一个&#xff1b;而后依次在…...

拉取ros2_control_demos存储库

目录 克隆存储库 方法 1: 使用 git clone 和 rosdep 安装依赖 方法 2: 使用 vcs 工具管理多个存储库 区别总结 rosdep 和 APT 的关系 网络问题 安装依赖 克隆存储库 方法 1: 使用 git clone 和 rosdep 安装依赖 下载存储库&#xff1a; mkdir -p ~/ros2_ws/src cd ~/ros…...

Apache Doris Flink Connector 24.0.0 版本正式发布

亲爱的社区伙伴们&#xff0c;Apache Doris Flink Connector 24.0.0 版本已于 2024 年 9 月 5 日正式发布。该版本新增了对 Flink 1.20 的支持&#xff0c;并支持通过 Arrow Flight SQL 高速读取 Doris 中数据。此外&#xff0c;整库同步所依赖的 FlinkCDC&#xff0c;也需升级…...

‌语音控制小夜灯的实现方案介绍

‌语音控制小夜灯的实现方案组成部分‌ 语音控制小夜灯的实现方案主要包括硬件组装和软件编程两个部分。‌ ‌硬件组装‌涉及将语音声控模块、灯泡、USB连接线等组件正确连接。首先&#xff0c;使用螺丝刀和螺丝将四个隔离柱固定在底板四个拐角处&#xff0c;同时将语音声控模…...

万龙觉醒免费辅助:VMOS云手机辅助巴克尔阵容搭配攻略!

《万龙觉醒》是一款策略类手游&#xff0c;选择合适的英雄阵容搭配能够极大提升战斗效果。而借助VMOS云手机的辅助功能&#xff0c;玩家可以更加轻松地管理游戏进程&#xff0c;优化操作体验。以下是VMOS云手机的三大核心功能&#xff0c;帮助你更好地掌控《万龙觉醒》战局。 V…...

【English】长难句翻译

这里写目录标题 技巧知识点1. 定语从句 和 状从区别2. 定从 修饰词3. who 和 whom 区别4. 除了定从、状从,还有啥?5. 怎么在长难句快速定位到主谓宾而不被各种从句中的动词影响判断6. 没有,的那种一大堆从句连起来的长难句怎么办7. 时态怎么放在翻译里总结技巧 知识点 1. 定语…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...