一、OpenTracing 是什么?
分布式链路跟踪最先由 Google在 Dapper论文中提出的一套链路追踪的 API 规范,支持多种编程语言,与平台无关、与厂商无关,使得开发人员能够方便的添加(或更换)链路跟踪系统的实现,虽然OpenTracing不是一个标准规范,但现在大多数链路跟踪系统都在尽量兼容OpenTracing。目前符合这API标准的就有 SkyWalking,Jaeger,Zipkin,Open Telemetry,Pinpoint、CAT等等
Opentracing 核心接口
Tracer:调用链,追踪链路,一个trace是由若干span组成的有向无环图,Tracer 对象可以用来创建 Span 对象(记录分布式操作时间)、跨机器透传数据(Extract/Inject 方法),或设置当前 Span(activeSpan)。Tracer对象还配置了上报数据的网关地址、本机 IP、采样率、服务名等数据。您可以通过调整采样率来减少因上报数据产生的开销
Span Tracer 中的基本单元,一个span代表应用中的一个逻辑操作,
span属性
Operation name:操作名 Start timestamp:开始时间 Finish timestamp:完成时间 Span Tag:标签集合,一组键值对,键必须为字符串,值为字符串/数字或布尔 Span Log: 日志集合,没条日志包含一个键值对和一个时间错。 SpanContext:上下文 Baggage items:trace的随行数据,是一组键值对,也需要跨进程传输。
SpanContext : Span 上下文,用于跨进程传递 Span,以及数据共享
ScopeManager:用于获取当前上下文中 Span,或者将 Span 设置到当前上下文
Scope:与 ScopeManager 配合使用,
Span 之间的关系分父子关系ChildOf和跟随关系FollowsFrom。
OpenTracing API 介绍
包含三个相互关联的类型 Tracer/span/spanContext
Tracer API
用于创建span,以及处理跨进程传递中的序列化。
tracer.buildSpan
参数:
Operation name:必填,操作名,span的具体工作,如getUserInfo
SpanContext:关联关系,包括关系类型
Start timestamp:默认为当前时间
Tag:0或多个
返回值:返回一个已启动且未结束的span。
将SpanContext注入inject到Carrier中
参数:
SpanContext实例
Format:格式化描述,一般就是字符串
Carrier:将format的后的数据序列化到carrier中
将SpanContext从Carrier中提取extract
参数:
Format:格式化描述
Carrier:从carrier中根据format反序列化出SpanContext。
返回值:SpanContext
Format结构:
Text Map:字符串Map
HTTP Headers:header信息,基于字符串Map
Binary:二进制大对象,SpanContext信息。
Span API
当Span结束span.finish后,除了获取span的SpanContext,其他操作都不被允许。
获取SpanContext
修改operation name
参数:new operation name,新的操作名词。
结束span finsh
参数:finish timestamp,完成时间
设置tag
参数:
tag key
tag value
设置结构化Log数据
参数
一个或多个log键值对,必填
时间戳,选填
设置Baggage随行数据
键值对集合,存入spancontext进行传递,会对io和cpu带来额外开销,谨慎使用。
参数:
Baggage key:字符串
Baggage value:字符串
获取Baggage元素
参数:baggage key
返回值:Baggage value
参考:
https://github.com/opentracing-contrib/opentracing-specification-zh