opentracing 标准
最后更新于:2022-04-02 02:57:33
[TOC]
> [官网](https://opentracing.io/guides/golang/quick-start/)
> [github 的教程](https://github.com/yurishkuro/opentracing-tutorial/tree/master/go)
## 概述
为了解决不同的分布式追踪系统 API 不兼容的问题,诞生了[OpenTracing](https://link.zhihu.com/?target=http%3A//opentracing.io/)规范。
OpenTracing 是一个轻量级的标准化层,它位于**应用程序/类库**和**追踪或日志分析程序**之间。
### OpenTracing 支持的项目
Zipkin ,jaeger 等
### OpenTracing 支持的语言
[Go](https://github.com/opentracing/opentracing-go),[JavaScript](https://github.com/opentracing/opentracing-javascript),[Java](https://github.com/opentracing/opentracing-java),[Python](https://github.com/opentracing/opentracing-python),[Ruby](https://github.com/opentracing/opentracing-ruby),[PHP](https://github.com/opentracing/opentracing-php),[Objective-C](https://github.com/opentracing/opentracing-objc),[C++](https://github.com/opentracing/opentracing-cpp),[C#](https://github.com/opentracing/opentracing-csharp)
### OpenTracing 的优势
OpenTracing 已进入 CNCF,正在为全球的分布式追踪,提供统一的概念和数据标准。
OpenTracing 通过提供平台无关、厂商无关的 API,使得开发人员能够方便的添加(或更换)追踪系统的实现。
### OpenTracing 数据模型
OpenTracing 中的 Trace(调用链)通过归属于此调用链的 Span 来隐性的定义。
特别说明,一条 Trace(调用链)可以被认为是一个由多个 Span 组成的有向无环图
## 协议说明
### Span 状态
#### Span Tag
一组键值对构成的Span标签集合。键值对中,键必须为string,值可以是字符串,布尔,或者数字类型
一般用于对tag 进行过滤,在jager 中可按如下过滤, 多个由 空格隔开
`internal.span.format=proto span.kind=server`
#### Span Log 一组span的日志集合。
每次log操作包含一个键值对,以及生成一个时间戳。
键值对中,键必须为string,值可以是任意类型。
#### SpanContext
任何一个OpenTracing的实现,都需要将当前调用链的状态(例如:trace和span的id),依赖一个独特的Span去跨进程边界传输
Baggage Items,Trace的随行数据,是一个键值对集合,它存在于trace中,也需要跨进程边界传输
#### Span间关系
`ChildOf`(父子) 和`FollowsFrom`(跟随)
#### ChildOf
一个RPC调用的服务端的span,和RPC服务客户端的span构成ChildOf关系
一个sql insert操作的span,和ORM的save方法的span构成ChildOf关系
很多span可以并行工作(或者分布式工作)都可能是一个父级的span的子项,他会合并所有子span的执行结果,并在指定期限内返回
#### FollowsFrom
一些父级节点不以任何方式依赖他们子节点的执行结果,这种情况下,我们说这些子span和父span之间是"FollowsFrom"的因果关系
';