基于OpenTelemetry實現(xiàn)可觀測性-Part 5 傳播與Baggage

澤注:這是一個系列,共分成6部分,這是第5部分。翻譯自:https://trstringer.com/otel-part5-propagation/

我們開發(fā)的應(yīng)用程序各式各樣的,有些是單體的供炎,有些是微服務(wù)的渴逻。單體應(yīng)用添加遙測相當(dāng)容易,因為所有的數(shù)據(jù)都在同一進(jìn)程中音诫。但是惨奕,微服務(wù)就有挑戰(zhàn)了。很多時候竭钝,它只是連接分布式應(yīng)用之間不同服務(wù)的網(wǎng)絡(luò)梨撞。即使這樣,這個挑戰(zhàn)也無法阻止我們建立有效的鏈路追蹤蜓氨,如下圖:

傳播

即使是微服務(wù)應(yīng)用聋袋,我們也希望看到一個類似的追蹤,追蹤用戶的路徑從開始到結(jié)束穴吹,即使是跨越多個服務(wù)的邊界幽勒。這就是我們所說的分布式跟蹤。但是我們怎樣才能實現(xiàn)這一點(diǎn)呢港令?我們怎樣才能追蹤跨越多個進(jìn)程的鏈路啥容,這些進(jìn)程還可能運(yùn)行在非常不同的基礎(chǔ)設(shè)施上?

傳播(Propagation)

OpenTelemetry 對這一挑戰(zhàn)的回答是傳播顷霹。這就是我們?nèi)绾螌⒆粉?ID(和父跨度 ID)傳輸?shù)奖徽{(diào)用的服務(wù)咪惠,以便它們可以將跨度添加到分布式調(diào)用鏈中×艿恚可視化后如下:

Propagation

這三個服務(wù)遥昧,通過使用傳播,我們能夠?qū)⒏?ID 和父跨度 ID 作為header進(jìn)行傳輸朵纷。在 Go 中炭臭,我們可以通過全局設(shè)置來處理傳播:

import (
    "go.opentelemetry.io/otel"
    "go.opentelemetry.io/otel/propagation"
)

// ...

otel.SetTextMapPropagator(
    propagation.NewCompositeTextMapPropagator(
        propagation.TraceContext{},
        propagation.Baggage{}),
)

在服務(wù)器實例化過程中,我們可以在處理器級別設(shè)置:

http.Handle(
    fmt.Sprintf("/%s/", rootPath),
    otelhttp.NewHandler(
        http.HandlerFunc(userCart),
        "http_user_cart",
        otelhttp.WithTracerProvider(otel.GetTracerProvider()),
        otelhttp.WithPropagators(otel.GetTextMapPropagator()),
    ))

當(dāng)我從該服務(wù)向其他服務(wù)發(fā)出 HTTP 請求時袍辞,我可以使用 otelhttp 添加輔助函數(shù)以向請求添加跨度:

import "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"  
// ...  
resp, err := otelhttp.Get(ctx, fmt.Sprintf("%s/%s", userServiceEndpoint, userName))

背包(Baggage)

在上圖中鞋仍,您會注意到“service 1”生成了一些名為“attr1”的數(shù)據(jù)。這是與“service 1”相關(guān)的數(shù)據(jù)搅吁,這可能是我們想要添加到“service 2”和/或“service 3”中的跨度的屬性威创。但是這些服務(wù)可能無法訪問這些特定數(shù)據(jù)。我們使用 OpenTelemetry 解決這個問題的方法是使用 baggage谎懦。 Baggage 本質(zhì)上允許我們通過請求傳遞數(shù)據(jù)以供其他服務(wù)使用肚豺。

在Go中,我們增加baggage的方法如下:

reqAddrBaggage, err := baggage.NewMember("req.addr", r.RemoteAddr)
if err != nil {
    // Handle error...
}

reqBaggage, err := baggage.New(reqAddrBaggage)
if err != nil {
    // Handle error...
}
ctx = baggage.ContextWithBaggage(ctx, reqBaggage)

現(xiàn)在我們的HTTP請求中將帶有baggage req.addr界拦。

在消費(fèi)服務(wù)中(在圖中详炬,這可能是service 2service 3),對從baggage中解析請求:

import "go.opentelemetry.io/otel/baggage"

// ...

reqBaggage := baggage.FromContext(ctx)
span.SetAttributes(attribute.String(
    "req.addr",
    reqBaggage.Member("req.addr").Value()),
)

該代碼從請求baggage中取出數(shù)據(jù),并將其它作為跨度屬性寫入到當(dāng)前跨度呛谜。

案例

我們已經(jīng)談到了傳播和baggage,但現(xiàn)在讓我們看看OpenTelemetry是如何發(fā)送這些數(shù)據(jù)的枪萄。在我的示例購物車應(yīng)用中隐岛,如果我發(fā)起一個請求,并從價格或用戶服務(wù)中轉(zhuǎn)儲header信息瓷翻,那么我將看到以下兩個頭信息:

Baggage: req.addr=10.244.0.11%3A60086 
Traceparent: 00-9861e8c7b097206fed82e0f6b379aae0-4aa019606aed70b6-01

traceparent頭顯示了trace ID(在本例中是 "9861e8c7b097206fed82e0f6b379aae0")和父跨度ID("4aa019606aed70b6")聚凹。還有一個baggage頭,包括在源服務(wù)(購物車)中添加的req.addr baggage成員齐帚。我們可以看到這個baggage在用戶服務(wù)中被引用:

baggage

總結(jié)

OpenTelemetry對 "分布式跟蹤 "的 "分布式 "部分有很好的支持妒牙,通過傳播和baggage的使用。這真的讓你有能力做出有意義的追蹤对妄,并收集有用的數(shù)據(jù)湘今!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市剪菱,隨后出現(xiàn)的幾起案子摩瞎,更是在濱河造成了極大的恐慌,老刑警劉巖孝常,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件旗们,死亡現(xiàn)場離奇詭異,居然都是意外死亡构灸,警方通過查閱死者的電腦和手機(jī)上渴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來喜颁,“玉大人稠氮,你說我怎么就攤上這事÷宄玻” “怎么了括袒?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長稿茉。 經(jīng)常有香客問我锹锰,道長,這世上最難降的妖魔是什么漓库? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任恃慧,我火速辦了婚禮,結(jié)果婚禮上渺蒿,老公的妹妹穿的比我還像新娘痢士。我一直安慰自己,他們只是感情好茂装,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布怠蹂。 她就那樣靜靜地躺著善延,像睡著了一般。 火紅的嫁衣襯著肌膚如雪城侧。 梳的紋絲不亂的頭發(fā)上易遣,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機(jī)與錄音嫌佑,去河邊找鬼豆茫。 笑死,一個胖子當(dāng)著我的面吹牛屋摇,可吹牛的內(nèi)容都是我干的揩魂。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼炮温,長吁一口氣:“原來是場噩夢啊……” “哼火脉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起茅特,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤忘分,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后白修,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體妒峦,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年兵睛,在試婚紗的時候發(fā)現(xiàn)自己被綠了肯骇。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡祖很,死狀恐怖笛丙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情假颇,我是刑警寧澤胚鸯,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站笨鸡,受9級特大地震影響姜钳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜形耗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一哥桥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧激涤,春花似錦拟糕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽侠草。三九已至,卻和暖如春犁嗅,著一層夾襖步出監(jiān)牢的瞬間梦抢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工愧哟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人哼蛆。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓蕊梧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親腮介。 傳聞我的和親對象是個殘疾皇子肥矢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容