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,Span之間有依賴關系,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、是否采樣。