一、OpenTracing是什么
OpenTracing是一種分布式系統(tǒng)鏈路跟蹤的設(shè)計原則、規(guī)范礁竞、標準。
傳統(tǒng)的監(jiān)控包括業(yè)務(wù)指標監(jiān)控杉辙、服務(wù)質(zhì)量監(jiān)控等模捂,只能對業(yè)務(wù)能的整體性能進行監(jiān)控,而隨著微服務(wù)和分布式的盛行奏瞬,一個業(yè)務(wù)系統(tǒng)會由很多個服務(wù)組成,服務(wù)之間會進行相互調(diào)用泉孩。每一個前端請求都會形成一個復(fù)雜的分布式服務(wù)調(diào)用鏈路硼端。這將導(dǎo)致的問題是:
- 出問題后難以定位問題
- 無法準確獲取系統(tǒng)的整體性能和運行情況
- 無法獲取對服務(wù)之間的調(diào)用關(guān)系
分布式鏈路追蹤技術(shù)應(yīng)運而生,但是要讓自己的應(yīng)用支持分布式跟蹤太難了寓搬!不僅需要在進程內(nèi)進行跟蹤數(shù)據(jù)的傳遞珍昨,還要在進程之間傳遞。更難的是,還需要其他組件對分布式跟蹤的支持镣典,其中包括:
- 開源的服務(wù)(比如NGINX, Cassandra, Redis兔毙,Mysql)
- 在服務(wù)內(nèi)引入的開源庫(比如 grpc, ORMs)
- 已有的業(yè)務(wù)邏輯
解決辦法是制定一個統(tǒng)一的標準,然后讓大家都遵守這個標準來實現(xiàn)分布式跟蹤信息的描述和傳遞兄春。這樣只要使用的是按照標準實現(xiàn)的服務(wù)澎剥,就能夠進行完整的分布式跟蹤。這個標準就是OpenTracing赶舆。
二哑姚、OpenTracing做了什么
OpenTracing實現(xiàn)了:
- 后臺無關(guān)的一套接口,被跟蹤的服務(wù)只需要調(diào)用這套接口芜茵,就可以被任何實現(xiàn)這套接口的跟蹤后臺(比如Zipkin, Jaeger等等)支持叙量,而作為一個跟蹤后臺,只要實現(xiàn)了個這套接口九串,就可以跟蹤到任何調(diào)用這套接口的服務(wù)
- 標準化了對跟蹤最小單位Span的管理:定義了開始Span绞佩,結(jié)束Span和記錄Span耗時的API。Span的定義可以參照開源分布式跟蹤系統(tǒng)Zipkin介紹(架構(gòu)篇)
- 標準化了進程間跟蹤數(shù)據(jù)傳遞的方式:定義了一套API方便跟蹤數(shù)據(jù)的傳遞
- 標準化了進程內(nèi)當前Span的管理:定義了存儲和獲取當前Span的API
OpenTracing沒有實現(xiàn):
- 不對進程間傳遞的跟蹤數(shù)據(jù)的編碼定標準
- 不對向后臺發(fā)送的跟蹤數(shù)據(jù)的編碼定標準
- 原因:讓跟蹤后臺自己決定最適合他們的編碼方式
三猪钮、OpenTracing的架構(gòu)
OpenTracing架構(gòu)圖
- 應(yīng)用代碼和開源控件寫代碼調(diào)用一套抽象出來的OpenTracing API(淺綠色的那一塊)品山。而實現(xiàn)OpenTracing API的代碼庫(深綠色的那一塊)則負責(zé)緩存和編碼跟蹤數(shù)據(jù),以及進程間跟蹤數(shù)據(jù)的上下文信息躬贡,以及如何和它自己的后臺系統(tǒng)進行通信
- 通過這樣的一種方式谆奥,應(yīng)用代碼就可以隨意的更換OpenTracing的實現(xiàn)而不用改一行自己的代碼。比如如果自己用Zipkin用得不爽了拂玻,就可以換到Jaeger后臺酸些。如果一開始直接調(diào)用Zipkin的API而不是OpenTracing的API,那么要換到Jaeger后臺就得把所有調(diào)用Zipkin API的地方都換成調(diào)用Jaeger API檐蚜,而OpenTracing免除了這方面的工作