本文介绍ARMS支持的多种Tracing协议。
EagleEye协议
EagleEye协议是ARMS自研的链路透传协议,在阿里云内部被广泛使用。
链路中透传的协议头:
EagleEye-TraceID:32位字符串,格式:
'ea'+8位ip编码+13位时间戳+4位自增Id+'d'+4位pid
。例如:eac0a8020216868084400006973d000a
。EagleEye-RpcID:代表Span层级关系,例如:0、0.1、0.2、0.1.1,其中0是0.1、0.2的父Span,0.1是0.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:格式:
两位版本号-32位traceId-16位parentSpanId-采样标
。例如:00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01
。tracestate:需要在链路中透传的Baggage。格式:
k1=v1&k2&v2
。
Zipkin协议
开源项目ZipKin使用的协议。
链路中使用的协议头:
X-B3-TraceId:32位TraceId。例如:
0af7651916cd43dd8448eb211c80319c
。X-B3-SpanId:16位SpanId。例如:
b7ad6b7169203331
。X-B3-ParentSpanId:16位ParentSpanId。例如:
b7ad6b7169203331
。X-B3-Sampled:采样标识。例如:0不采样,1采样。
baggage-:需要在链路中透传的Baggage。例如:
baggage-k1=v1,baggage-k2=v2
。
Jaeger协议
开源项目Jager使用的协议。
链路中使用的协议头:
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):0或1。0表示上下文存在,但是可以忽略;1表示此追踪需要采样并发送到后端。
追踪标识(Trace Id):字符串(BASE64编码),由英文半角句号(.)分隔的三个Long类型值,表示此追踪的唯一标识。
父追踪段ID(Parent trace segment Id):字符串(BASE64编码),全局唯一。
父Span标识:从0开始的整数。此Span ID指向父追踪段中的Span。
父服务:字符串(BASE64编码),长度不应小于或等于50个UTF-8编码的字符。
父服务实例标识:字符串(BASE64编码),长度不应小于或等于50个UTF-8编码的字符。
父服务的端点:字符串(BASE64编码),父追踪段中第一个入口Span的操作名,长度不应小于或等于50个UTF-8编码的字符。
本请求的目标地址:字符串(BASE64编码),客户端用于访问目标服务的网络地址(网络地址格式不一定是
IP + 端口
)。
sw8示例:
1-TRACEID-SEGMENTID-3-PARENT_SERVICE-PARENT_INSTANCE-PARENT_ENDPOINT-IPPORT
。sw8-x:各字段之间通过短划线(-)分隔,字段可扩展。
追踪模式可设置为空、0或1,默认为空或0,表示上下文中生成的所有Span将会被跳过分析。上下文在默认情况下传播到上游,除非在跟踪过程中被更改。
ARMS链路透传协议选择
ARMS探针会自动识别当前环境使用的链路透传协议,如果当前链路中没有使用任何协议,则默认使用ARMS自身的链路透传协议。
此处以A>B>C场景为例,A、B、C分别是不同的应用,在收到一个请求时会依次查找当前请求是否存在ARMS、Jaeger、ZipKin、Skywalking、OpenTelemetry的协议头,如果存在某一个协议头,则使用该协议,如果一个都不存在,则默认使用ARMS的链路透传协议透传上下文。