ARMS支持的Trace上下文传播协议

本文介绍ARMS支持的多种Trace上下文传播协议。

EagleEye协议

EagleEye协议是ARMS自研的Trace上下文传播协议,在阿里云内部被广泛使用。

Trace上下文中传播的协议头:

  • EagleEye-TraceID:32位字符串,格式:'ea'+8ip编码+13位时间戳+4位自增Id+'d'+4pid。例如:eac0a8020216868084400006973d000a

  • EagleEye-RpcID:代表Span层级关系,例如:0、0.1、0.2、0.1.1,其中00.1、0.2的父Span,0.10.1.1的父Span。

  • EagleEye-SpanID:随机Long型整数,兼容开源冗余字段。

  • EagleEye-pSpanID:随机Long型整数,兼容开源冗余字段。

  • EagleEye-Sampled:Trace是否采样。

  • EagleEye-pAppName:上游应用。

  • EagleEye-pRpc:上游应用接口。

  • EagleEye-UserData:需要在Trace上下文中传播的Baggage,格式:k1=v1&k2=v2

W3C协议

W3C默认使用的协议。

Trace中使用的协议头:

  • traceparent:格式:两位版本号-32traceId-16parentSpanId-采样标志。例如:00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01

  • tracestate:需要在Trace中透传的Baggage。格式:k1=v1&k2=v2

Zipkin协议

开源项目Zipkin使用的协议。

Trace中使用的协议头:

  • X-B3-TraceId:32TraceId。例如:0af7651916cd43dd8448eb211c80319c

  • X-B3-SpanId:16SpanId。例如:b7ad6b7169203331

  • X-B3-ParentSpanId:16ParentSpanId。例如:b7ad6b7169203331

  • X-B3-Sampled:采样标识。例如:0不采样,1采样。

  • baggage-:需要在Trace上下文中传播的Baggage。例如:baggage-k1=v1,baggage-k2=v2

Jaeger协议

开源项目Jaeger使用的协议。

Trace中使用的协议头:

  • uber-trace-id:格式:traceId:spanId:parentSpanId:flag。例如:0af7651916cd43dd8448eb211c80319c:b7ad6b7169203331:b7ad6b7169203331:1

  • uberctx-:需要在Trace上下文中传播的Baggage。例如:uberctx-k1=v1,uberctx-k2=v2

SkyWalking协议

开源项目SkyWalkingTrace上下文传播协议。

  • sw8:由8个字段组成,各字段之间通过短划线(-)分隔。头部值的最大长度(默认)小于2 K。 头部值包含以下字段,所有字符串类型的值都需通过BASE64编码。

    必须项:

    • 采样(Sample):01。0表示上下文存在,但是可以忽略;1表示此追踪需要采样并发送到后端。

    • 追踪标识(Trace Id):字符串(BASE64编码),由英文半角句号(.)分隔的三个Long类型值,表示此追踪的唯一标识。

    • 父追踪段ID(Parent trace segment Id):字符串(BASE64编码),全局唯一。

    • Span标识:从0开始的整数。此Span ID指向父追踪段中的Span。

    • 父服务:字符串(BASE64编码),长度不应小于或等于50UTF-8编码的字符。

    • 父服务实例标识:字符串(BASE64编码),长度不应小于或等于50UTF-8编码的字符。

    • 父服务的端点:字符串(BASE64编码),父追踪段中第一个入口Span的操作名,长度不应小于或等于50UTF-8编码的字符。

    • 本请求的目标地址:字符串(BASE64编码),客户端用于访问目标服务的网络地址(网络地址格式不一定是IP + 端口)。

    sw8示例: 1-TRACEID-SEGMENTID-3-PARENT_SERVICE-PARENT_INSTANCE-PARENT_ENDPOINT-IPPORT

  • sw8-x:各字段之间通过短划线(-)分隔,字段可扩展。

    追踪模式可设置为空、01,默认为空或0,表示上下文中生成的所有Span将会被跳过分析。上下文在默认情况下传播到上游,除非在跟踪过程中被更改。

ARMS Trace上下文传播协议选择策略

默认情况下,ARMS探针会根据一次请求的Header中是否包含指定协议头来选择对应的Trace上下文传播协议。 此处以链路A>B>C场景为例,A、B、C分别是不同的应用,当它们收到一个请求时,会依次按照下述逻辑选择Trace上下文传播协议:

  1. 扫描请求的所有Header,查看是否包含某协议对应的协议头。

    • 对于4.x及以上版本探针, 会按照EagleEye、W3C(OpenTelemetry)、Skywalking、Jaeger、Zipkin的顺序查找。

    • 对于4.x以下版本探针,会按照EagleEye、Jaeger、Zipkin、SkyWalking、W3C(OpenTelemetry)的顺序查找。

    若发现存在某Trace协议约定的协议头,则进行第2步,否则,进行第3步。

  2. 当存在某个协议约定的协议头时,首先按照该协议从请求中还原Trace上下文,并且后续调用下游应用也使用该协议传播Trace上下文。

  3. 当请求中不存在任何有效协议头,则创建一个新的Trace上下文,且后续按照当前优先级最高的协议传播Trace上下文。默认优先级最高的协议是EagleEye协议,您可以在自定义配置页面的Trace上下文传播协议设置区域修改协议优先级。