用户点了一次提交订单日志里却出现了几十条记录怎么证明它们属于同一次操作做线上问题排查的时候最头疼的就是这个用户说点了一次提交然后报错了。你去翻日志翻出来几十条记录有 UI 线程的、有异步任务的、有 Native 层的、有系统服务的。哪几条是这次操作产生的哪几条是别的操作的根本分不清。这时候才意识到光有时间戳和日志内容不够你需要一个东西把同一次操作的所有日志串起来。这个东西就是 TraceId。一、先想清楚为什么日志串不起来先把最基础的问题想明白。普通日志长这样10:00:01.234 UI 点击提交按钮 10:00:01.456 异步任务开始执行 10:00:01.789 Native 层调用系统服务 10:00:02.123 系统服务返回结果看起来是按时间排的。但问题是用户可能点了两次提交或者别的操作也在跑。你怎么知道这四条日志是同一次操作的问题说明多线程并发多个操作同时在跑跨进程UI 进程和系统服务进程跨设备手机和平板都在跑没有一个统一的 ID你根本分不清哪些日志属于同一次操作。二、ChainId、SpanId、ParentSpanId 是什么HiTraceChain 的核心就是三个 IDID作用ChainId整条调用链的 ID一次操作一个SpanId每一步操作的 IDParentSpanId上一步操作的 IDChainId 把整条链串起来。SpanId 标记每一步。ParentSpanId 告诉你这一步是从哪一步来的。这样你就能还原出完整的调用树第一步是什么第二步是什么第三步是从哪一步分支出来的。三、调用链是怎么创建和传播的完整的调用链是这样的UI 线程处理用户点击创建第一个 Span生成 ChainId调用异步任务把 ChainId 和 SpanId 传过去异步任务创建新的 SpanParentSpanId 指向上一步调用 Native 层把 ChainId 传过去Native 层再创建新的 Span调用系统服务把 ChainId 传过去系统服务再创建新的 Span。每一步都带着同一个 ChainId。这样所有日志都能串起来。这段代码解决什么问题创建调用链 Span。文件trace/TraceHelper.ets用途跨线程调用链追踪接入位置关键业务节点import{hiTraceChain}fromkit.PerformanceAnalysisKit;// 开始一个新的调用链lettraceIdhiTraceChain.begin(submitOrder,hiTraceChain.HiTraceFlag.DEFAULT);// 业务逻辑...// 异步任务传递 TraceIdsetTimeout((){// 把 TraceId 设置到当前线程hiTraceChain.setId(traceId);// 异步任务的业务逻辑...// 结束hiTraceChain.end(traceId);},100);这里最关键的是异步线程里要把 TraceId 传过去不然异步任务的日志就跟主线程断开了。四、为什么异步线程容易丢 TraceId很多人写调用链主线程都好好的一到异步就断了。为什么因为 TraceId 是存在当前线程上下文里的。主线程有新开的异步线程没有。线程有没有 TraceIdUI 主线程有begin 创建的异步任务线程没有新线程是空的Native 层没有要手动传你不手动传异步线程就不知道现在在调用链里它打出来的日志就没有 TraceId就串不起来。五、HiTraceChain 和 HiTraceMeter 有什么区别很多人搞混了这两个。不对。组件作用HiTraceChain管调用链上下文生成和传播 TraceIdHiTraceMeter管性能打点记录某一步花了多久HiTraceChain 是把日志串起来。HiTraceMeter 是记录每一步的耗时。两个配合用Chain 负责串Meter 负责量。六、几个容易踩的坑第一个坑每个函数都重新 begin 导致调用链断裂。每一层都开始新链就串不起来了。第二个坑异步线程没有传递 TraceId。异步任务的日志全断了。第三个坑Span 创建后父子关系错误。ParentSpanId 不对调用树就错了。第四个坑任务结束没有 clearId。线程池里的线程复用TraceId 串到下一个任务去了。第五个坑拿时间戳硬拼日志。自己拼时间线不如用现成的 TraceId。第六个坑只追踪正常路径不标记异常分支。出错的时候反而找不到调用链。七、调用链怎么帮你排障调用链最大的价值不是开发的时候用是排障的时候用。用户报了个错你拿到 ChainId把所有带这个 ChainId 的日志都捞出来按 SpanId 和 ParentSpanId 排好完整的调用过程就出来了。哪一步慢了哪一步报错了一目了然。不用自己猜哪里出问题了。这次做调用链追踪最大的体会是TraceId 不是什么高深的东西就是一个 ID把同一次操作的所有日志串起来。但它难在传播主线程到异步线程、UI 到 Native、应用到系统服务每一层都要记得传。真正做的时候最容易忽略的不是怎么打 Trace而是怎么保证 TraceId 不丢。异步线程、跨进程、跨设备每一个边界都要手动传。丢了一个整条链就断了。
企业数字化 ERP 产品动态
相关推荐
QUIC 长连接收到重复推送怎么办:连接世代、messageId 与幂等消费 QUIC 长连接收到重复推送怎么办:连接世代、messageId 与幂等消费 手机从 Wi-Fi 切到蜂窝网络后,通知列表突然多出两条相同消息;日志里还能看到旧连接在新连接建立后晚到一步。QUIC 能减少握手和队头阻塞,但不会替应用决定“哪条连… · 2026/9/24 17:57:13
人脸框为什么总偏半张脸:PixelMap 旋转、缩放与坐标映射怎么对齐 人脸框为什么总偏半张脸:PixelMap 旋转、缩放与坐标映射怎么对齐 Core Vision Kit 返回了准确的人脸矩形框,画到页面上却整体向右偏,横屏照片还会旋转九十度。检测结果通常位于输入图片坐标系;页面上的 Image 经过方向修正、等比缩… · 2026/9/24 17:57:13
Matlab实现模糊C均值聚类(FCM)完整流程与数据归一化实践 做数据分类的时候,聚类往往是第一步。实际需求里经常碰到这种情况:手里有一批样本,每个样本带一堆特征,既没有标签也不知道该分几类,用传统K-means又总觉得边界太硬——样本可能同时兼具多个类别特征,硬塞进… · 2026/9/24 18:34:16
SAP BTP Cloud Foundry 路由映射实践:从入门到避坑指南 在 SAP BTP Cloud Foundry 上部署应用,很多人 push 成功之后就以为万事大吉,结果打开控制台输出的 URL,迎面一个 404,或者干脆 DNS 解析失败。问题多半出在 route 映射上。这篇东西就是聊透 SAP BTP Cloud Foundry 里的路由映射—… · 2026/9/24 18:34:16
基于Django的KVM虚拟化集群管理平台设计与实践 设想一个真实的场景:机房里有几十台物理服务器,每台上边都跑着十几台虚拟机,日常维护要开新VM、要给VM做系统、要迁移、要调整配置,全都靠SSH上去敲virsh命令。几十台宿主机散布在不同机柜,IP和密码记了一本子… · 2026/9/24 18:34:16
手写简易Tomcat:从Socket到Servlet容器的核心原理 在我刚把 Java Web 玩明白那阵子,Tomcat 对我就是个黑盒子——部署的时候点几下按钮,请求进来返回个 HTML,仅此而已。面试被问到“Servlet 容器如何工作”的时候,我背了一堆 Connector、Container、Lifecycle 的概念,但… · 2026/9/24 18:34:16
用LDA主题模型拆解电商评论:从特征提取到销量预测的Python实践 简介:针对电商平台评论数据挖掘需求,这份Python项目完整实现了基于LDA主题模型的情感分析流程,适合作为Python课程设计或文本挖掘入门实践。项目以爬虫获取的评论数据为起点,通过预处理脚本完成分句、jieba分词与词性标注、停用词… · 2026/9/24 18:34:16
智能停车场车牌识别计费系统实战:从源码到打包全流程解析 简介:智能停车场车牌识别计费系统是一套面向Python学习者、计算机视觉入门者及课程设计/毕业设计学生的完整项目方案,依托OpenCV、Tkinter/PyQt、SQLite/MySQL等常用技术栈,系统实现了车牌自动识别、停车时长计费、用户交互界面以及车辆收费记… · 2026/9/24 18:34:10
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程 简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13
1D-CNN时间序列建模实战:从Conv1d原理到工业落地 简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26
柔软的L:汉语语流中被忽视的舌肌张力控制 1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44