java apm工具


APM工具對比

本文轉自:APM工具對比

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

調研

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

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

對比三種工具:

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

整體架構

zipkin

[外鏈圖片轉存失敗(img-ZlnePiaU-1563283461136)(https://gentlezuo.github.io/2019/07/13/APM%E5%B7%A5%E5%85%B7%E5%AF%B9%E6%AF%94/architecture-skywalking.png)]

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

組件:

  • 追蹤器:位於客戶端,並記錄有關發生的操作的時間和元數據,對用戶透明
  • Reporter: 將數據發送到Zipkin的檢測應用程序
  • Transport :傳輸數據:HTTP, Kafka and Scribe.
  • Collector:位於服務端中,收集傳輸來的數據
  • Storage :存儲數據,默認存儲在內存中
  • search :查詢api,JSON應用編程接口,被UI調用
  • UI :Web UI提供了一種基於服務,時間Annotation查看跟蹤的方法。UI中沒有內置身份驗證

skywalking

[外鏈圖片轉存中...(img-L3X8OOIz-1563283325758)]

組件:

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

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

cat

[外鏈圖片轉存中...(img-vFXbimed-1563283325759)]

  • 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中,當結束時發送數據給服務端。

舉例:

[外鏈圖片轉存中...(img-hIH9tNTC-1563283325760)]

序列化與通信:自定義的序列化協議,Netty數據傳輸

服務端:

[外鏈圖片轉存中...(img-Q2prnIr9-1563283325761)]

監控模型:

  • 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM