opentracing(開放分布式追蹤) + jaeger初探

以下是小馬整理總結(jié)的入門理解筆記,助于入門和理解分布式鏈路追蹤,opentracing(開放分布式追蹤) + jaeger。

一、背景

舉個(gè)例子,一個(gè)場(chǎng)景下,一個(gè)請(qǐng)求進(jìn)來(lái),入口服務(wù)是 serviceA, serviceA 接到請(qǐng)求后訪問數(shù)據(jù)庫(kù)讀取用戶數(shù)據(jù),然后向 serviceB 發(fā)起 rpc,serviceB 收到 rpc 請(qǐng)求時(shí)同時(shí)向后端服務(wù) serviceC 和 serviceD 發(fā)起請(qǐng)求,等待請(qǐng)求回復(fù)后再返回 serviceA 的 rpc 調(diào)用。如果我們發(fā)現(xiàn)發(fā)起的請(qǐng)求失敗,或者請(qǐng)求的時(shí)延很大,我們?cè)撊绾稳ザㄎ荒兀?/p>

基于這個(gè)需求,我們將服務(wù)介入追蹤系統(tǒng)。相比單體的系統(tǒng),在分布式,微服務(wù)系統(tǒng)中似乎更能發(fā)揮重要性。

二、OpenTracing

opentracing(中文文檔)是一套分布式追蹤協(xié)議,與平臺(tái),語(yǔ)言無(wú)關(guān),統(tǒng)一接口,方便開發(fā)接入不同的分布式追蹤系統(tǒng)。

語(yǔ)義規(guī)范: 描述定義的數(shù)據(jù)模型 Tracer,Span和 SpanContext 等;

語(yǔ)義慣例: 羅列出 tag 和 logging 操作時(shí),標(biāo)準(zhǔn)的key值;

trace和span

小馬把它通俗理解為這兩為追蹤系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)。用于傳遞鏈路調(diào)用中的信息。

三、Jaeger

那么這個(gè)數(shù)據(jù)結(jié)構(gòu)/協(xié)議怎么在整個(gè)系統(tǒng)調(diào)用鏈路中穿梭呢?借助Jaeger來(lái)看看。

Jaeger?(?yā-g?r) 是Uber開源的一個(gè)基于Go的分布式追蹤系統(tǒng),受啟發(fā)于 dapper 和 OpenZipkin,兼容 OpenTracing 標(biāo)準(zhǔn),CNCF的開源項(xiàng)目。(這段百科是沒有的哈)

組成部分
和上圖一個(gè)意思

什么意思呢?借用一下別的朋友整理的內(nèi)容來(lái)看。整個(gè)過(guò)程說(shuō)起來(lái)非常簡(jiǎn)單,Client寫入trace數(shù)據(jù),傳遞到正在監(jiān)聽的Agent,Agent將span等數(shù)據(jù)發(fā)到Collector,?Collector將數(shù)據(jù)存儲(chǔ),后面就是提供UI和query了。

四、代碼中實(shí)現(xiàn)

如何部署呢?集成后鏡像安裝比較簡(jiǎn)單,這里就不贅述了。GO語(yǔ)言為例,來(lái)看下調(diào)用,以下樣例代碼來(lái)自其他文章,僅供參考理解,非小馬親踐,感謝作者分享,原文傳送門。

小馬理解為就是在解決span數(shù)據(jù)的傳遞。

1、單體中通過(guò)上下文調(diào)用

關(guān)鍵代碼

2、跨應(yīng)用通過(guò)grpc中間件使用

在單體程序中, 父子Span通過(guò)context關(guān)聯(lián), 而context是在內(nèi)存中的, 顯而易見這樣的方法在垮應(yīng)用的場(chǎng)景下是行不通的??鐟?yīng)用通訊使用的方式通常是"序列化", 在jaeger-client-go庫(kù)中也是通過(guò)類似的操作去傳遞信息, 它們叫:Tracer.Inject() 與 Tracer.Extract()。

其中inject方法支持將span系列化成幾種格式:

Binary: 二進(jìn)制

TextMap: key=>value

HTTPHeaders: Http頭, 其實(shí)也是key=>value

正好grpc支持傳遞metadata也是string的key=>value形式, 所以我們就能通過(guò)metadata實(shí)現(xiàn)在不同應(yīng)用間傳遞Span了。

寫好服務(wù)端,客戶端后,在業(yè)務(wù)代碼中封裝方法監(jiān)控到程序中的代碼片段(如方法):

關(guān)鍵代碼

調(diào)用:

可見,使用trace會(huì)入侵部分代碼,特別是追蹤一個(gè)方法,但這是不可避免的。甚至需要每個(gè)方法都需要添加上ctx。

思考:日志流水號(hào)是如何傳遞的,每條鏈路全局name還是span父級(jí)名稱還是span中的某個(gè)數(shù)據(jù)?

參考文獻(xiàn):

官方文檔

文章1

文章2

文章3

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容