一.OpenTracing开放式分布式追踪规范

两个组成部分

  • Trace:调用链,追踪链路,由span组成。
  • Span:跨度点,一次跨方法调用

span属性

  • Operation name:操作名词
  • Start timestamp:开始时间
  • Finish timestamp:完成时间
  • Span Tag:标签集合,一组键值对,键必须为字符串,值为字符串/数字或布尔
  • Span Log: 日志集合,没条日志包含一个键值对和一个时间错。
  • SpanContext:上下文
  • OpenTracing实现,需要将调用链的状态(如:trace和span的id),依赖一个特殊的span去跨进程传输。

  • Baggage items:trace的随行数据,是一组键值对,也需要跨进程传输。

  • References:span间的连接关系,通过SpanContext建立关系
  • 一个span可以与多个spancontext存在关系

  • 关系类型有ChildOf父子关系和FollowsFrom跟随关系。

  • ChildOf父span依赖子span结果的关系

  • FollowsFrom 父span不依赖子span结果的关系。

二.OpenTracing API

包含三个相互关联的类型 Tracer/span/spanContext

Tracer API

用于创建span,以及处理跨进程传递中的序列化。

创建span

  • 参数:
  1. Operation name:必填,操作名,span的具体工作,如getUserInfo
  2. SpanContext:关联关系,包括关系类型
  3. Start timestamp:默认为当前时间
  4. Tag:0或多个
  • 返回值:返回一个已启动且未结束的span。

将SpanContext注入inject到Carrier中

  • 参数:
  1. SpanContext实例
  2. Format:格式化描述,一般就是字符串
  3. Carrier:将format的后的数据序列化到carrier中

将SpanContext从Carrier中提取extract

  • 参数:
  1. Format:格式化描述
  2. 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

  1. 参数:finish timestamp,完成时间

设置tag

  • 参数:
  1. tag key 
  2. tag value

设置结构化Log数据

  • 参数
  1. 一个或多个log键值对,必填
  2. 时间戳,选填

设置Baggage随行数据

键值对集合,存入spancontext进行传递,会对io和cpu带来额外开销,谨慎使用。

  • 参数:
  1. Baggage key:字符串
  2. Baggage value:字符串

获取Baggage元素

  • 参数:baggage key
  • 返回值:Baggage value

SpanContext API

可以根据需要自定一套SpanContext api,用于资金的opentracing实现。

遍历SpanContext中的Baggage

 

NoopTracer API

用于对OpenTracing API进行操作,用于外部操作或测试等,可以进行无害的注入等。

如OpenTracing-Java视线中,NoopTracer就在其模块中。

可选的API元素

在一些OpenTracing实现中,可以实现一些工具类,通过Context.Context机制设置和获取活跃的Span。

 

参考:

https://github.com/opentracing-contrib/opentracing-specification-zh

Logo

更多推荐