本文是對Zipkin官網(wǎng)架構(gòu)介紹頁面的翻譯。Zipkin官網(wǎng)的翻譯點擊這里掺喻。
架構(gòu)Architecture
架構(gòu)概覽
追蹤器存在于應用程序內(nèi)尼酿,能夠記錄發(fā)生操作的耗時與元數(shù)據(jù)抹蚀。They often instrument libraries(它經(jīng)常像Zipkin的函數(shù)庫發(fā)送信息),所以它們的使用對用戶是透明的郭变。舉個例子:一個裝有追蹤器的web server服務器會在它收到請求與發(fā)送響應的時候進行記錄颜价。被收集的數(shù)據(jù)稱為Span。
Instrumentation 在編寫時就考慮到應用在生產(chǎn)環(huán)境的安全性诉濒,并且具有很小的開銷周伦。由于這一原因,它只在in-band內(nèi)傳播ID以告訴接收者這里有一個追蹤正在發(fā)生未荒。完成后的Span會報告給band外的Zipkin专挪,類似于異步的應用報告。
例如:當跟蹤一個操作片排,并且該操作需要向外發(fā)送一個http請求時寨腔,會添加header來傳播ID。header不會用于發(fā)送如操作名稱這樣的詳細信息率寡。
裝有追蹤器的APP應用中的組件可以向Zipkin發(fā)送數(shù)據(jù)迫卢,它們被稱為Reporter。Reporter通過幾種傳送方式之一來向Zipkin的收集器collertor發(fā)送trace data追蹤數(shù)據(jù)勇劣。收集器collertor會將追蹤數(shù)據(jù)傳給Storage靖避。之后storage中的數(shù)據(jù)會被API查詢來獲取數(shù)據(jù)展示到前端UI中潭枣。
下面的圖表描述了該過程:
查看是否有支持您平臺的instrumentation library,請查看 existing instrumentations列表
Example flow
正如在概述中提到的幻捏,標識符ID在band內(nèi)傳播盆犁,而詳細信息在band外傳輸給Zipkin。追蹤器負責創(chuàng)建有效的追蹤并正確的展現(xiàn)它們篡九。例如:追蹤器要確保它在band內(nèi)發(fā)送的數(shù)據(jù)與band外異步發(fā)送給Zipkin的數(shù)據(jù)保持一致谐岁。
下面是一個http跟蹤的示例流程,例子中用戶調(diào)用 /foo 的資源榛臼。這會產(chǎn)生一個span伊佃,并當用戶獲取到http的響應時會異步發(fā)送給Zipkin。
┌─────────────┐ ┌───────────────────────┐ ┌─────────────┐ ┌──────────────────┐
│ User Code │ │ Trace Instrumentation │ │ Http Client │ │ Zipkin Collector │
└─────────────┘ └───────────────────────┘ └─────────────┘ └──────────────────┘
│ │ │ │
┌─────────┐
│ ──┤GET /foo ├─? │ ────┐ │ │
└─────────┘ │ record tags
│ │ ?───┘ │ │
────┐
│ │ │ add trace headers │ │
?───┘
│ │ ────┐ │ │
│ record timestamp
│ │ ?───┘ │ │
┌─────────────────┐
│ │ ──┤GET /foo ├─? │ │
│X-B3-TraceId: aa │ ────┐
│ │ │X-B3-SpanId: 6b │ │ │ │
└─────────────────┘ │ invoke
│ │ │ │ request │
│
│ │ │ │ │
┌────────┐ ?───┘
│ │ ?─────┤200 OK ├─────── │ │
────┐ └────────┘
│ │ │ record duration │ │
┌────────┐ ?───┘
│ ?──┤200 OK ├── │ │ │
└────────┘ ┌────────────────────────────────┐
│ │ ──┤ asynchronously report span ├────? │
│ │
│{ │
│ "traceId": "aa", │
│ "id": "6b", │
│ "name": "get", │
│ "timestamp": 1483945573944000,│
│ "duration": 386000, │
│ "annotations": [ │
│--snip-- │
└────────────────────────────────┘
跟蹤器采用異步發(fā)送span數(shù)據(jù)是為了防止追蹤系統(tǒng)發(fā)送延遲與發(fā)送失敗導致用戶系統(tǒng)的延遲與中斷沛善。
Transport
由追蹤器手機的span必須從被追蹤的service傳送到Zipkin收集器航揉。有三種主要的傳送方式:http、Kafka以及Scribe(Facebook開源的日志收集系統(tǒng))金刁。
Components
Zipkin由4個組件構(gòu)成:
- collector
- storage
- search
- web UI
Zipkin Collector
一旦追蹤數(shù)據(jù)到達Zipkin collector 守護進程帅涂,會由collector 進行驗證、存儲以及為查詢建立索引尤蛮。
Storage
Zipkin創(chuàng)建時就會使用Cassandra (一種Nosql數(shù)據(jù)庫)來存儲數(shù)據(jù)媳友,因為Cassandra 可擴展、具有靈活的schema并且被Twitter大量使用产捞。然而醇锚,這一組件是可使用其他插件的。除了Cassandra 外坯临,我們還支持ElasticSearch 和MySQL焊唬。其他后端可以作為第三方插件使用。
Zipkin Query Service
當數(shù)據(jù)被存儲于建立索引后尿扯,我們需要一個方式來獲取這些數(shù)據(jù)求晶。查詢進程提供了簡單的JSON API接口來查找與獲取追蹤數(shù)據(jù)。這些API的主要使用者是Web UI.
Web UI
我們創(chuàng)建了GUI來提供界面衷笋,很好的展現(xiàn)追蹤數(shù)據(jù)芳杏。Web UI在service、time以及annotation基礎(chǔ)上提供了方法來查看追蹤數(shù)據(jù)辟宗。需要注意的是:在UI中沒有內(nèi)置的認證功能爵赵。