zipkin是Twitter基於google的分佈式監控系統Dapper(論文)的開發源實現,zipkin用於跟蹤分佈式服務之間的應用數據鏈路,分析處理延時,幫助咱們改進系統的性能和定位故障。html
Instrumented client和Instrumented server是分佈式系統中的服務,經過裝備庫採集跟蹤信息,裝備庫再調用Transport,把跟蹤信息發送給zipkin。git
針對不一樣語言,不一樣RPC框架,有不一樣的裝備庫實現,目前已有實現列表見此,其中Brave是zipkin官方提供的Java的裝備庫。
一個裝備庫的實現須要考慮以下狀況:github
Transport是zipkin對外提供的接口,目前有HTTP、Kafka、Scribe三種。json
v2版本:
api
一個Span就是記錄[remoteEndpoint.serviceName]服務的[Span.name]方法的執行過程,其中的annotation記錄了中間的一些事件發生時間,經過這些時間能夠獲得[Span.name]方法的網絡傳輸時間,服務端執行時間,客戶端響應時間等信息,從而對其進行診斷優化。多個Span經過parentId構成一個樹形結構,根Span的parentId爲空,描述了一次trace(tranceId標識)中多個服務之間的調用過程。網絡
https://github.com/zhongpan/zipkin-ice
數據結構
假設service1.fun1中調用service2.fun2和service3.fun3,service2.fun2中調用service4.fun4。本次跟蹤各個服務中會建立如上的span1~span7,span1爲根span。span2和span4爲一次RPC的客戶端和服務端行爲,能夠共享spanid,span4不用新生成spanid,span2和span4在zipkin中會合併爲1個span,span3/span5以及span6/span7相似。最終,在zipkin界面展現的樹形結構爲:
架構