9. 一次找回TraceId的问题分析与过程思考
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
EagleEye
1. 阿里巴巴开源的应用性能监控工具 2. 面向阿里内部环境开发,优化海量实 时监控痛点 3. 采用StreamLib实时流式处理技术提升流计算性能 4. 把可复用 的逻辑变成“积木块”,让用户按需拼装流计算的pipeline
EagleEye工作原理
1. 采用javaagent方式修改线程池的实现 2. 子线程可以获取到父线程的trace 信息 3. 优势:维护和性能消耗方面有优势 4. 缺点:扩展性和开放性不够友好
总结
1. 中间件的出现为维护系统稳定提供支持 2. 开发人员需要认真思考实现逻辑和使用场景,发挥中间件真正价值
感谢!
分布式链路追踪问题分析及解决
抓住问题本质
1. 在业务系统报警中抓住问题的核心代码并尝试再次复现问题 2. 找到真正出问题的模块
深入理解设计思想
1. 查阅公司中间件的产品文档 2. 学习业内领先者最开始的分布式链路追踪系统的设计思想和实现途径
结合实际问题提出疑问
1. 了解分布式链路追踪系统的实现流程和设计思想 2. 分析TraceId丢失情况是在什么环节出现问题
深度分析:MTrace与@Async的异步 过程追溯
MTrace与Google Dapper
1. MTrace是美团参考Google Dapper设计的分布式链路追踪系统 2. Google Dapper通过配置span信息实现分布式系统的追踪
Google Dapper的追踪树模型
1. 追踪树模型由span组成 2. 每个span包含span name、span id、parent id和 trace id
SkyWalking
1. Apache基金会开源的应用程序性能监控系统 2. 支持多种语言探针,微内核+ 插件架构 3. 存储、集群管理和使用插件集合可以自由选择 4. 优秀的可视化效 果
SkyWalking工作原理
1. 使用插件化+javaagent的形式接入系统 2. 通过虚拟机接口动态加入打点的 代码 3. 使用字节码操作技术和AOP概念实现拦截追踪上下文的trace信息
“丢失”TraceId的原因
1. ThreadLocal在跨线程场景下上下文信息丢失 2. InheritableThreadLocal、 TransmittableThreadLocal和TransmissibleThreadLocal的对比 3. MTrace的跨 线程传递方案
SimpleAsyncTaskExecutor特性
找回TraceId的问题分析与过程思考
目录
一、问题背景和思考 二、深度分析:MTrace与@Async的异步过程追溯 三、解决方案 四、分布式追踪系统对比 五、分布式链路追踪问题分析及解决
问题背景和思考
问题背景
1. 在排查线上告警过程中,发现一个链路信息异常 2. 日志信息没有携带 TraceId,导致调用链路信息戛然而止
MTrace的改进
1. 在美团各个中间件中埋点 2. 使用UUID异或生成的TraceId和表示层级和前后关系的SpanId 3. 覆盖到RPC服务、HTTP服务、MySQL、Cache缓存和MQ 4. 支持跨线程传递和代理优化埋点方式
@Async的异步过程
1. Spring自动创建SimpleAsyncTaskExecutor线程池执行异步方法 2. 父线程创 建子线程时调用init()方法,子线程可以访问父线程中的 InheritableThreadLocal实例
1. 每次执行任务时启动新线程,不是严格意义上的线程池 2. 允许控制并发线 程上限,但默认不启用资源节流 3. 阿里技术编码规约要求用 ThreadPoolExecutor创建线程池
结论
1. MTrace的跨线程传递方案未覆盖SimpleAsyncTaskExecutor 2. @Async默认使用SimpleAsyncTaskExecutor导致TraceId丢失 3. 解决方法:指定@Async使用ThreadPoolExecutor创建线程池
分布式追踪系统对比
Zipkin
1. Twitter公司开源的分布式追踪系统 2. 支持Java、Python、Ruby和C#等主流 开发语言和框架 3. 主要功能:聚集来自各个异构系统的实时监控数据
Zipkin工作原理
1. 客户端记录请求相关的trace信息 2. 调用链路上传递trace信息并执行实际 业务流程 3. 异步发送trace信息给Zipkin Collector 4. Zipkin Server存储 trace信息 5. Web UI通过API访问存储中的trace信息进行分析和展示
解决方案Biblioteka 自定义线程池配置1. 手动自定义Configuration配置 2. 配置ThreadPoolExecutor线程池 3. 在注 解中指定bean名称
注解中标注线程池
1. 在@Async注解中指定线程池 2. 实现跨线程传递TraceId
输出台打印结果
1. 观察输出台打印信息 2. 验证TraceId正确传递
问题复现和思考
1. 分析“丢失”的TraceId原因 2. 发现问题出现在一个@Async注解下的方法
控制台输出结果
1. TraceId在@Async异步传递过程中发生丢失现象 2. 明确造成这一现象的原因 后,开始思考相关问题
思考问题
1. MTrace等分布式链路追踪系统是如何设计的? 2. @Async异步方法是如何实现的? 3. InheritableThreadLocal、TransmittableThreadLocal和 TransmissibleThreadLocal有什么区别? 4. 为什么MTrace的跨线程传递方案“失效”了? 5. 如何解决@Async场景下“弄丢”TraceId的问题? 6. 目前有哪些分布式链路追踪系统?它们又是如何解决跨线程传递问题 的?
阅读源码找到底层逻辑
1. 从@Async注解、SimpleAsyncTaskExecutor和ThreadLocal类源码进 行层层追踪 2. 分析底层真正的实现逻辑和特点
对比分析找到解决方案
1. 分析为什么Mtrace的跨线程传递方案“失效”了 2. 找到原因提供解决方案并总结其他分布式追踪系统