天天看點

中間件增強架構之-CaptureFramework架構

一、背景

應用服務監控是智能運維系統的重要組成部分。在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
  • 異步捕獲入口點:runMonitorAsyncCaptureOnServerCapPoint

2.4.1 同步與異步調用的差異分析

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

  • 方法執行前的異步調用
中間件增強架構之-CaptureFramework架構
  • 方法執行後的異步調用如下,其中ccMap為異步調用傳回的封裝好的上下文資訊
中間件增強架構之-CaptureFramework架構

2.5 抓取行為剖析

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

無論是同步捕獲入口點還是異步捕獲入口點都會執行doCapture方法,代碼片段如下:

中間件增強架構之-CaptureFramework架構

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架構

官方網站:

https://uavorg.github.io/main/

開源位址:

https://github.com/uavorg

作者:王林林