Zipkin簡介及基本概念
Zipkin簡介
Zipkin是 Twitter 的一個開源專案,基於 Google Dapper實現。可以使用它來收集各個伺服器上請求鏈路的跟蹤資料,並通過它提供的 REST API 介面來輔助我們查詢跟蹤資料以實現對分散式系統的監控程式,從而及時地發現系統中出現的延遲升高問題並找出系統性能瓶頸的根源。除了面向開發的API介面之外,它也提供了方便的 UI 元件幫助我們直觀的搜尋跟蹤資訊和分析請求鏈路明細,比如:可以查詢某段時間內各使用者請求的處理時間等。
上圖展示了Zipkin的基礎架構,主要由4個核心元件構成:
Collector:收集器元件,它主要用於處理從外部系統傳送過來的跟蹤資訊,將這些資訊轉換為Zipkin內部處理的Span格式,以支援後續的儲存、分析、展示等功能。
Storage:儲存元件,它主要對處理收集器接收到的跟蹤資訊,預設會將這些資訊儲存在記憶體中,我們也可以修改此儲存策略,通過使用其他儲存元件將跟蹤資訊儲存到 資料庫或es 中。
RESTful API:API元件,它主要用來提供外部訪問介面。比如給客戶端展示跟蹤資訊,或是外接系統訪問以實現監控等。
Web UI:UI元件,基於API元件實現的上層應用。通過UI元件使用者可以方便而有直觀地查詢和分析跟蹤資訊。
zipkin相關概念
Trace、Span、annotations註釋
1、Trace
Zipkin使用Trace結構表示對一次請求的跟蹤,一次請求可能由後臺的若干服務負責處理,每個服務的處理是一個Span
2、Span
每個服務的處理跟蹤是一個Span,可以理解為一個基本的工作單元,包含了一些描述資訊:id,parentId,name,timestamp,duration,annotations等,例如:
{ "traceId": "bd7a977555f6b982", #標記一次請求的跟蹤,相關的Spans都有相同的traceId; "name": "get-traces", #span的名稱,一般是介面方法的名稱 "id": "ebf33e1a81dc6f71", #span id "parentId": "bd7a977555f6b982", "timestamp": 1458702548478000, "duration": 354374, "annotations": [ { "endpoint": { "serviceName": "zipkin-query", "ipv4": "192.168.1.2", "port": 9411 }, "timestamp": 1458702548786000, "value": "cs" } ], "binaryAnnotations": [ { "key": "lc", "value": "JDBCSpanStore", "endpoint": { "serviceName": "zipkin-query", "ipv4": "192.168.1.2", "port": 9411 } } ] }
traceId:標記一次請求的跟蹤,相關的Spans都有相同的traceId;
id:span id;
name:span的名稱,一般是介面方法的名稱;
parentId:
可選的id,當前Span的父Span id,通過parentId來保證Span之間的依賴關係,
如果沒有parentId,表示當前Span為根Span;
timestamp:
Span建立時的時間戳,使用的單位是微秒(而不是毫秒),所有時間戳都有錯誤,
包括主機之間的時鐘偏差以及時間服務重新設定時鐘的可能性,
出於這個原因,Span應儘可能記錄其duration;
duration:持續時間使用的單位是微秒(而不是毫秒);
annotations註釋:用於及時記錄事件;有一組核心註釋用於定義RPC請求的開始和結束;
cs:Client Send,客戶端發起請求;
sr:Server Receive,伺服器接受請求,開始處理;
ss:Server Send,伺服器完成處理,給客戶端應答;
cr:Client Receive,客戶端接受應答從伺服器
上圖為一次請求的跟蹤,輸出的日誌依次為:微服務名、traceID、spanID、是否取樣。