APM工具對比
本文轉自:APM工具對比
市面上有很多分布式鍊路監控的工具,客觀對比。
調研
市面上的APM(Application Performance Management)理論模型大多都是借鑒,Google Dapper論文。
我最近也在選取使用哪一個工具,這裡的對比是在Spring Cloud 中的使用。
對比三種工具:
- zipkin:Twitter公司開源的一個分布式追蹤工具,被Spring Cloud Sleuth內建,使用廣泛而穩定
- skywalking:中國人吳晟(華為)開源的一款分布式追蹤,分析,告警的工具,現在是Apache旗下開源項目
- cat:大衆點評開源的一款分布式鍊路追蹤工具。
整體架構
zipkin
zipkin分為zipkin服務端和用戶端,每一個被監控的服務都是用戶端。
元件:
- 追蹤器:位于用戶端,并記錄有關發生的操作的時間和中繼資料,對使用者透明
- Reporter: 将資料發送到Zipkin的檢測應用程式
- Transport :傳輸資料:HTTP, Kafka and Scribe.
- Collector:位于服務端中,收集傳輸來的資料
- Storage :存儲資料,預設存儲在記憶體中
- search :查詢api,JSON應用程式設計接口,被UI調用
- UI :Web UI提供了一種基于服務,時間Annotation檢視跟蹤的方法。UI中沒有内置身份驗證
skywalking
元件:
skywalking分為四個部分:探針,平台後端,存儲,UI
- Probes,探針,探針因使用的語言不同而不通,收集資料并且格式化為skywalking所需的格式。
- Platform backend 平台後端,對應于zipkin server,可以叢集部署,聚合,分析,将資料展示在UI中
- Storage:存儲,可擴充的存儲,可以使es,H2,MySQL叢集
- UI 豐富的可視化功能,提供身份驗證
cat
- cat-client 業務子產品,埋點,發送消息給consumer
- cat-consumer,分析從client接收的資料
- cat-home 将資料展示在控制端
- 存儲
基本原理
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-- │
└────────────────────────────────┘
當發起一個調用,Trace Instrumentation會攔截請求,添加tag,添加traceID和spanID進http頭,當服務傳回時,它會異步地向Collector發送資料。Collector受到資料後存儲,分析,同時UI會展示資料在界面上。
skywalking
探針将資料通過gRPC或者HTTP傳輸給後端平台(server),後端平台将資料存儲在Storage中,并且分析資料将結果展示在UI中
cat
用戶端:收集資料通過ThreadLocal,将資料存在ThreadLocal中,當結束時發送資料給服務端。
舉例:
序列化與通信:自定義的序列化協定,Netty資料傳輸
服務端:
監控模型:
- Transaction:适合記錄跨越系統邊界的程式通路行為,比如遠端調用,資料庫調用,也适合執行時間較長的業務邏輯監控,Transaction用來記錄一段代碼的執行時間和次數
- Event:用來記錄一件事發生的次數,開銷較小
- Heartbeat:表示程式内定期産生的統計資訊, 如CPU使用率, 記憶體使用率, 連接配接池狀态, 系統負載等
- Metric:用于記錄業務名額、名額可能包含對一個名額記錄次數、記錄平均值、記錄總和,業務名額最低統計粒度為1分鐘
類别 | 實作方式 |
---|---|
zipkin | 攔截請求 |
skywalking | java探針,位元組碼增強 |
cat | 代碼埋點 |
接入方式
類别 | 接入方式 | agent到collector的協定 |
---|---|---|
zipkin | sleuth,引入依賴和配置 | http,mq |
skywalking | javaanent | gRPC,http |
cat | 代碼侵入 | http/tcp |
資料收集
類别 | 資料 |
---|---|
zipkin | 鍊路,耗時 |
skywalking | 鍊路,耗時,cpu,mem,JVM |
cat | 鍊路,耗時,cpu,mem,JVM |
UI
類别 | 豐富度 |
---|---|
zipkin | 一般 |
skywalking | 豐富 |
cat | 豐富 |
資料存儲方案
類别 | 存儲方案 |
---|---|
zipkin | 記憶體,mysql,es,Cassandra |
skywalking | es,mysql,h2,TiDB |
cat | mysql,hdfs |
支援語言
類别 | 語言 |
---|---|
zipkin | C#,Go,Java,JS,Ruby,Scala,PHP;社群支援c++,Python |
skywalking | Java,c#,PHP,Node.js |
cat | Java, C/C++, Node.js, Python, Go |
使用者
類别 | 使用者 |
---|---|
zipkin | 多 |
skywalking | 多 |
cat | 較多 |
版本疊代速度
類别 | 速度 |
---|---|
zipkin | 快 |
skywalking | 快 |
cat | 慢 |
其它
類别 | 作者 | 粒度 | traceID查詢 | 告警 | 依賴分析 | OpenTracing标準 |
---|---|---|---|---|---|---|
zipkin | 接口級 | yes | no | yes | 部分支援 | |
skywalking | 吳晟,華為 | 方法級 | yes | yes | yes | 完全支援 |
cat | 吳其敏,尤勇,大衆點評 | 代碼級 | no | yes | no | 不支援 |
注:OpenTracing通過提供平台無關、廠商無關的API,使得開發人員能夠友善的添加(或更換)追蹤系統的實作。
總結
zipkin
- 優點:輕量級,springcloud內建,使用人數多,成熟
- 不足:功能簡單,隻有鍊路監控
skywalking
- 優點:采集資料豐富,UI友好,擴充性高,使用者多,支援中間件以及架構多,社群活躍
- 不足:成熟度不夠高
cat
- 優點采集資料非常豐富,UI友好,粒度最細
- 代碼侵入,需改動業務代碼,git不夠活躍,更新緩慢,存儲支援不夠廣泛
這些工具各有長短,根據實際場景不同選擇之。
參考文檔
https://zipkin.io/
https://github.com/apache/skywalking
https://github.com/dianping/cat/wiki
https://juejin.im/post/5a274614518825592c07f8b8
https://www.jianshu.com/p/0fbbf99a236e