APM調用鏈產品對比
APM調用鏈產品對比
隨着企業經營規模的擴大,以及對內快速診斷效率和對外SLA(服務品質協議,service-level agreement)的追求,對於業務系統的掌控度的要求越來越高,主要體現在:
-
對於第三方依賴的監控,實時/准實時了解第三方的健康狀況/服務品質,降低第三方依賴對於自身系統的擾動(服務降級、故障轉移)
-
對於容器的監控,實時/准實時的了解應用部署環境(CPU、內存、進程、線程、網絡、帶寬)情況,以便快速擴容/縮容、流量控制、業務遷移
-
業務方對於自己的調用情況,方便作容量規劃,同時對於突發的請求也能進行異常告警和應急準備
-
自己業務的健康、性能監控,實時/准實時的了解自身的業務運行情況,排查業務瓶頸,快速診斷和定位異常,增加對自己業務的掌控力
同時,對於企業來說,能夠更精確的了解資源的使用情況,對於成本核算和控制也有非常大的裨益。
在這種情況下,一般都會引入APM(Application Performance Management & Monitoring)系統,通過各種探針採集數據,收集關鍵指標,同時搭配數據呈現和監控告警,能夠解決上述的大部分問題。
然而隨着RPC框架、微服務、雲計算、大數據的發展,同時業務的規模和深度相比過往也都增加了很多,一次業務可能橫跨多個模塊/服務/容器,依賴的中間件也越來越多,其中任何一個節點出現異常,都可能導致業務出現波動或者異常,這就導致服務質量監控和異常診斷/定位變得異常複雜,於是催生了新的業務監控模式:調用鏈跟蹤–能夠分佈式的抓取多個節點的業務記錄,並且通過統一的業務id(traceId,messageId,requestId等)將一次業務在各個節點的記錄串聯起來,方便排查業務的瓶頸或者異常點
產品對比
APM和調用鏈跟蹤均不是新誕生事務,很多公司已經有了大量的實踐,不過開源的並且能夠開箱即用的產品並不多,這裡主要選取了Pinpoint,Skywalking,CAT來進行對比(當然也有其他的例如Zipkin,Jaeger等產品,不過總體來說不如前面選取的3個完成度高),了解一下APM和調用鏈跟蹤在開源方面的發展狀態。
Pinpoint
Pinpoint是一個比較早並且成熟度也非常高的APM+調用鏈監控的項目,在全世界範圍內均有用戶使用,支持Java和PHP的探針,數據容器為HBase,其界面參考:
Skywalking
Skywalking是一個新晉的項目,最近一兩年發展非常迅猛,本身支持OpenTracing規範,優秀的設計提供了良好的擴展性,支持Java、PHP、.Net、NodeJs探針,數據容器為ElasticSearch,其界面參考:
CAT
CAT是由美團開源的一個APM項目,也歷經了多年的迭代升級,擁有大量的企業級用戶,對於監控和報警整合比較緊密,支持Java、C/C++、.Net、Python、Go、NodeJs,不過CAT目前主要通過侵入性的方式接入,數據容器包括HDFS(存儲原始數據)和mysql(二次統計),其界面參考:
橫向對比
上面只是做了一個簡介,那這三個項目各自有什麼特色或者優勢/劣勢呢(三者的主要產品均針對Java,這裡也主要針對Java的特性)
Pinpoint
優勢:
-
大企業/長時間驗證,穩定性和完成度高
-
探針收集的數據粒度比較細
-
HBase的數據密度較大,支持PB級別下的數據查詢
-
代碼設計考慮的擴展性較弱,二次開發難度較大(探針為插件式,開發比較簡單)
-
擁有完整的APM和調用鏈跟蹤功能
劣勢:
-
代碼針對性強,擴展較難
-
容器為HBase,查詢功能較弱(主要為時間維度)
-
探針的額外消耗較多(探針採集粒度細,大概10%~20%)
-
項目趨於成熟,而擴展難度較大,目前社區活躍度偏低,基本只進行探針的增加或者升級
-
缺少自定義指標的設計
Skywalking
優勢:
-
數據容器為ES,查詢支持的維度較多並且擴展潛力大
-
項目設計採用微內核+插件,易讀性和擴展性都比較強
-
主要的研發人員為華人並且均比較活躍,能夠進行更加直接的溝通
-
擁有完整的APM和調用鏈跟蹤功能
劣勢:
-
項目發展非常快,穩定性有待驗證
-
ES數據密度較小,在PB級別可能會有性能壓力
-
缺少自定義指標的設計
CAT
優勢:
-
大企業/長時間驗證,穩定性和完成度高
-
採用手動數據埋點而不是探針,數據採集的靈活性更強
-
支持自定義指標
-
代碼設計考慮的擴展性較弱,並且數據結構複雜,二次開發難度較大
-
擁有完善的監控告警機制
劣勢:
-
代碼針對性強,擴展較難
-
需要手動接入埋點,代碼侵入性強
-
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則更像是一個工具集,用於手動埋點