调用链业界洞察
一项技术得到认可并快速普及,各大厂商会纷纷推广自己的方案和实现,快速抢占市场;这时候标准组织就联合大厂建立技术标准,为使用者提供便利。调用链技术也不例外,下面看看调用链相关的标准Opentracing、OpenCensus、OpenTelemetry。
OpenTracing标准
Opentracing是CNCF(Cloud Native Computing Foundation)的成员项目,由UBER、苹果、Yelp等各大厂商开发,通过提供平台无关、厂商无关的API,同时支持Zipkin、Jeager等多种分布式跟踪系统,使得开发人员能够方便的添加(或更换)追踪系统的实现。其正在为全球的分布式追踪提供统一的概念和数据标准。Opentracing技术原理:
Opentracing API
• 提供9中语言API接口定义包括:Go,JavaScript,Java,Python,Ruby,PHP,Objective-C,C++,C#
Instrumentation
• 利用消息中间件Filter、Decorator、Dnterceptor等机制拦截Request和Response并完成上下文传递和埋点
• 存储request context或request到span的映射关系
• 利用Inject/Extract语法完成spanContext传递
• Span生命周期管理
• Tracer配置管理
• 提供业务Annotation接口
Tracer
• 用于对接满足Opentracing标准的不同分布式追踪系统,如Zipkin、Jeager等
Inject/Extract
• 序列化和反序列化spanContext到业务调用请求
• Opentracing仅提供接口和语法标准,不提供实现
Opentracing提供语言无关的数据模型和API接口,对于数据模型常用Span Tags和log fields给出标准命名规范和应用场景,对于API接口并且提供Go,JavaScript,Java,Python,Ruby,PHP,Objective-C,C++,C#等9中语言的开源实现
OpenTracing提供两个标准
1. OpenTracing数据模型
Traces:一个Trace可以认为是多个span的有向无环图(DAG)。
Spans封装了以下信息:
l Operation Names:可读字符串表达Span工作统计上有意义
l Start Timestamp : span开始时间
l Finish Timestamp :span结束时间
l Span Tags:Key-ValueKey必须StringValue是基本数据类型
l Span Logs:Key-Value + Timestamp
l References : spans之间的引用关系
l SpanContext封装以下信息:
l 需要跨越进程边界传递的信息<traceidparentedspanidsamplerate>
l Baggage Items:Key-Value跨进程边界全局传送透明数据
Reference between spans:描述父子节点之间的直接因果关系
l ChildOf:父Span某种程度上依赖子Span
l FollowsFrom:父节点不以任何方式依赖他们子节点的执行结果
PS:Jaeger支持OpenTracing数据格式
2. OpenTracing API
Tracer接口创建Span并了解如何通过InjectExtract穿越进程边界
l StartSpan(operationName string, opts ...StartSpanOption) Span
启动一个新的Span
l Inject(sm SpanContext, format interface{}, carrier interface{}) error
序列化SpanContext到carrier
l Extract(format interface{}, carrier interface{}) (SpanContext, error)
反序列化SpanContext到carrier
Span
l Context() SpanContext
利用Span获取SpanContext
l SetOperationName(operationName string) Span
重置操作名称
l Finish() 结束一个Span
SetTag(key string, value interface{}) Span
设置获取一个标签透明数据
l LogFields(fields ...log.Field)
记录结构化数据日志
SpanContext
强制spanContext实例不可变更多是一个概念和数据接口
l ForeachBaggageItem(handler func(k, v string) bool)
遍历所有透明数据(Baggage)
No-op Tracer
无操作的Tracer,用于打桩测试和Opentracing的标记控制
具体参考:
https://opentracing.io/
https://github.com/opentracing