Page 378 - 《软件学报》2025年第9期
P. 378
王尚 等: 基于神经网络的分布式追踪数据压缩和查询方法 4289
图 1(b) 显示了图 1(a) 调用关系下跨度的时间轴. 当服务接收到请求时, 执行相应的操作并生成跨度, 同时记
录服务调用的开始时间. 如果需要调用下游服务, 则将跨度上下文随请求传递到下一个服务. 下游服务收到请求后
提取跨度上下文, 执行相关操作并利用跨度上下文生成自己的跨度信息, 重复以上过程直至子跨度不再调用其他
服务. 当服务调用返回时, 记录结束时的时间戳并关闭此跨度.
2.2 分布式追踪数据结构
自从 Google 在 Dapper 中 [46] 提出分布式追踪的概念以后, 不同的分布式追踪技术基于此提出了不同的分布式
追踪标准. 例如, CNCF 提出的 OpenTracing 制定了一套无关厂商、无关平台的协议标准, Zipkin 和 Jaeger 均遵循
OpenTracing 协议; 而 Google 开源的 OpenCensus 不仅制定了分布式追踪的规范, 而且还提供了不同开发语言的实现
以及连接协议. 为了汇集不同分布式追踪协议的优势, CNCF 将 OpenTracing 和 OpenCensus 合并为 OpenTelemetry,
其逐渐成为追踪领域新的国际化标准.
图 2 展示了符合 OpenTelemetry 规范的追踪数据结构. 每条追踪数据对应于一个资源跨度列表 (resourceSpans),
列表中的每个元素都代表一组资源 (resource) 下的跨度. 资源捕获了与记录追踪数据的实体相关的信息. 以部署
在 Kubernetes 容器中的服务产生的追踪数据为例, 资源记录了对应节点的名称、命名空间、以及 Pod 和容器的名
称等相关信息. 作用域跨度 (scopeSpans) 包含了一组具有相同资源的跨度, 每个跨度可能属于不同的作用域
(scope). 作用域对应于应用程序代码中的逻辑单元, 开发人员可以选择适当的检测范围. 跨度 (spans) 包含了一组
具有相同作用域的跨度, 其中每个跨度代表追踪中的一个操作或事件. 跨度数据中通常包含了跨度上下文信息
(traceId 和 spanId)、操作名、开始和结束的时间戳以及由键值对组成的属性列表等信息. 除了根跨度以外, 每个跨
度都记录了一个指向父跨度的标识符 (parentSpanId).
图 2 符合 OpenTelemetry 规范的追踪数据示例

