ARMS支持Tracing协议

本文介绍ARMS支持的多种Tracing协议。

EagleEye协议

EagleEye协议是ARMS自研的链路透传协议,在阿里云内部被广泛使用。

链路中透传的协议头:

  • 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:链路是否采样。

  • EagleEye-pAppName:上游应用。

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

  • EagleEye-UserData:需要在链路中透传的Baggage,格式:k1=v1&k2=v2

OpenTelemetry协议

OpenTelemetry默认使用的协议。

链路中使用的协议头:

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

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

Zipkin协议

开源项目ZipKin使用的协议。

链路中使用的协议头:

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

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

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

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

  • baggage-:需要在链路中透传的Baggage。例如:baggage-k1=v1,baggage-k2=v2

Jaeger协议

开源项目Jaeger使用的协议。

链路中使用的协议头:

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

  • uberctx-:需要在链路中透传的Baggage。例如:uberctx-k1=v1,uberctx-k2=v2

Skywalking协议

开源项目Skywalking的链路透传协议。

  • 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链路透传协议选择

ARMS探针会自动识别当前环境使用的链路透传协议,如果当前链路中没有使用任何协议,则默认使用ARMS自身的链路透传协议。

此处以A>B>C场景为例,A、B、C分别是不同的应用,在收到一个请求时会依次查找当前请求是否存在ARMS、Jaeger、ZipKin、Skywalking、OpenTelemetry的协议头,如果存在某一个协议头,则使用该协议,如果一个都不存在,则默认使用ARMS的链路透传协议透传上下文。