乐趣区

关于java:撸了几天的sofatracer之后我悟了

什么是分布式链路跟踪

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

利用场景如下:

利用 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, 最近致力于帮忙更多小伙伴退出大厂,欢送来撩~

退出移动版