调用链trace数据流程分析

  • traceSegment数据结构

traceSegment是分布式链路追踪的一段或者一个片段,可以认为它是span数组的封装。

  • 用于记录所在线程的链路。
  • 分布式链路追踪,可以包含多个 TraceSegment ,因为存在跨进程( 例如,RPC 、MQ 等等),或者垮线程( 例如,并发执行、异步回调等等 )。

TraceSegmentRef 就像一个指针,它引用另一个 TraceSegment,使用 spanId 指向引用TraceSegment 的确切跨度。

DistributedTraceId 表示一个分布式的调用链。这个调用链有一个唯一的(服务)入口,

如:Service:http://www.skywalking.com/cust/query,所有的remote,在这个service后面调用,restremote, db 执行,即使在不同的 JVM 中也

使用相同的 DistributedTraceId。DistributedTraceId 只包含一个字符串,并且不能重置,创建新实例是唯一的选择。它有两个实现类

org.skywalking.apm.agent.core.context.ids.NewDistributedTraceId 新建的分布式链路追踪编号
org.skywalking.apm.agent.core.context.ids.PropagatedTraceId 传播的分布式链路追踪编号

分布式链路ID由三部分组成

第一个代表应用程序实例 ID。

第二个代表线程 id。

第三个也有两个部分,

1) 时间戳,以毫秒为单位

2) seq,在当前线程中,介于 0(包含)和 9999(包含)之间

ContexCarrier是tracingContex的数据载体,它持有链路追踪上下文当前状态的快照。

AbstractTracerContext 表示跟踪器上下文管理器

SamplingService 负责如何对 TraceSegment 进行采样。 每个 TraceSegments 都已被跟踪,但是,考虑到序列化/反序列化的 CPU 成本和网络带宽,如果 SAMPLING 处于开启状态,代理不会将它们全部发送到收集器。

TracingContext负责创建TraceSegment

RuntimeContext 在跟踪上下文期间处于活动状态。它不会被序列化到收集器,并且始终只停留在同一个上下文中。在大多数情况下,这意味着它只停留在单个线程中进行上下文传播。

private static ThreadLocal<AbstractTracerContext> CONTEXT = new ThreadLocal<AbstractTracerContext>();
private static ThreadLocal<RuntimeContext> RUNTIME_CONTEXT = new ThreadLocal<RuntimeContext>();

同时会生成traceSegmentId 如: 8f3061588e864356bf6d2a584e5fa99c.60.16306568317870000 和 relatedGlobalTraceId 如:8f3061588e864356bf6d2a584e5fa99c.60.16306569554130001

ContexManager→createEntrySpan创建TracingContext,然后由context创建EntrySpan

  • 数据发送

trace数据发送TracingContext.stopSpan()方法中会调用finish()方法会通知之前注册其上的监听器进行方法回调 即TraceSegmentServiceClient.afterFinished方法

数据发送使用生产消费模式,首先将数据保存到DataCarrier所维护的channels中,实际就是多个数组作为缓存。消费线程会根据一定策略进行数据消费。

最终将取出来的TraceSegment转换成真正grpc所需要的SegmentObject,使用TraceSegmentReportServiceStub以流的形式发送到oapServer。

  • 数据接收

1.服务端使用TraceSegmentReportServiceHandler收集客户端发送过来的SegmentObject,

2.TraceAnalyzer对数据进行解析,SegmentAnalysisListener会将数据构建成Segment

3.SourceReceiver中的dispatcherManager选择恰当的派发器对数据进行分发

4.SegmentDispatcher将数据进行转换成SegmentRecord,以流式形式对数据进行处理

5.RecordStreamProcesser会从workers缓存中获取对应的持久化工作处理器如:RecordPersistentWorker.

6.根据之前配置的存储选择不同的RecordDAO对数据进行持久化

  • UI数据展示

数据展示主要使用graphql,trace后台对应的查询解析器TraceQuery

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值