中間件加強框架之-CaptureFramework框架

背景git

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

CaptureFramework運行原理數組

關鍵技術說明:數據結構

  • JavaAssist架構

  • Monitor捕獲體系框架

  • precap/docap運維

架構說明:異步

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

  • UAVServer單例:做爲統一的捕獲入口點,提供了同步和異步方法。性能

  • StandardMonitor:實現了Monitor接口,是實時數據抓取實現類,提供了doCapture方法,負責抓取行爲和生成抓取結果。

  • MonitorElemCapHandler:不一樣的抓取邏輯和抓取點的共同接口實現不一樣的埋點邏輯,提供了抓取行爲的方法preCap與doCap以及生成抓取結果的方法preStore。

  • StandardMonitorRepository:存儲實時數據抓取數據結構。

  • DataObserver:暴露了JMX/HTTP接口數據。

關鍵類說明

  • Monitor實時監控主要是從DefaultMonitorSupporter類啓動初始化StandardMonitor對象,經過CaptureFramework將monitor對象安裝到DataStore對象中。

  • DataObserver提供JMX/HTTP服務,供後續MA抓取使用,其中Http服務註冊了三個handler,分別爲HttpJEEJVMObserver、HttpJEEMonitorObserver、 HttpJEEProfileObserver。不一樣的handler暴露了不一樣的接口。

  • MonitorHandler包下的Handler類具體處理Monitor的指標數據計算和統計。

捕獲點剖析

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

同步捕獲入口點: runMonitorCaptureOnServerCapPoint

異步捕獲入口點: runMonitorAsyncCaptureOnServerCapPoint

同步與異步調用的差別分析:

異步比同步多增長了一個參數CaptureContextMapFromAnotherThread,該參數若不爲空,則須要合併上下文的信息。通常狀況下在使用異步方法埋點時,在方法執行前調用異步捕獲方法傳入的CaptureContextMapFromAnotherThread爲空,並返回封裝好的上下文信息,在方法執行結束後調用異步捕獲方法傳入上下文信息,並進行上下文信息合併,再進行具體的捕獲操做,具體可參考如下代碼片斷:

方法執行前的異步調用:

2

方法執行後的異步調用以下,其中ccMap爲異步調用返回的封裝好的上下文信息:

3

抓取行爲剖析

  • Monitor接口:提供了多個接口,其中最主要的是doCapture與doPreStore方法,doCapture用來實如今特定的捕獲點執行抓取數據行爲,doPreStore方法用來實如今存儲到數據結構以前的一些捕獲動做,作一些特殊數據的處理。

  • StandardMonitor類: Monitor接口的具體實現類。

  • StandardMonitorRepository類:存儲實時數據抓取數據結構。

  • MonitorElementInstance接口:存儲實時數據抓取數據結構的實例接口。

  • StandardMonitorElementInstance類:MonitorElementInstance接口的具體實現類。

不管是同步捕獲入口點仍是異步捕獲入口點都會執行doCapture方法,代碼片斷以下:

3

monitor.doCapture是調用了Monitor接口中的doCapture,其實現類是StandardMonitor

StandardMonitor中的doCapture方法主要作了以下操做:

  1. 根據參數獲取當前的MonitorElement數組,MonitorElement數組經過StandardMonitorRepositorygetElementByCapId實現;
  2. 循環處理MonitorElement數組,獲取捕捉數據實現類,根據實現類獲取當前要執行的handler,最後根據當前獲取的handler判斷捕獲階段(precap/docap),而後進行相應的處理。不一樣的handler根據不一樣的特性處理生成MonitorElementInstance,最後將結果存儲在StandardMonitorRepository數據結構中。

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

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

  • doCap方法:根據不一樣的monitorElemId進行不一樣的邏輯處理,最後封裝好MonitorElementInstance實例,而後再進行抓取行爲結果的處理,其中包含最大值消峯、最大值、最小值、返回狀態碼、時間戳更新、計數等相應的數據處理。

什麼是實時數據

即運行時數據,指的是在程序運行時產生的信息,程序佔用的CPU、堆內存、JVM信息以及提供服務訪問與客戶端調用的相關統計信息(平均響應時間、訪問計數等)。

服務端數據採集

DefaultMonitorSupporter的實現

3

服務端數據採集以DefaultMonitorSupporter.start爲入口點,構建monitor實例:

4

默認構建service類型的StandardMonitor實例,其中包含StandardMonitorRepository實例,StandardMonitorRepository實例註冊monitor,一個該實例包含多個MonitorElement實例,並將全部的MonitorElement實例保存在elemsMap屬性中。

elemsMap屬性根據不一樣的採集對象保存不一樣的採集類handler:

  • ServerEndRespTimeCapHandler:採集Server、APP、URL的響應時間和加載計數等.
  • JVMStateCapHandler:採集jvm狀態,包括Heap使用、GC計數、線程計數、CPU、class計數等。 代碼片斷以下:

5

6

客戶端數據採集

DefaultClientMonitorSupporter的實現

7

客戶端數據採集以DefaultClientMonitorSupporter.start爲入口點,構建monitor實例:

8

默認構建client類型的StandardMonitor實例,其中包含StandardMonitorRepository實例,StandardMonitorRepository實例註冊monitor,一個該實例包含多個MonitorElement實例,並將全部的MonitorElement實例保存在elemsMap屬性中。

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

  • ClientRespTimeCapHandler:採集客戶端的響應時間和加載計數等。

不管是客戶端的數據採集仍是服務端的數據採集,都會將monitor安裝到DataObserver中;而且最後都會將構建成功的monitor綁定至指定的捕獲方法(即precap和docap)。

9

DataObServer的實現

DataObServer提供了兩種模式來暴露接口數據,分別爲JMX和HTTP:

  • HTTP方式:

由HttpDataObserverWorker.start做爲入口點,分別註冊了三個handler,分別爲獲取JVM數據、Monitor數據以及profile數據的handler。不一樣的handler暴露了不一樣的接口,最終都返回了JSON格式的數據。

  • JMX方式:

JMX代理經過getMBeanInfo方法獲取暴露的接口,來獲取數據;

DataObServer還提供了安裝與卸載monitor、增長與移除listener以及獲取profile和monitor的方法:

10


讀完本文後相信你們對CaptureFramework框架有了基本的瞭解,並對CaptureFramework的應用有了必定的感悟。本文只介紹了MOF相關的一部份內容,若你們對MOF感興趣,歡迎你們後臺留言或添加小助手「uavstack-assist」申請加入官方用戶羣,相信您必定會有所收穫。

官方網站

開源地址

UAVStack已在Github上開放源碼,並提供了安裝部署、架構說明和用戶指南等雙語文檔,歡迎訪問-給星-拉取~~~

掃一掃下方二維碼 關注一個不會讓你失望的公衆號

11
相關文章
相關標籤/搜索