撸了几天的sofa-tracer之后,我悟了!
什么是分布式链路跟踪
简而言之,在分布式系统下,用于跟踪链路而衍生出的一项技术。
应用场景如下:
应用A,B,C,D,E 以一个层级关系依赖, 当用户向 应用A 发起请求,但是返回了个异常,为了排查这个问题,我们可能要一台台服务器去排查。在分布式架构下,每个应用又部署了几十上百台服务器, 那一天下来,可能多没找到问题的触发点。
通过分布式链路跟踪,结合 如 鹰眼 等平台的 链路分析,我们可以很快定位到 问题发生机器地址。
那为什么我们可以很快速定位到哪台机器?
- TraceId 日志收集,收集异常日志,快速发现异常原因
- TraceId 埋入机器IP,快速定位异常机器
基本概念
一条 trace 链路是由多个与之关联的 span 组成,一条链路整体可以看做是一张有向无环图,各个 span之间的边缘关系被称之为References。
- traceId: 每条链路只有唯一的
traceId - spanId : 每个节点为一个
span,存在层级关系
如何自己实现一套 Tracer
引用 SOFATracer 链路透传原理:
- 跨进程的透传,即如何将链路数据从一个进程传递到下游进程中
- 线程中的透传
- 当前请求跨进程调用结束之后,当前如何恢复 tracer 上下文信息
- 如何实现跨线程的透传,如在当前线程中起一个异步线程的场景
TracerId & SpanId 生成规则
TraceId 生成规则:
服务器 IP + 产生 ID 时候的时间 + 自增序列 + 当前进程号
0ad1348f1403169275002100356696
SpanId 生成规则:
root 节点为0,后续以 . 分割,不断分层延续
跨进程透传 TracerId
以 SOFATracer 为例 描述一下,一个 Http 请求是如何跨进程间进行传输的.
SofaTracer 源码地址:
https://github.com/sofastack-guides/sofa-tracer-guides/tree/master/tracer-sample-with-springmvc
在一个 Http 请求中, 当请求经过 Filter ,SOFATracer 做的主要就是判断当前请求的header中是否存在 traceId, spanId
从依赖包中,我们可以看到,只有一个filter
Header存在 Tracer 信息
将上下文信息,存放到 ThreadLocal 中
Header 不存在 Tracer 信息
创建一个新的 上下文, 生成 traceId 和 spanId ,然后存放到 ThreadLocal 中
跨线程透传 TracerId
通过深拷贝,创建一个新的上线文信息, 将 SofaTracerSpanContext 传递到子线程中
public SofaTracerSpanContext cloneInstance() {
// 重新构建一个 SofaTracerSpanContext 对象实例
// 这里会以当前父线程中的 tracerId,spanId,parentId以及采样信息 作为构建构建参数
SofaTracerSpanContext spanContext = new SofaTracerSpanContext(this.traceId, this.spanId,
this.parentId, this.isSampled);
// 系统透传数据
spanContext.addSysBaggage(this.sysBaggage);
// 业务透传数据
spanContext.addBizBaggage(this.bizBaggage);
spanContext.childContextIndex = this.childContextIndex;
return spanContext;
}
手撸一个 DEMO
MyFilter
总结
原理看着挺简单,但是实际使用上,还要考虑很多方面的问题, 如果日志收集,日志分析,traceId 生成规则等等,感兴趣的大伙可以去看一下源码: 传送门
感谢大家的阅读,希望对大家有所帮助,我是 九灵 ,有需要交流的童鞋可以 加我wx,Jayce-K,最近致力于帮助更多小伙伴加入大厂,欢迎来撩~
撸了几天的sofa-tracer之后,我悟了!的更多相关文章
- SOFABoot&SOFATracer
SOFABoot快速开始 SOFABoot介绍 SOFABoot 是蚂蚁金服开源的基于 Spring Boot 的研发框架,它在 Spring Boot 的基础上,提供了诸如 Readiness Ch ...
- [业界方案] 用SOFATracer学习分布式追踪系统Opentracing
[业界方案] 用SOFATracer学习分布式追踪系统Opentracing 目录 [业界方案] 用SOFATracer学习分布式追踪系统Opentracing 0x00 摘要 0x01 缘由 &am ...
- 基于 getter 和 setter 撸一个简易的MVVM
Angular 和 Vue 在对Angular的学习中,了解到AngularJS 的两个主要缺点: 对于每一次界面时间,Ajax 或者 timeout,都会进行一个脏检查,而每一次脏检查又会在内部循环 ...
- 评《撸一段 SQL ? 还是撸一段代码? 》
最近看到一篇博客<撸一段 SQL ? 还是撸一段代码?>,文章举例说明了一个连表查询使用程序code来写可读性可维护性更好,但是回帖意见不一致,我想作者在理论层面没有做出更好的论述,而我今 ...
- 撸一段 SQL ? 还是撸一段代码?
记得刚入公司带我的研发哥们能写一手漂亮的 SQL,搜索准确.执行快.效率高. 配合Web项目中的查询展示数据的需求,基本是分分钟完成任务. 那段时间基本是仰视的态度,每天都去讨教一点手写 SQL 的要 ...
- zorka源码解读之tracer内部实现
核心类: ZorkaAsyncThread.java protected BlockingQueue<T> submitQueue; /** * Processes single item ...
- Unity手撸2048小游戏——自动生成4*4棋盘
1.新建文件夹,命prefabs,将刚刚做成的Chessman拖入该文件下,做成预制体 2.删除panel下的Chessman 3.在panel下,新建一个空对象,命名为Chessboard,大小设置 ...
- Unity手撸2048小游戏——背景文字控制
今天继续昨天的计划吧 1.新建项目.场景命名啥的都不说了吧. 2.直接开始新建一个Image,顺便把Image改名成Chessman 3.选中Image新建一个Text对象,调整下大小位置.这样就算完 ...
- Unity手撸2048小游戏——模块拆分
最近惹女票生气了,想起撸个游戏来哄哄她,加之以前在小恩爱App上,玩过那情侣版的2048,加之她喜欢玩这类益智类的游戏,打算撸一个3D的情侣版2048.不过之前没怎么独立做过游戏,就从2D的开始吧. ...
随机推荐
- IOCP实现高并发以及与传统socke编程的对比
前言 传统socket编程中服务端一般为每一个客户端创建一个线程(一对一).这样虽然可以使程序的结构简单明了并且方便对数据处理,但是这些都是建立在创建多个线程的基础上,也就是以牺牲线程为代价.一旦有大 ...
- Java学习之jackson篇
Java学习之jackson篇 0x00 前言 本篇内容比较简单,简单记录. 0x01 Json 概述 概述:JSON(JavaScript Object Notation, JS 对象简谱) 是一种 ...
- getInstance()得理解
使用getInstance()方法的原因及作用 https://www.cnblogs.com/roadone/p/7977544.html 使用getInstance()方法的原因及作用 https ...
- linux-TCP多线程的并发服务器- 以言责人甚易,以义持己实难!!!
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <ti ...
- 16.分类和static
1.案例驱动模式 1.1案例驱动模式概述 (理解) 通过我们已掌握的知识点,先实现一个案例,然后找出这个案例中,存在的一些问题,在通过新知识点解决问题 1.2案例驱动模式的好处 (理解) 解决重复代码 ...
- wps中新罗马字体如何设置Times New Roman
word wps中新罗马字体如何设置Times New Roman ### WPS字体自带 Times New Roman ###
- 使用ps、top、ps_mem命令找出Linux中的最大内存消耗过程
使用ps.top.ps_mem命令找出Linux中的最大内存消耗过程 2020-02-08 16:06:59作者:自力稿源:云网牛站 您可能已经看到Linux系统多次消耗过多的内存,如果是这种情况,那 ...
- Debian 9.4 多网卡链路聚合bond配置
Debian 9.4 多网卡链路聚合bond配置 安装ifenslave ifenslave 的作用是网卡的负载均衡 root@debian:~# apt-get install ifenslave ...
- Linux 用户管理_用户相关配置文件详解
linux的用户管理 linux支持多个用户同时使用同一个用户登陆系统,windows在修改组策略的情况下,也可以多个人使用同一个用户登陆. 远程连接Linux的方式:ssh 远程连接windows的 ...
- C语言练习题1(关于快速排序,二分查找与运行时间)
刚刚完成师兄给的一道题目: 随机生成10000位数,进行快速排序后,用二分查找法定位到某个要查询的数(键盘输入某个要查询的数), 结果输出查询的时间,以及是否查到 分享下自己的解题思路: 1,要懂得 ...