天天看點

APM調用鍊産品對比

【轉載請注明出處】: https://www.jianshu.com/p/5184d7904c4b 随着企業經營規模的擴大,以及對内快速診斷效率和對外SLA(服務品質協定,service-level agreement)的追求,對于業務系統的掌控度的要求越來越高,主要展現在:

  • 對于第三方依賴的監控,實時/準實時了解第三方的健康狀況/服務品質,降低第三方依賴對于自身系統的擾動(服務降級、故障轉移)
  • 對于容器的監控,實時/準實時的了解應用部署環境(CPU、記憶體、程序、線程、網絡、帶寬)情況,以便快速擴容/縮容、流量控制、業務遷移
  • 業務方對于自己的調用情況,友善作容量規劃,同時對于突發的請求也能進行異常告警和應急準備
  • 自己業務的健康、性能監控,實時/準實時的了解自身的業務運作情況,排查業務瓶頸,快速診斷和定位異常,增加對自己業務的掌控力

同時,對于企業來說,能夠更精确的了解資源的使用情況,對于成本核算和控制也有非常大的裨益。

在這種情況下,一般都會引入APM(Application Performance Management & Monitoring)系統,通過各種探針采集資料,收集關鍵名額,同時搭配資料呈現和監控告警,能夠解決上述的大部分問題。

然而随着RPC架構、微服務、雲計算、大資料的發展,同時業務的規模和深度相比過往也都增加了很多,一次業務可能橫跨多個子產品/服務/容器,依賴的中間件也越來越多,其中任何一個節點出現異常,都可能導緻業務出現波動或者異常,這就導緻服務品質監控和異常診斷/定位變得異常複雜,于是催生了新的業務監控模式:調用鍊跟蹤--能夠分布式的抓取多個節點的業務記錄,并且通過統一的業務id(traceId,messageId,requestId等)将一次業務在各個節點的記錄串聯起來,友善排查業務的瓶頸或者異常點

産品對比

APM和調用鍊跟蹤均不是新誕生事務,很多公司已經有了大量的實踐,不過開源的并且能夠開箱即用的産品并不多,這裡主要選取了Pinpoint,Skywalking,CAT來進行對比(當然也有其他的例如Zipkin,Jaeger等産品,不過總體來說不如前面選取的3個完成度高),了解一下APM和調用鍊跟蹤在開源方面的發展狀态。

Pinpoint

是一個比較早并且成熟度也非常高的APM+調用鍊監控的項目,在全世界範圍内均有使用者使用,支援Java和PHP的探針,資料容器為HBase,其界面參考:

Skywalking

是一個新晉的項目,最近一兩年發展非常迅猛,本身支援OpenTracing規範,優秀的設計提供了良好的擴充性,支援Java、PHP、.Net、NodeJs探針,資料容器為ElasticSearch,其界面參考:

CAT

是由美團開源的一個APM項目,也曆經了多年的疊代更新,擁有大量的企業級使用者,對于監控和報警整合比較緊密,支援Java、C/C++、.Net、Python、Go、NodeJs,不過CAT目前主要通過侵入性的方式接入,資料容器包括HDFS(存儲原始資料)和mysql(二次統計),其界面參考:

橫向對比

上面隻是做了一個簡介,那這三個項目各自有什麼特色或者優勢/劣勢呢(三者的主要産品均針對Java,這裡也主要針對Java的特性)

優勢:

  • 大企業/長時間驗證,穩定性和完成度高
  • 探針收集的資料粒度比較細
  • HBase的資料密度較大,支援PB級别下的資料查詢
  • 代碼設計考慮的擴充性較弱,二次開發難度較大(探針為插件式,開發比較簡單)
  • 擁有完整的APM和調用鍊跟蹤功能

劣勢:

  • 代碼針對性強,擴充較難
  • 容器為HBase,查詢功能較弱(主要為時間次元)
  • 探針的額外消耗較多(探針采集粒度細,大概10%~20%)
  • 項目趨于成熟,而擴充難度較大,目前社群活躍度偏低,基本隻進行探針的增加或者更新
  • 缺少自定義名額的設計
  • 資料容器為ES,查詢支援的次元較多并且擴充潛力大
  • 項目設計采用微核心+插件,易讀性和擴充性都比較強
  • 主要的研發人員為華人并且均比較活躍,能夠進行更加直接的溝通
  • 項目發展非常快,穩定性有待驗證
  • ES資料密度較小,在PB級别可能會有性能壓力
  • 采用手動資料埋點而不是探針,資料采集的靈活性更強
  • 支援自定義名額
  • 代碼設計考慮的擴充性較弱,并且資料結構複雜,二次開發難度較大
  • 擁有完善的監控告警機制
  • 需要手動接入埋點,代碼侵入性強
  • APM功能完善,但是不支援調用鍊跟蹤

基本元件

如果分别去看Pinpoint/Skywalking/CAT的整體設計,我們會發現三者更像是一個規範的三種實作,雖然各自有不同的機制和特性,但是從子產品劃分和功能基本是一緻的:

當然也有一些微小的差別:

  • Pinpoint基本沒有aggregator,同時query和alarm內建在了web中,隻有agent,collector和web
  • Skywalking則是把collector、aggregator、alarm內建為OAP(Observability Analysis Platform),并且可以通過叢集部署,不同的執行個體可以分别承擔collector或者aggregator+alarm的角色
  • CAT則和Skywalking類似,把collector、aggregator、alarm內建為cat-consumer,而由于CAT有比較複雜的配置管理,是以query和配置一起內建為cat-home
  • 當然最大的差別是Pinpoint和Skywalking均是通過javaagent做位元組碼的擴充,通過切面程式設計采集資料,類似于探針,而CAT的agent則更像是一個工具集,用于手動埋點