中介軟體增強框架之-CaptureFramework框架
一、背景
應用服務監控是智慧運維繫統的重要組成部分。在UAV系統中,中介軟體增強框架(MOF)探針提供了應用畫像及效能資料收集等功能,其中資料收集功能主要採集四類資料:實時資料、畫像資料、呼叫連結資料生成以及執行緒資料分析資料。為實現實時資料採集,UAVStack設計了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為空,並返回封裝好的上下文資訊,在方法執行結束後呼叫非同步捕獲方法傳入上下文資訊,並進行上下文資訊合併,再進行具體的捕獲操作,具體可參考以下程式碼片段:
- 方法執行前的非同步呼叫
- 方法執行後的非同步呼叫如下,其中ccMap為非同步呼叫返回的封裝好的上下文資訊
2.5 抓取行為剖析
- Monitor介面:提供了多個介面,其中最主要的是doCapture與doPreStore方法,doCapture用來實現在特定的捕獲點執行抓取資料行為,doPreStore方法用來實現在儲存到資料結構之前的一些捕獲動作,做一些特殊資料的處理。
- StandardMonitor類: Monitor介面的具體實現類。
- 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的實現
服務端資料採集以DefaultMonitorSupporter.start為入口點,構建monitor例項:
預設構建service型別的StandardMonitor例項,其中包含StandardMonitorRepository例項,StandardMonitorRepository例項註冊monitor,一個該例項包含多個MonitorElement例項,並將所有的MonitorElement例項儲存在elemsMap屬性中。
elemsMap屬性根據不同的採集物件儲存不同的採集類handler:
- ServerEndRespTimeCapHandler:採集Server、APP、URL的響應時間和載入計數等.
- JVMStateCapHandler:採集jvm狀態,包括Heap使用、GC計數、執行緒計數、CPU、class計數等。
程式碼片段如下:
3.3 客戶端資料採集
DefaultClientMonitorSupporter的實現
客戶端資料採集以DefaultClientMonitorSupporter.start為入口點,構建monitor例項:
預設構建client型別的StandardMonitor例項,其中包含StandardMonitorRepository例項,StandardMonitorRepository例項註冊monitor,一個該例項包含多個MonitorElement例項,並將所有的MonitorElement例項儲存在elemsMap屬性中。
- elemsMap:屬性只儲存一個ClientRespTimeCapHandler採集類。
- ClientRespTimeCapHandler:採集客戶端的響應時間和載入計數等。
無論是客戶端的資料採集還是服務端的資料採集,都會將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的方法:
官方網站:
開源地址:
作者:王林林
來源:宜信技術學院
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69918724/viewspace-2652687/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 中介軟體增強框架之InterceptFramework框架Framework
- Express框架(二)—— 中介軟體Express框架
- PHP 框架中介軟體實現PHP框架
- 孔子=?中介軟體開發框架?框架
- Django框架之中介軟體引入Django框架
- Django框架之中介軟體思想Django框架
- 集合框架-增強for框架
- 如何開發一個框架或中介軟體框架
- 「Go框架」深入理解web框架的中介軟體執行機制Go框架Web
- go的web框架gin的使用(八):中介軟體GoWeb框架
- 學習Node須知——中介軟體框架Connect框架
- nodejs express 框架解密3-中介軟體模組NodeJSExpress框架解密
- 解讀架構,框架,模式,構件,元件,中介軟體之間區別架構框架模式元件
- 中介軟體之訊息中介軟體-pulsar
- 初識NodeJS-使用Express框架路由和中介軟體NodeJSExpress框架路由
- koa,redux等主流框架的中介軟體設計思想原理分析Redux框架
- MySQL中介軟體之ProxySQLMySql
- WEB的QTP原型框架PAFAWEB(增強型SAFFRON)WebQT原型框架
- Mac滑鼠增強軟體:BettertouchtoolMac
- Bettertouchtool for Mac(滑鼠增強軟體)Mac
- Go Web輕量級框架Gin學習系列:中介軟體使用詳解GoWeb框架
- 訊息中介軟體之ActiveMQMQ
- MFC框架軟體逆向研究框架
- 軟體測試框架——自動化測試框架框架
- Redis中介軟體與Web中介軟體RedisWeb
- 集合------集合框架Collection/Iterator迭代器/增強for迴圈框架
- 雲原生時代頂流訊息中介軟體Apache Pulsar部署實操之輕量級計算框架Apache框架
- 解析訊息中介軟體之RabbitMQMQ
- redux中介軟體之redux-thunkRedux
- MyBatis-Pro,新一代的MyBatis增強框架MyBatis框架
- 基於SPI的增強式外掛框架設計框架
- Go語言中介軟體框架 Negroni 的靜態檔案處理原始碼分析Go框架原始碼
- 基於.NET CORE微服務框架 -談談Cache中介軟體和快取降級微服務框架快取
- 2015年阿里巴巴中介軟體比賽rpc框架阿里RPC框架
- 基於Gin框架的web後端開發(十): Gin框架-中介軟體(定義、使用、通訊與例項)詳解框架Web後端
- Smooze for Mac滑鼠增強輔助軟體Mac
- Koajs中介軟體之next(二)JS
- Koajs中介軟體之context(三)JSContext