首頁  >  文章  >  運維  >  如何進行CaptureFramework框架分析

如何進行CaptureFramework框架分析

王林
王林轉載
2023-06-02 22:01:181036瀏覽

一、背景

應用服務監控是智慧維繫系統的重要組成部分。在UAV系統中,中間件增強框架(MOF)探針提供了應用畫像及性能數據收集等功能,其中數據收集功能主要採集四類數據:實時數據、畫像數據、調用鏈接數據生成以及線程數據分析數據。為實現即時資料擷取,UAVStack設計了CaptureFramework框架,提供統一的資料抓取行為和產生抓取結果能力。

二、CaptureFramework運作原理

如何進行CaptureFramework框架分析

2.1 關鍵技術說明

  • JavaAssist

  • #Monitor擷取系統

  • precap/docap

  • #2.2 架構說明

  • 捕獲點:支援Tomcat、MSCP、Springboot、Jetty埋點。

  • UAVServer單例:作為統一的捕獲入口點,提供了同步和非同步方法。

StandardMonitor:實作了Monitor接口,是即時資料抓取實作類,提供了doCapture方法,負責抓取行為和產生抓取結果。

  • MonitorElemCapHandler:不同的抓取邏輯和抓取點的共同介面實作不同的埋點邏輯,提供了抓取行為的方法preCap與doCap以及產生抓取結果的方法preStore。

  • StandardMonitorRepository:儲存即時資料擷取資料結構。

  • DataObserver:暴露了JMX/HTTP介面資料。

2.3 關鍵類別說明

#Monitor即時監控主要是從DefaultMonitorSupporter類別啟動初始化StandardMonitor對象,透過CaptureFramework將monitor物件安裝到DataStore物件中。
  • DataObserver提供JMX/HTTP服務,供後續MA抓取使用,其中Http服務註冊了三個handler,分別為HttpJEEJVMObserver、HttpJEEMonitorObserver、 HttpJEEProfileObserver。不同的handler暴露了不同的介面。
  • MonitorHandler套件下的Handler類別具體處理Monitor的指標資料計算和統計。
2.4 捕獲點剖析

CaptureFrameWork框架提供了統一的捕獲入口點,在UAVServer中分別提供了同步方法與非同步方法:
  • 同步擷取入口點:runMonitorCaptureOnServerCapPoint

如何進行CaptureFramework框架分析#非同步擷取入口點:runMonitorAsyncCaptureOnServerCapPoint

  • #2.4.1 同步與非同步呼叫的差異分析

  • 非同步比同步多增加了一個參數CaptureContextMapFromAnotherThread,若不為空,則需要合併上下文的資訊。一般情況下在使用非同步方法埋點時,在方法執行前調用異步捕獲方法傳入的CaptureContextMapFromAnotherThread為空,並返回封裝好的上下文信息,在方法執行結束後調用異步捕獲方法傳入上下文信息,並進行上下文資訊合併,再進行具體的擷取操作,具體可參考以下程式碼片段:

如何進行CaptureFramework框架分析

#方法執行前的非同步呼叫

  • 方法執行後的非同步呼叫如下,其中ccMap為非同步呼叫傳回的封裝好的上下文資訊

  • 2.5 抓取行為剖析

  • Monitor介面:提供了多個接口,其中最主要的是doCapture與doPreStore方法,doCapture用來實現在特定的捕獲點執行抓取資料行為,doPreStore方法用來實現在儲存到資料結構之前的一些擷取動作,做一些特殊資料的處理。

StandardMonitor類別: Monitor介面的具體實作類別。

如何進行CaptureFramework框架分析StandardMonitorRepository類別:儲存即時資料擷取資料結構。

