什么是分布式链路跟踪

简而言之,在分布式系统下,用于跟踪链路而衍生出的一项技术。

应用场景如下:

应用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 请求中, 当请求经过 FilterSOFATracer 做的主要就是判断当前请求的header中是否存在 traceId, spanId

从依赖包中,我们可以看到,只有一个filter

Header存在 Tracer 信息

将上下文信息,存放到 ThreadLocal

Header 不存在 Tracer 信息

创建一个新的 上下文, 生成 traceIdspanId ,然后存放到 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之后,我悟了!的更多相关文章

  1. SOFABoot&SOFATracer

    SOFABoot快速开始 SOFABoot介绍 SOFABoot 是蚂蚁金服开源的基于 Spring Boot 的研发框架,它在 Spring Boot 的基础上,提供了诸如 Readiness Ch ...

  2. [业界方案] 用SOFATracer学习分布式追踪系统Opentracing

    [业界方案] 用SOFATracer学习分布式追踪系统Opentracing 目录 [业界方案] 用SOFATracer学习分布式追踪系统Opentracing 0x00 摘要 0x01 缘由 &am ...

  3. 基于 getter 和 setter 撸一个简易的MVVM

    Angular 和 Vue 在对Angular的学习中,了解到AngularJS 的两个主要缺点: 对于每一次界面时间,Ajax 或者 timeout,都会进行一个脏检查,而每一次脏检查又会在内部循环 ...

  4. 评《撸一段 SQL ? 还是撸一段代码? 》

    最近看到一篇博客<撸一段 SQL ? 还是撸一段代码?>,文章举例说明了一个连表查询使用程序code来写可读性可维护性更好,但是回帖意见不一致,我想作者在理论层面没有做出更好的论述,而我今 ...

  5. 撸一段 SQL ? 还是撸一段代码?

    记得刚入公司带我的研发哥们能写一手漂亮的 SQL,搜索准确.执行快.效率高. 配合Web项目中的查询展示数据的需求,基本是分分钟完成任务. 那段时间基本是仰视的态度,每天都去讨教一点手写 SQL 的要 ...

  6. zorka源码解读之tracer内部实现

    核心类: ZorkaAsyncThread.java protected BlockingQueue<T> submitQueue; /** * Processes single item ...

  7. Unity手撸2048小游戏——自动生成4*4棋盘

    1.新建文件夹,命prefabs,将刚刚做成的Chessman拖入该文件下,做成预制体 2.删除panel下的Chessman 3.在panel下,新建一个空对象,命名为Chessboard,大小设置 ...

  8. Unity手撸2048小游戏——背景文字控制

    今天继续昨天的计划吧 1.新建项目.场景命名啥的都不说了吧. 2.直接开始新建一个Image,顺便把Image改名成Chessman 3.选中Image新建一个Text对象,调整下大小位置.这样就算完 ...

  9. Unity手撸2048小游戏——模块拆分

    最近惹女票生气了,想起撸个游戏来哄哄她,加之以前在小恩爱App上,玩过那情侣版的2048,加之她喜欢玩这类益智类的游戏,打算撸一个3D的情侣版2048.不过之前没怎么独立做过游戏,就从2D的开始吧. ...

随机推荐

  1. ES 6 中的箭头函数及用法

    ES6标准新增了一种新的函数:Arrow Function(箭头函数). 主要的几种写法如下: 组成: 参数 => 语句, 参数不是1个: (参数,参数2)=>语句 语句不止一条: 参数 ...

  2. 『动善时』JMeter基础 — 17、JMeter配置元件【HTTP请求默认值】

    目录 1.HTTP请求默认值介绍 2.HTTP请求默认值界面 3.HTTP请求默认值的使用 (1)用于演示的项目说明 (2)测试计划内包含的元件 (3)说明HTTP请求默认值用法 4.总结 5.拓展知 ...

  3. 21.File和IO流

    IO就可以对文件进行读写 File表示要读写的文件在哪,也可以对文件进行创建,删除等操作 小结: IO流是什么? 1.可以将数据从本地文件中读取出来 2.可以将数据从内存保存到本地文件 File类时什 ...

  4. [DB] ElasticSearch

    安装 root用户解压,修改配置文件 创建新用户es 修改文件权限:chown -R es:es /kkb/install/elasticsearch-6.7.0/ 用es用户启动ElasticSea ...

  5. head tail diff -c fff hhh 前5行 后5行 区别 动态显示文本最新信息: $tail -f crawler.log

    显示文件第一行: $head -1 filename 显示文件倒数第五行: $tail -5 filename ]# tail -5 test.py option=sys.argv[1] main(o ...

  6. Scala 安装与配置

    安装准备 由于 Scala 运行于 Java 平台,因此 Scala 之前需要确保系统安装 JDK Windows 中安装 Scala 1. 下载 scala-2.11.2.msi 安装包 点击安装文 ...

  7. Chrome版本与chromedriver版本映射表

    chromedriver版本 支持的Chrome版本 v2.36 v64-66 v2.35 v62-64 v2.34 v61-63 v2.33 v60-62 v2.32 v59-61 v2.31 v5 ...

  8. Nginx下配置Https 配置文件(vue)

    #user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #erro ...

  9. java 计算下面级数之和 1/3+3/5+5/7+...+97/99

    代码实例图:package judgment;/** * 计算下面级数之和 * 1/3+3/5+5/7+...+97/99; */public class Judgment { public stat ...

  10. php5.6 + apache2.4+mysql5.7 配置

    ----------------------------------------------------- ★软件工具:(下载时注意下载相应版本,不同版本安装细节可能会有差异!!) 1>http ...