[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"的因果关系