本文介紹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的鏈路透傳協議透傳上下文。