撸了几天的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的开始吧. ...
随机推荐
- GitBash管理代码
一.Git是什么? Git是目前世界上最先进的分布式版本控制系统. 1.Git和SVN的区别 SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中 ...
- Rabbit MQ一些参数解释
//ConnectionFactory(连接工厂): 生产Connection的的工厂 //Connection(连接):是RabbitMQ的socket的长链接,它封装了socket协议相关部分逻辑 ...
- 在/etc/profile下配置java的环境变量
在/etc/profile下配置java的环境变量 原创 Java 作者:xiaoyan5686670 时间:2016-01-18 14:30:28 6152 0 以root用户编辑:#vi /e ...
- JNLP配置WIN10
依据网友的反响和我自己的考查,发觉JNLP的情况是大多数网友的困惑之处,针对此问题小编给大总结整理了(关键此)的处理技巧,并对它进以加工改善,整理出JNLP的详细教程,只用你按照1:首先配置电脑的ja ...
- linux进阶之yum管理
一.部署私有repo源 1.官网下载需要的仓库: rsync -avrt --delete rsync://mirrors.ustc.edu.cn/centos/7/cloud/x86_64/open ...
- STM32F1移植UCOSII
作者:珵旭媛 下载对应版本的UCOSII https://www.micrium.com/downloadcenter/,你会少修改很多东西: 下载下来后是这样的文件夹,并且Software里面的才是 ...
- Nginx的配置参数中文说明
Nginx的配置参数中文说明 前言 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行.其特点是占有内存少,并发能力强 ...
- python中使用excutemany执行update语句,批量更新
python中使用excutemany执行update语句,批量更新 # coding:utf8 import pymysql import logging connection = pymysql. ...
- App元素定位三种方法
来自博客: http://testingpai.com/article/1595507262082 以下方法操作前必须确保有手机设备连入电脑,检测是否有手机连入命令 adb devices 第一种:A ...
- 人工智能AI Boosting HMC Memory Chip
人工智能AI Boosting HMC Memory Chip Innosilicon的AI Boosting HMC存储芯片适用于高速,高带宽和高性能存储领域,例如AI边缘,数据中心,自动化等. H ...