分布式链路追踪-Opentracing(CNCF)原理

链路追踪

原理 OpenTracing 标准(CNCF )

对象

  • Tracer:接口用来创建Span
  • Span :一次方法调用, 一个程序块的调用, 或者一次RPC/数据库访问.只要是一个具有完整时间周期的程序访问,例如http 请求、mq、redis、mysql 操作等
    • An operation name,操作名称
    • A start timestamp,起始时间
    • A finish timestamp,结束时间
    • Span Tag,一组键值对构成的Span标签集合
    • Span Log,一组span的日志集合。
    • SpanContext: Span上下文对象
    • References:
  • Baggage Items: baggage元素随trace一起保持在带内传递

操作

  • StartSpan
    • operation name:抽象、通用,明确、具有统计意义;
  • Inject(serialize): 将SpanContext上下文Inject(注入)到carrier
    • format(格式化)描述,一般会是一个字符串常量,但不做强制要求。通过此描述,通知Tracer实现,如何对SpanContext进行编码放入到carrier中。
      • Text Map: 基于字符串:字符串的map,对于key和value不约束字符集。
      • HTTP Headers: 适合作为HTTP头信息的,基于字符串:字符串的map。
      • Binary: 一个简单的二进制大对象,记录SpanContext的信息。
    • carrier,根据format确定。Tracer实现根据format声明的格式,将SpanContext序列化到carrier对象中。
  • Extract (deserialize): 将SpanContext上下文从carrier中Extract(提取);

源码阅读

  • InitGlobalTracer:初始化全局trace client,
    • service-name,
    • 采样策略,
    • trace 上报服务地址
  • Tracer:
    • StartSpan
    • Inject
      • ForeachBaggageItem
    • Extract
  • NewTracer
    • NewSampler : Sampler decides whether a new trace should be sampled or not.
    • NewReporter: Reporter is called by the tracer when a span is completed to report the span to the tracing collector.
    • 初始化BuiltinFormat
      • Binary
      • TextMap
      • HTTPHeaders
    • 初始化tags
  • 使用流程:
    • GlobalTracer
    • Extract
    • StartSpan(pool)
      • spanctx: 不存在parent 则新建;
      • applySamplingDecision
    • 设置tag
    • span finish
      • report
      • Release
  • 使用场景:
    • http:
      • request header Extract
    • mq:
      • pub:

参考资料:

  • OpenTracing语义标准规范 https://www.jianshu.com/p/a963ad0bbe3e
  • OpenTracing语义标准规范及实现 https://cloud.tencent.com/developer/article/1192466
  • opentracing 中文文档:https://wu-sheng.gitbooks.io/opentracing-io/content/?spm=a2c4e.10696291.0.0.c45419a442g6f2
WRITTEN BY:    陈贞

个人博客