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?