jaeger
本文将讲解jaeger基本概念,基于golang的代码实现以及注入原理
jaeger 概述
组件概念:
jaeger-client
jaeger-agent 将client发送的span发送到collector
jaeger-collector 收集数据并存储或发送到队列
jaeger ingester 读取kafka队列写入存储
jaeger-query 查询数据展示tracer
逻辑概念:
span 具体的某个操作,包含以下属性
操作名称
开始时间
执行时长
logs # 捕获指定时间的消息,或调试输出
tags # 不被继承,查询过滤理解追踪数据
Trace 是一个完整的执行过程,是span的有向无环图
SpanContext # 传递给下级span的信息trace_id,span_id,parentId等
Baggage 存储在SpanContext的键值集合,在一个链路上全局传输
应用代码实现
单span代码
夸进程传播
使用上下文传递
跨请求传播
将span注入header
从header获取span上下文,并根据上下文创建新span
跨应用多span示例代码
有两个服务组成,svc1,svc2 有三个span组成,svc1 sayhello --> svc1 req svc2 --> svc2 get bagger
svc1代码
svc2代码
header数据解析
对于上述代码我们发现svc1发送给svc2有如下特殊header Uber-Trace-Id:[518ee099f68f3974:17531754249a513a:518ee099f68f3974:1] Uberctx-Haha:[heihei] 那这些header是如何根据tracer信息添加呢
根据传入的format获取对应的injector
Inject代码实现
我们看到是根据format拿到Injector,默认支持三种类型
binary
TextMap
HTTPHeaders
其中HTTPHeaders基于TextMap传播
Propagator
两种Propagator实现了Injector接口
BinaryPropagator
TextMapPropagator
BinaryPropagator的不再讲述
TextMapPropagator
carrier
Propagator通过carrier注入提取数据 binary直接传入实现io.Writer接口对象即可 TextMapPropagator有两种carrier
HTTPHeadersCarrier
TextMapCarrier
HTTPHeadersCarrier
TextMapCarrier
结果
TraceContextHeaderName 默认值为 "uber-trace-id" 设置该值代码为:
由此看出该header包含了traceID,spanID,parentID
扫描关注我的公众号:

Last updated
Was this helpful?