链路追踪
原理 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对象中。
- format(格式化)描述,一般会是一个字符串常量,但不做强制要求。通过此描述,通知Tracer实现,如何对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:
- http:
参考资料:
- 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