自定義 traceId 是使用 extract TextMapAdapter 實現的

Mondo 科技 更新 2024-01-31

一些具體場景需要我們去實現自定義跟蹤 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-traceidx-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,b3
environment variable:

dd_propagation_style_inject=datadog,b3dd_propagation_style_extract=datadog,b3

相關問題答案

    燃氣器具逾期使用或使用不當的嚴重危害

    天然氣和法律。作者 劉金平.燃氣燃燒器具是重要的燃氣燃燒裝置,是一種特殊的商品,與人們的生活息息相關。國家燃氣燃燒器具實行強制性認證,嚴格規範產品的質量和使用壽命。人們每天都要做飯,還要與燃氣器具打交道,這些都是人們生活中不可缺少的用品。燃氣燃燒器具能否正常使用,關係到燃氣的安全執行和人民群眾的生命...

    停車場可以使用空調嗎?停車和使用空調需要多長時間而不傷車?

    停車時可以使用空調。但是,空調的使用應保持在適當的範圍內,以免使車輛的電池和發動機過度緊張。具體來說,停車使用空調的時間不宜過長,最好不超過分鐘。在空調使用過程中,汽車的電池供電電壓會下降,如果使用時間過長,可能會電池耗盡而無法啟動,導致車輛無法正常行駛。此外,長時間使用空調也會增加發動機的負荷,尤...

    使用 AI 的虛擬裝扮應用程式的使用量猛增

    標籤 虛擬裝扮應用程式 人工智慧技術 深度偽造色情 社交 私隱與安全 法律風險。近年來,隨著人工智慧技術的不斷進步,虛擬著裝應用在社交 平台上的使用率不斷上公升。然而,這背後有乙個令人擔憂的趨勢,那就是未經同意的色情製品的發展和傳播。通過使用 AI 在 這些應用程式可以使人們看起來像 然而,這種行為...

    使用 scikit learn 實現 TF IDF

    詞頻 逆文件頻率 TF IDF 是一種流行的統計方法,它量化了文件中和整個語料庫中單詞的重要性,為資訊檢索 文件聚類和文字分類等任務提供了有價值的見解。它使使用者能夠輕鬆地將原始文字資料轉換為有意義的數字表示,機器 習 模型可用於情感分析 主題建模 文件相似性檢測等。開發人員可以在他們的專案中利用 ...

    SentinelOne 使用 SSO 登入

    富聯資訊Sentinelone中國 和服務提供商。Sentinelone以色列辦事處內部檢視 Sentinelone 管理控制台支援將 SAML 與 OKTA 結合使用,以提供單點登入 SSO 服務。登入時會自動顯示 SSO 選項。使用者根據其電子郵件域連線到帳戶或站點,無需輸入站點名稱即可登入。要...