本文介紹ARMS支援的多種Trace上下文傳播協議。
EagleEye協議
EagleEye協議是ARMS自研的Trace上下文傳播協議,在阿里雲內部被廣泛使用。
Trace上下文中傳播的協議頭:
EagleEye-TraceID:隨機32位字串。
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:Trace是否採樣。
EagleEye-pAppName:上遊應用。
EagleEye-pRpc:上遊應用介面。
EagleEye-UserData:需要在Trace上下文中傳播的Baggage,格式:
k1=v1&k2=v2。
W3C協議
W3C預設使用的協議。
Trace中使用的協議頭:
traceparent:格式:
兩位版本號碼-32位traceId-16位parentSpanId-採樣標誌。例如:00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01。tracestate:需要在Trace中透傳的Baggage。格式:
k1=v1&k2=v2。
Zipkin協議
開源專案Zipkin使用的協議。
Trace中使用的協議頭:
X-B3-TraceId:32位TraceId。例如:
0af7651916cd43dd8448eb211c80319c。X-B3-SpanId:16位SpanId。例如:
b7ad6b7169203331。X-B3-ParentSpanId:16位ParentSpanId。例如:
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協議
開源專案SkyWalking的Trace上下文傳播協議。
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 Trace上下文傳播協議選擇策略
預設情況下,ARMS探針會根據一次請求的Header中是否包含指定協議頭來選擇對應的Trace上下文傳播協議。 此處以鏈路A>B>C情境為例,A、B、C分別是不同的應用,當它們收到一個請求時,會依次按照下述邏輯選擇Trace上下文傳播協議:
掃描請求的所有Header,查看是否包含某協議對應的協議頭。
對於4.x及以上版本探針, 會按照EagleEye、W3C(OpenTelemetry)、Skywalking、Jaeger、Zipkin的順序尋找。
對於4.x以下版本探針,會按照EagleEye、Jaeger、Zipkin、SkyWalking、W3C(OpenTelemetry)的順序尋找。
若發現存在某Trace協議約定的協議頭,則進行第2步,否則,進行第3步。
當存在某個協議約定的協議頭時,首先按照該協議從請求中還原Trace上下文,並且後續調用下遊應用也使用該協議傳播Trace上下文。
當請求中不存在任何有效協議頭,則建立一個新的Trace上下文,且後續按照當前優先順序最高的協議傳播Trace上下文。預設優先順序最高的協議是EagleEye協議,您可以在自訂配置頁面的Trace上下文傳播通訊協定設定地區修改協議優先順序。