画布 1
OpenTracing
  版本
    Major.Minor版本命名策略（即：大版本.小版本）
      如果标准做出不向前兼容的改变，则使用“主版本”号提升
      如果是向前兼容的改进，则进行小版本号提升
    .Patch版本（即：补丁版本）
  数据模型
    只要是一个具有完整时间周期的程序访问，都可以被认为是一个span
    Trace 调用链
    Span 跨度
      An operation name，操作名称
        get 太抽象
        get_account/792 太明确
        get_account 正确的操作名，关于account_id=792的信息应该使用Tag操作
      A start timestamp，起始时间
      A finish timestamp，结束时间
      Span Tag，一组键值对构成的Span标签集合。键值对中，键必须为string，值可以是字符串，布尔，或者数字类型。
      Span Log，一组span的日志集合。 每次log操作包含一个键值对，以及一个时间戳。 键值对中，键必须为string，值可以是任意类型。 但是需要注意，不是所有的支持OpenTracing的Tracer,都需要支持所有的值类型。
      SpanContext，Span上下文对象 (下面会详细说明)
      References(Span间关系)，相关的零个或者多个Span（Span间通过SpanContext建立这种关系）
        ChildOf
          在"ChildOf"引用关系下，父级span某种程度上取决于子span
        FollowsFrom
          一些父级节点不以任何方式依赖他们子节点的执行结果
  OpenTracing API
    Tracer
      Inject(serialize)
        将SpanContext上下文Inject（注入）到carrier
          必填参数
            SpanContext 实例
            format（格式化）描述，一般会是一个字符串常量，但不做强制要求。通过此描述，通知Tracer实现，如何对SpanContext进行编码放入到carrier中。
            carrier，根据format确定。Tracer实现根据format声明的格式，将SpanContext序列化到carrier对象中。
          可选参数
      Extract (deserialize)
        将SpanContext上下文从carrier中Extract（提取）
          必填参数
            format（格式化）描述，一般会是一个字符串常量，但不做强制要求。通过此描述，通知Tracer实现，如何从carrier中解码SpanContext。
              Text Map: 基于字符串：字符串的map,对于key和value不约束字符集。
              HTTP Headers: 适合作为HTTP头信息的，基于字符串：字符串的map。（RFC 7230.在工程实践中，如何处理HTTP头具有多样性，强烈建议tracer的使用者谨慎使用HTTP头的键值空间和转义符）
              Binary: 一个简单的二进制大对象，记录SpanContext的信息。
            carrier，根据format确定。Tracer实现根据format声明的格式，从carrier中解码SpanContext。
          可选参数
          返回值
            返回一个SpanContext实例，可以使用这个SpanContext实例，通过Tracer创建新的Span。
      创建一个新Span
        返回值，返回一个已经启动Span实例（已启动，但未结束。译者注：英语上started和finished理解容易混淆）
        必填参数
          operation name, 操作名
        可选参数
          零个或者多个关联（references）的SpanContext，如果可能，同时快速指定关系类型，ChildOf 还是 FollowsFrom。
          一个可选的显性传递的开始时间；如果忽略，当前时间被用作开始时间。
          零个或者多个tag。
    Span
      当Span结束后(span.finish())，除了通过Span获取SpanContext外，下列其他所有方法都不允许被调用。
      获取Span的SpanContext
        返回值
          返回值，Span构建时传入的SpanContext。这个返回值在Span结束后(span.finish())，依然可以使用。
      复写操作名（operation name）
        必填参数
          新的操作名operation name，覆盖构建Span时，传入的操作名。
      结束Span
        可选参数
          一个明确的完成时间;如果省略此参数，使用当前时间作为完成时间。
      为Span设置tag
        必填参数
          tag key，必须是string类型
          tag value，类型为字符串，布尔或者数字
      Log结构化数据
        必填参数
          一个或者多个键值对，其中键必须是字符串类型，值可以是任意类型。某些OpenTracing实现，可能支持更多的log值类型。
        可选参数
          一个明确的时间戳。如果指定时间戳，那么它必须在span的开始和结束时间之内。
      设置一个baggage（随行数据）元素
        Baggage元素是一个键值对集合，将这些值设置给给定的Span，Span的SpanContext，以及所有和此Span有直接或者间接关系的本地Span。 也就是说，baggage元素随trace一起保持在带内传递。（译者注：带内传递，在这里指，随应用程序调用过程一起传递）
        必填参数
          baggage key, 字符串类型
          baggage value, 字符串类型
    SpanContext
      遍历所有的baggage元素
        遍历模型依赖于语言，实现方式可能不一致。在语义上，要求调用者可以通过给定的SpanContext实例，高效的遍历所有的baggage元素
    NoopTracer
      所有的OpenTracing API实现，必须提供某种方式的NoopTracer实现。NoopTracer可以被用作控制或者测试时，进行无害的inject注入（等等）。例如，在 OpenTracing-Java实现中，NoopTracer在他自己的模块中。
    可选 API 元素
      有些语言的OpenTracing实现，为了在串行处理中，传递活跃的Span或SpanContext，提供了一些工具类。例如，opentracing-go中，通过context.Context机制，可以设置和获取活跃的Span。