当前位置: 首页 > news >正文

分布式链路追踪理论

基本概念

分布式调用链标准-openTracing

Span-节点组成跟踪树结构

有一些特定的变量,SpanName SpanId traceId spanParentId

Trace(追踪):代表一个完整的请求流程(如用户下单),由多个Span组成

Span(跨度):请求经过的单个服务或操作(如订单服务调用支付服务)

包含:开始/结束时间、服务名、调用关系等

Context(上下文):传递Trace ID、Span ID等,确保链路连续

分布式链路追踪 = Trace ID串联全局 + Span记录局部 + 上下文传递


Span节点必须包含的内容

OperationName:操作名称

BeiginTime:开始时间

EndTime:结束时间

SpanTag:是一组键值对构成的Span的标签集合(key必须是String类型,value可以是String,Boolean和数字类型),这个的目的是为Span添加更多的描述信息

SpanLog:一组Span的日志集合,是键值对,记录日志信息

SpanContext:是一个上下文对象,会从上一个节点传递到下一个节点,里面包含了traceIdSpanIdBaggage(这是一个跨Span集合,上一个节点往Baggage加信息下一个节点可以拿到,不要放太多信息不然会导致占用空间大影响效率),我们通过上下文对象去进行跨进程传递


TraceSegment和TraceId原理

TraceSegment:

  1. 指的是一个进程中所有的Span的集合
  2. 如果多个线程协同产生同一个Trace(例如多个RPC调用不同的方法),它们只会共同创建一个TraceSegment
  3. 支持多入口,所以Skywalking去除了树节点RootSpan的概念,提出了三种Span模型

TraceId:

  1. TraceId应该是全局唯一的
  2. 我们的TraceId是根据时间错+算法生成的,所以会有时间回拨问题
  3. 我们有个变量lastTimeStamp保存上次TraceId生成的时间,然后在生成TraceId前进行比较,如果CuurentTimeMills比lastTimeStamp时间小,说明时间回拨了,我们就不生成Id,这样来保证TraceId全局唯一

概念简单总结

三个基本概念:Trace追踪,Span服务,Context上下文(用来传递信息)

分布式链路追踪 = Trace ID串联全局 + Span记录局部 + 上下文传递

Span中包含starTime,endTime,SpanContetx(上下文用来传递信息,包含TraceId,SpanId),

SpanTag(服务的标签),SpanLog(服务的日志信息)

TraceSegment(追踪段):一个进程中所有的Span的集合

TraceId:全局唯一,依赖时间戳,保存上次TraceId生成的时间,生成ID时时间戳进行对比,防止时间回拨问题


全链路追踪的工作流

阶段1:链路数据生成(埋点)

自动埋点:通过SDK或Agent自动在服务框架(如Spring Cloud、Dubbo)中注入追踪逻辑。

手动埋点:在业务代码中手动标记关键操作(如支付流程)。

示例:用户下单时,网关生成Trace ID=ABC,创建根Span(Span ID=1)


阶段2:链路数据采集与传输

采集方式:通过Agent或Sidecar(如Envoy)实时收集Span数据

传输协议:通过gRPC、HTTP等将数据发送到Collector(如Jaeger Collector)。

示例:订单服务(Span ID=2)和库存服务(Span ID=3)的Span通过Kafka发送到收集器。


阶段3:链路数据存储

存储后端:使用时序数据库(如InfluxDB)、列式存储(如Cassandra)或Elasticsearch。

数据模型:按Trace ID聚合Span,建立索引(如服务名、耗时、错误码)。

示例:Trace ID=ABC的所有Span被存储为一条完整链路。


阶段4:数据查询与分析

可视化通过UI工具(如Zipkin、SkyWalking)展示火焰图、调用拓扑。

分析能力:支持按服务名、耗时、错误码过滤,自动统计P99延迟、错误率。

示例:发现库存服务(Span ID=3)平均耗时500ms,触发告警


流程简单总结
  1. 链路数据生成:在进入Span服务前生成数据,一般来说再进入服务器会有自定义数据处理or服务启动前的Agent增强让服务有了多余的自定义逻辑
  2. 实时采集与传输链路数据:通过Http或者grpc采集和传输链路追踪的数据
  3. 链路数据存储:存储链路追踪的数据
  4. 数据查询与分析可视化:通过可视化页面展示详细的链路追踪流程和数据,显示服务细节,耗时,错误等
http://www.xdnf.cn/news/190279.html

相关文章:

  • 【Axure视频教程】手电筒效果
  • 【题解-Acwing】867. 分解质因数
  • 【蒸馏(5)】DistillBEV代码分析
  • FPGA-DDS信号发生器
  • 3D架构图软件 iCraft Editor 正式发布 @icraft/player-react 前端组件, 轻松嵌入3D架构图到您的项目
  • 数据可视化
  • 【C++教程】三目运算符
  • Day8 鼠标控制与32位模式切换
  • AIGC重构元宇宙:从内容生成到沉浸式体验的技术革命
  • 临床试验概述:从定义到实践的关键要素
  • R 语言科研绘图第 43 期 --- 桑基图-冲击
  • 软件设计师速通其一:计算机内部数据表示
  • 数据库学习笔记(十三)---存储过程
  • OpenCV 图形API(68)图像与通道拼接函数------垂直拼接两个图像/矩阵的函数concatVert()
  • 手搓传染病模型(SEIR-拓展)
  • 深度对比:Objective-C与Swift的RunTime机制与底层原理
  • 深入理解缓存淘汰策略:LRU 与 LFU 算法详解及 Java 实现
  • 媒资管理之视频管理
  • Prompt Engineering 提示工程:释放大语言模型潜力的关键技术与实践指南
  • C++(初阶)(十四)——多态
  • SwiftUI 10.Toggle介绍和使用
  • 马克·雷伯特:用算法让机器人飞奔的人
  • Mac搭建Flutter IOS环境详细指南
  • 了解Android studio 初学者零基础推荐(1)
  • 算术表达式通常有三种表示形式:中缀表达式、前缀表达式(波兰式)和后缀表达式(逆波兰式)。分别都是什么?
  • 【Java EE初阶】多线程(二)
  • uniapp做app,使用v-for遍历渲染第二层的时候,打包到手机上渲染不出第二层的数据
  • 如何使用极狐GitLab 议题看板?
  • LeetCode 3392、LCR106、3447题解
  • Linux学习笔记(一):Linux下的基本指令