MonitorElementInstance介面:儲存即時資料擷取資料結構的實例介面。

  • StandardMonitorElementInstance類別:MonitorElementInstance介面的具體實作類別。

    #########無論是同步擷取入口點或非同步擷取入口點都會執行doCapture方法,程式碼片段如下:###############monitor.doCapture是呼叫了Monitor介面中的doCapture,其實作類別是StandardMonitor。 ######StandardMonitor中的doCapture方法主要做瞭如下操作:#############根據參數取得目前的MonitorElement數組,MonitorElement數組透過StandardMonitorRepository的getElementByCapId實作;###
  • 循環處理MonitorElement數組,取得捕捉資料實作類,根據實作類別取得目前要執行的handler,最後根據目前取得的handler判斷擷取階段(precap/docap),然後進行對應的處理。不同的handler根據不同的特性處理產生MonitorElementInstance,最後將結果儲存在StandardMonitorRepository資料結構中。

以ServerEndRespTimeCapHandler(服務端抓取行為)為例:

  • preCap方法:只記錄了服務的開始請求時間。

  • doCap方法:根據不同的monitorElemId進行不同的邏輯處理,最後封裝好MonitorElementInstance實例,然後再進行抓取行為結果的處理,其中包含最大值消峰、最大值、最小值、傳回狀態碼、時間戳更新、計數等對應的資料處理。

三、即時數據採集

3.1 什麼是即時數據

即運行時數據,指的是程式運行時產生的信息,程式佔用的CPU、堆記憶體、JVM資訊以及提供服務存取與客戶端呼叫的相關統計資訊(平均回應時間、存取計數等)。

3.2 服務端資料擷取

DefaultMonitorSupporter的實作

如何進行CaptureFramework框架分析

服務端資料擷取以DefaultMonitorSupporter.start為入口點,建構monitor實例:

如何進行CaptureFramework框架分析

預設建置service類型的StandardMonitor實例,其中包含StandardMonitorRepository實例,StandardMonitorRepository實例註冊monitor,一個該實例包含多個MonitorElement實例,並將所有的MonitorElement實例儲存在elemsMap屬性中。

elemsMap屬性根據不同的採集物件保存不同的採集類別handler:

  • ServerEndRespTimeCapHandler:擷取Server、APP、URL的回應時間和載入計數等.

  • JVMStateCapHandler:採集jvm狀態,包含Heap使用、GC計數、執行緒計數、CPU、class計數等。

程式碼片段如下:

如何進行CaptureFramework框架分析

如何進行CaptureFramework框架分析

#3.3 用戶端資料擷取

DefaultClientMonitorSupporter的實作 如何進行CaptureFramework框架分析

客戶端資料擷取以DefaultClientMonitorSupporter.start為入口點,建構monitor實例:

如何進行CaptureFramework框架分析

#預設建置client類型的StandardMonitor實例,其中包含StandardMonitorRepository實例,StandardMonitorRepository實例註冊monitor,一個該實例包含多個MonitorElement實例,並將所有的MonitorElement實例保存在elemsMap屬性中。

  • elemsMap:屬性只保存一個ClientRespTimeCapHandler採集類別。

  • ClientRespTimeCapHandler:擷取客戶端的回應時間和載入計數等。

如何進行CaptureFramework框架分析

無論是客戶端的資料擷取或服務端的資料擷取,都會將monitor安裝到DataObserver中;並且最後都會建置成功的monitor綁定至指定的捕獲方法(即precap和docap)。

3.4 DataObServer的實作

DataObServer提供了兩種模式來暴露介面數據,分別為JMX和HTTP:

  • HTTP方式:由HttpDataObserverWorker .start作為入口點,分別註冊了三個handler,分別為取得JVM資料、Monitor資料以及profile資料的handler。各個處理器(handler)暴露出獨特的接口,但它們都傳回 JSON 格式的資料。

  • JMX方式:JMX代理透過getMBeanInfo方法取得暴露的接口,來取得資料。

DataObServer也提供了安裝與卸載monitor、增加與移除listener、取得profile和monitor的方法:

如何進行CaptureFramework框架分析

以上是如何進行CaptureFramework框架分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除