什么是分布式链路跟踪
简而言之,在分布式系统下,用于跟踪链路而衍生出的一项技术。
利用场景如下:
利用 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
, 最近致力于帮忙更多小伙伴退出大厂,欢送来撩~