分布式追踪 SkyWalking 源码分析六 Collector 接收和发送 trace 数据

分布式链路追踪系统,链路的追踪大体流程如下:

  1. Agent 收集 Trace 数据。
  2. Agent 发送 Trace 数据给 Collector 。
  3. Collector 接收 Trace 数据
  4. Collector 存储 Trace 数据到存储器,例如,数据库。

分布式追踪 SkyWalking 源码分析六 Collector 接收和发送 trace 数据

  • Collector 接收到 TraceSegment 数据后,进行构建
  • 【蓝色流程】构建成功,进行流式处理,最终存储到存储器( 例如,ES / H2 )。
  • 【粉色流程】构建失败,写入 Buffer 文件进行暂存。
  • 【绿色流程】后台线程,定时读取 Buffer 文件,重新提交构建。

为什么构建会失败

在 TraceSegment 里的数据结构,例如操作名( operationName )和操作编号( operationId ) ,在 《SkyWalking 源码分析 —— Agent 收集 Trace 数据》 中我们可以看到,考虑到网络传输,优先使用 operationId ,若不存在( 例如操作还未注册,或者注册了 Agent 未同步到本地 ),则使用 operationName 。

但是,Collector 构建过程时,要求的是 operationId ,如果传递的是 operationName 时,需要将 operationName 转换成 operationId 。若此时 operationName 未注册时,则无法获取到 operationId ,导致构建失败

在 《SkyWalking 源码分析 —— Agent DictionaryManager 字典管理》「2.2 操作的同步 API」 中,我们可以看到,operationName 的注册,是异步的过程。因而,即使构建的过程中,调用注册,也无法获得 operationId