b3-propagation

1,565 阅读4分钟

b3-propagation的中文翻译,原文地址:github.com/openzipkin/… b3-传播策略

b3-传播策略是对"b3"和以"x-b3-"开头的请求头的具体规范,这些请求头通常跨过服务边界来传播调用链上下文信息。

总览

这个规范详细说明了如何在一个调用链树中表示一个特定操作。这些属性在进程内产生,并最终向下游传播(通常通过http请求头),以确保所有产生于同一个根源的调用能最终聚集起来。在调用开始阶段会设定一个采样率,采样率决定了调用详细信息是否要采集并上报到调用链收集系统中(通常是Zipkin)。 总体流程

最常见的调用传播用例是从客户端发送的RPC请求中复制一份调用上下文到接收这个请求的服务端中。 此种情况下,使用同一个spanID,这也就意味着客户端和服务端是同一个操作的两端,并同时结束于调用链条的同一个节点。 下图是模拟HTTP请求携带多个包含了调用传播信息的请求头如何实现上述流程:

Client Tracer                                                         Server Tracer

  TraceContext                      Http Request Headers                TraceContext
-----------------------             --------------------             -------------------
|	TraceId           |             | X-B3-TraceId     |             | TraceId          |
|				      |             |                  |             |                  |
|   ParentSpanId      | Inject      | X-B3-ParentSpanId| Extract     | ParentSpanId     |
|                     |--------->   |                  |---------->  |                  |
|   SpanId            |             | X-B3-SpanId      |             | SpanId           |
|                     |             |                  |             |                  |
|   Sampling decision |             | X-B3-Sampled     |             | Sampling decision|
-----------------------             --------------------             --------------------

调用标识通常和采样策略一起发送。但是,实际上将采样率单独发送才是更普遍和有效的做法。下面是一个代理禁用 /health 节点调用追踪的示例,图例表明了接收方生成了一个“没有操作”的调用链路来确保负载的最小化。

                                            Server Tracer

  Health check request
-----------------------                       TraceContext
|    GET  /health     |      Extract        ----------------
|    X-B3-Sampled: 0  |----------------->   | NoOp         |
-----------------------                     ----------------

标识符

TraceId为64或者128位,同一个调用过程中的SpanId为64位,它们都是不代表特定含义的。 标识符通常和采样率一起发送,但在实现比如说下面的“Defer"类型的采样策略的时候也会单独发送。

TraceId

TraceId为64或者128位,是整个调用过程的标识ID,链路上的每个span都共享这个ID。

SpanID

SpanId是64位长度,标志着当前调用过程在整个调用链路中的位置。它的值不应当有说明含义,它可能是从TraceId中衍生的。

ParentSpanId

ParentSpanId是64位长度,标志着父调用过程在整个调用链路中的位置。当一个span是整个调用链路的根span的时候,就没有ParentSpanId。

采样率(Sampling State)

采样是一种减少最终到达调用链数据收集系统的数据总量的机制。在B3传播策略中,每次调用追踪都会应用采样率:只要采样策略已生成,它的值就会顺着调用链路传递下去。这意味着所有的span都共享一个TraceId或者都没有采样率。 下面是一些实际的采样率状态,注意它们都同TraceId绑定,而不是SpanId:

  • 延迟(Defer): 暂时不清楚要不要采样
    • 延迟采样的使用场景:追踪标识符由代理设置,但代理并没有发送数据到Zipkin。延迟采样最常见的用例就是预先提供了追踪标识符。
    • 在所用已知编码中,延迟就是采样率的缺失。
  • 拒绝(Deny):不采样或者不记录
    • 拒绝采样是用来达成特定采样率或者阻止某些请求路径(比如健康检查)生成调用数据的。在可能的情况下,实现此策略的组件应当优化拒绝策略来减少间接性能损失。
  • 接受(Accept):采样或记录
    • 接受采样是用来达成特定采样率或者确保某些特定请求路径(比如低负载节点)始终被采样。当采用此策略是,调用链的spans数据应该在没有过载的时候都上报给Zipkin。
  • 调试(Debug):强制采样追踪
    • 调试策略是用像curl或者Chrome debug这类工具进行生产调试时的好帮手。调试策略是一种加强的接受策略,需要在追踪链的每个span中额外添加 Span.debug = true.

最常使用的采样率是概率性采样:比如,接受 0.01% 的调用链而忽略其他的。调试采样率是最不常用的。 采样率几乎总是和调用链标识符一起发送,但有时也可以单独发送(预定义的采样决策)。下面是它的几种使用场景:

  • Deny: 构建单纯的拒绝采样的策略要比生成标识符在运用拒绝采样的策略高效地多。这样做的话就不能使用外部ID来关联调用链了,比如日志的关联。
  • Accept: 一些代理会发送采样率给一些它们想要采集数据的路径,但不想干涉标识符的生成过程。
  • Debug: 一些指导文档会告诉你单独发送调试标识(没有标识符ID),因为这样在curl中操作很方便。