以下是小馬整理總結(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值;
小馬把它通俗理解為這兩為追蹤系統(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)目。(這段百科是沒有的哈)


什么意思呢?借用一下別的朋友整理的內(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)用

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)控到程序中的代碼片段(如方法):

調(diào)用:

可見,使用trace會(huì)入侵部分代碼,特別是追蹤一個(gè)方法,但這是不可避免的。甚至需要每個(gè)方法都需要添加上ctx。
思考:日志流水號(hào)是如何傳遞的,每條鏈路全局name還是span父級(jí)名稱還是span中的某個(gè)數(shù)據(jù)?

參考文獻(xiàn):