天天看點

APM工具對比APM工具對比

APM工具對比

本文轉自:APM工具對比

市面上有很多分布式鍊路監控的工具,客觀對比。

調研

市面上的APM(Application Performance Management)理論模型大多都是借鑒,Google Dapper論文。

我最近也在選取使用哪一個工具,這裡的對比是在Spring Cloud 中的使用。

對比三種工具:

  • zipkin:Twitter公司開源的一個分布式追蹤工具,被Spring Cloud Sleuth內建,使用廣泛而穩定
  • skywalking:中國人吳晟(華為)開源的一款分布式追蹤,分析,告警的工具,現在是Apache旗下開源項目
  • cat:大衆點評開源的一款分布式鍊路追蹤工具。

整體架構

zipkin

APM工具對比APM工具對比

zipkin分為zipkin服務端和用戶端,每一個被監控的服務都是用戶端。

元件:

  • 追蹤器:位于用戶端,并記錄有關發生的操作的時間和中繼資料,對使用者透明
  • Reporter: 将資料發送到Zipkin的檢測應用程式
  • Transport :傳輸資料:HTTP, Kafka and Scribe.
  • Collector:位于服務端中,收集傳輸來的資料
  • Storage :存儲資料,預設存儲在記憶體中
  • search :查詢api,JSON應用程式設計接口,被UI調用
  • UI :Web UI提供了一種基于服務,時間Annotation檢視跟蹤的方法。UI中沒有内置身份驗證

skywalking

APM工具對比APM工具對比

元件:

skywalking分為四個部分:探針,平台後端,存儲,UI

  • Probes,探針,探針因使用的語言不同而不通,收集資料并且格式化為skywalking所需的格式。
  • Platform backend 平台後端,對應于zipkin server,可以叢集部署,聚合,分析,将資料展示在UI中
  • Storage:存儲,可擴充的存儲,可以使es,H2,MySQL叢集
  • UI 豐富的可視化功能,提供身份驗證

cat

APM工具對比APM工具對比
  • 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中,當結束時發送資料給服務端。

舉例:

APM工具對比APM工具對比

序列化與通信:自定義的序列化協定,Netty資料傳輸

服務端:

APM工具對比APM工具對比

監控模型:

  • 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 twitter 接口級 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

繼續閱讀