使用 OpenTelemetry 構(gòu)建可觀測(cè)性 05 - 傳播和行李(Propagation & Baggage
我們開(kāi)發(fā)的應(yīng)用程序可能具有不同的形態(tài)和架構(gòu):有些是單體應(yīng)用,有些是微服務(wù)。為單體應(yīng)用程序添加遙測(cè)數(shù)據(jù)相對(duì)來(lái)說(shuō)簡(jiǎn)單,因?yàn)樗袛?shù)據(jù)都在同一進(jìn)程中。然而對(duì)于微服務(wù)應(yīng)用程序,情況可能會(huì)更具挑戰(zhàn)性。
通常,分布式微服務(wù)應(yīng)用程序的不同服務(wù)之間僅通過(guò)網(wǎng)絡(luò)連接。然而,當(dāng)我們想要?jiǎng)?chuàng)建有效的鏈路追蹤數(shù)據(jù),就要考慮到下面的問(wèn)題:

即使是微服務(wù)應(yīng)用程序,我們也希望觀察到從開(kāi)始到結(jié)束的用戶路徑,這意味著跨越多個(gè)服務(wù)的邊界。這就是我們所說(shuō)的分布式鏈路追蹤。不過(guò)我們?nèi)绾螌?shí)現(xiàn)這一點(diǎn)呢?我們?nèi)绾问规溌纷粉櫺畔⒇灤┛赡苁欠植荚诙鄠€(gè)進(jìn)程,并且是不同的基礎(chǔ)架構(gòu)上呢?
傳播( propagation )
在 OpenTelemetry 中,解決這個(gè)挑戰(zhàn)的方案是通過(guò)傳播來(lái)實(shí)現(xiàn)。這意味著以某種方式將鏈路追蹤 ID(和父跨度 ID)傳遞給被調(diào)用服務(wù),以便它們可以將該信息添加到分布式鏈路追蹤路徑中的一個(gè)跨度上。下面是一個(gè)示意圖:

這里我們有三個(gè)服務(wù),通過(guò)使用傳播,我們能夠?qū)⒏?ID 和父跨度 ID 作為頭信息傳遞。在 Go 中,傳播可以通過(guò)全局設(shè)置來(lái)處理:
在示例代碼中,我們可以在控制器層(Handler,通常用于處理HTTP請(qǐng)求并生成相應(yīng)的響應(yīng),承擔(dān)的作用包括路由和請(qǐng)求分發(fā),請(qǐng)求處理邏輯,響應(yīng)生成)進(jìn)行設(shè)置:
當(dāng)從一個(gè)服務(wù)發(fā)送 HTTP 請(qǐng)求到另一個(gè)服務(wù)時(shí),可通過(guò)?otelhttp
?庫(kù)的輔助函數(shù)來(lái)創(chuàng)建和管理分布式追蹤的跨度對(duì)象:
行李(Baggage)
從上圖中可以看出??service 1
?生成了一些數(shù)據(jù)?attr1
?。這些與?service 1
?相關(guān)的數(shù)據(jù)可能要添加到?service 2
?或?service 3
?所在跨度對(duì)象的屬性中。由于這些服務(wù)可能無(wú)法直接訪問(wèn)此數(shù)據(jù),在 OpenTelemetry 中是通過(guò)行李來(lái)解決這個(gè)問(wèn)題。行李本質(zhì)上是攜帶額外信息的鍵值對(duì),通過(guò)請(qǐng)求傳遞數(shù)據(jù)給不同服務(wù)和組件。
在 Go 中,我們可以通過(guò)以下方式添加行李信息:
?
這樣設(shè)置后我們的 HTTP 請(qǐng)求將包括?req.addr
?行李 。
后續(xù)消費(fèi)端的服務(wù)(在圖中,這可能是?service 2
?或?service 3
?),就可以從請(qǐng)求上下文中解析行李:
此代碼解析行李信息,并將其作為當(dāng)前跨度的屬性添加進(jìn)去。
示例
經(jīng)過(guò)之前對(duì)傳播和行李的討論,現(xiàn)在讓我們看看 OpenTelemetry 如何發(fā)送這些數(shù)據(jù)。在示例的購(gòu)物車應(yīng)用程序中,如果我發(fā)出請(qǐng)求并從價(jià)格服務(wù)或用戶服務(wù)中查看請(qǐng)求頭,將會(huì)看到以下兩行信息:
Baggage: req.addr=10.244.0.11%3A60086 Traceparent: 00-9861e8c7b097206fed82e0f6b379aae0-4aa019606aed70b6-01
請(qǐng)求頭?Traceparent
?是鏈路追蹤 ID(本例中是“9861e8c7b097206fed82e0f6b379aae0”)和父跨度 ID (“4aa019606aed70b6”)。還有一個(gè)?Baggage
?,其中包括在請(qǐng)求發(fā)起的源服務(wù)(購(gòu)物車服務(wù)),它被添加到?req.addr
?行李中。下圖可以看到?req.addr
?行李在用戶服務(wù)中被引用:

總結(jié)
在 OpenTelemetry 中通過(guò)使用傳播和行李,很好的解決了“分布式鏈路追蹤”中“分布式”的問(wèn)題。這樣可以幫助您獲取更有價(jià)值的鏈路追蹤數(shù)據(jù)!
本文翻譯自:https://trstringer.com/otel-part5-propagation/
擴(kuò)展閱讀:
方法論:面向故障處理的可觀測(cè)性體系建設(shè)(https://flashcat.cloud/blog/construction-of-observability-system-for-fault-processing/)
白皮書(shū):事件 OnCall 中心建設(shè)方法(https://download.flashcat.cloud/flashduty-white-paper-v1.pdf)
好工具:FlashDuty - 一站式告警處理平臺(tái):告警降噪、排班OnCall(https://flashcat.cloud/product/flashduty/)