一些具體場景需要我們去實現自定義跟蹤 ID
實施思路:通過tracer.extract
可以構造 spanContext,構造的 SpanContext 可以作為上層節點資訊,可以通過 Aschildof(SpanContext) 構造當前跨度。
traceid 引數定義
為tracer.extract
構建乙個 SpanContext,通過 ContextInterpreter 進行內部解析,獲取對應的 TraceId 和 SpanId,下面將介紹實現的 ContextInterpreter 部分。
吊具
DDTRACE支援多種傳播協議,對於不同的傳播協議,traceid的引數名稱是不同的。
對於 J**A,DDTtrace 支援兩種傳播協議:
Datadog:預設傳播協議。
B3:B3 傳播是報頭“B3”和以“X-B3-”開頭的報頭的規範。 這些標頭用於跨服務邊界的跟蹤上下文傳播。
開啟 DataDog 吊具
-ddd.propagation.style.extract=datadog-ddd.propagation.style.inject=datadog機制原始碼介紹預設使用 ddtracedatadog作為預設傳播協議,** 是
datadogcontextinterpreter
,其部分如下:
public boolean accept(string key, string value) else if ("x-datadog-parent-id".equalsignorecase(key)) else if ("x-datadog-sampling-priority".equalsignorecase(key)) else if ("x-datadog-origin".equalsignorecase(key))實現
自定義 traceID 資訊實現自定義鏈結 * param traceid * param parentid * param treelength * return * @getmapping (.)"/customtrace") @responsebody public string customtrace(string traceid, string parentid, integer treelength) return "build success!"; }B3 有兩種編碼:單頭和多頭。
多個標頭編碼 x-b3 - 軌道上下文中每個專案的標頭字首。
單個標頭將上下文分隔為名為 b3 的單個項提取欄位時,單頭變體優先於多頭變體。
下面是乙個具有多個標頭編碼的示例流,假設 HTTP 請求具有傳播的跟蹤:
開啟 B3 傳播器
-ddd.propagation.style.extract=b3-ddd.propagation.style.inject=b3機制原始碼介紹
public boolean accept(string key, string value) break; case 'u': if (this.handleduseragent(key, value)) break; case 'x': if ((this.traceid == null ||this.traceid == ddid.zero) &"x-b3-traceid".equalsignorecase(key)) else if ((this.spanid == null ||this.spanid == ddid.zero) &"x-b3-spanid".equalsignorecase(key)) else if (this.samplingpriority == this.defaultsamplingpriority() "x-b3-sampled".equalsignorecase(key)) else if (this.handledxforwarding(key, value)) string firstvalue = httpcodec.firstheadervalue(value); if (null != firstvalue) break; case 1: this.setspanid(firstvalue); break; case 2: string mappedkey = (string)this.taggedheaders.get(lowercasekey); if (null != mappedkey) this.tags.put(mappedkey, httpcodec.decode(firstvalue));break; case 3: this.samplingpriority = this.convertsamplingpriority(firstvalue); break; case 4: if (this.extractb3(firstvalue))以下方法是對單個標頭方法的處理。
private boolean extractb3(string firstvalue) else }if (secondindex == -1) else }return false; }多標頭實現
private static void b3tracebymultiple()
注意:必須在兩個標頭中傳遞多個標頭,它們是:x-b3-traceid
跟x-b3-spanid
,從 *** 分析,不區分大小寫。
6001828a33d570a9 6917954032704516265 58c4b35f113ee3536001828a33d570a9 6917954032704516265 330359b7aaea9d6b6001828a33d570a9 6917954032704516265 1ac0dcd332f9262f單標頭實現
private static void b3tracebysingle()
6001828a33d570a9 6917954032704516265 308287d022272ed9b3=6001828a33d570a9-37de92c518846627-16001828a33d570a9 6917954032704516265 5e6fbaad91daef5cb3=6001828a33d570a9-308287d022272ed9-16001828a33d570a9 6917954032704516265 2cfbc225bddf5e6db3=6001828a33d570a9-5e6fbaad91daef5c-1
注意:單個報頭只需要由報頭傳入選擇以下兩種方式之一:b3
在格式中traceid-parentid-sampled
system property :
-ddd.propagation.style.inject=datadog,b3-ddd.propagation.style.extract=datadog,b3environment variable:
dd_propagation_style_inject=datadog,b3dd_propagation_style_extract=datadog,b3