摘要:攔截之前的準(zhǔn)備在應(yīng)用啟動(dòng)的特定生命周期內(nèi)改寫(xiě)字節(jié)碼,植入特定的邏輯處理代碼進(jìn)行攔截。劫持通過(guò)字節(jié)碼改寫(xiě)動(dòng)態(tài)代理等技術(shù),在客戶端調(diào)用代碼中嵌入特定處理邏輯,獲取調(diào)用相關(guān)的信息,如調(diào)用地址調(diào)用協(xié)議調(diào)用結(jié)果等。
這次我們?yōu)榇蠹規(guī)?lái)中間件增強(qiáng)框架專(zhuān)題(MOF)的最后一篇文章,為大家講解MOF中的InterceptFramework框架。該框架可以在應(yīng)用啟動(dòng)過(guò)程中獲取畫(huà)像信息,實(shí)現(xiàn)應(yīng)用畫(huà)像數(shù)據(jù)采集和存儲(chǔ)。
前言在智能運(yùn)維中,應(yīng)用服務(wù)所使用的組件及JAR包等相關(guān)信息非常重要,這些信息能夠清晰地描繪一個(gè)應(yīng)用服務(wù)的骨架,我們稱這些信息為應(yīng)用畫(huà)像。在UAVStack中,中間件增強(qiáng)框架(MOF)下的InterceptFramework可以在應(yīng)用啟動(dòng)過(guò)程中獲取畫(huà)像信息。本文主要介紹InterceptFramework的架構(gòu)原理和在此基礎(chǔ)上實(shí)現(xiàn)的應(yīng)用畫(huà)像數(shù)據(jù)采集與存儲(chǔ)。
整體架構(gòu) 關(guān)鍵技術(shù)Javaassist
Hook
關(guān)鍵類(lèi)及功能Profile數(shù)據(jù)和客戶端監(jiān)控指標(biāo)主要通過(guò)InterceptSupport和hookProxy機(jī)制捕獲和監(jiān)控。
Profile也會(huì)安裝至DataObserver對(duì)象并暴露JMX/HTTP接口。
攔截之前的準(zhǔn)備1.在應(yīng)用啟動(dòng)的特定生命周期內(nèi)改寫(xiě)字節(jié)碼,植入特定的邏輯處理代碼進(jìn)行攔截。
2.攔截框架對(duì)應(yīng)的Supporter啟動(dòng),從配置文件中獲取應(yīng)該裝載的Listener,構(gòu)建InterceptSupport實(shí)例,把Listener添加到InterceptSupport實(shí)例中。
具體的攔截邏輯在應(yīng)用啟動(dòng)過(guò)程中的特定生命周期,之前植入的代碼攔截邏輯開(kāi)始執(zhí)行InterceptSupport的doIntercept方法,遍歷已注冊(cè)的Listener監(jiān)聽(tīng)器。每個(gè)監(jiān)聽(tīng)器都繼承自InterceptEventListener類(lèi)。不同的子Listener對(duì)相應(yīng)類(lèi)型的畫(huà)像采集處理:AppProfilingListener負(fù)責(zé)監(jiān)聽(tīng)所有服務(wù)畫(huà)像事件,AppFrkHookFactoryListener負(fù)責(zé)監(jiān)聽(tīng)客戶端畫(huà)像事件。
架構(gòu)說(shuō)明InterceptSupport:?jiǎn)卫鳛榻y(tǒng)一的Profile/Client hook捕獲入口點(diǎn)
InterceptContext:捕獲上下文接口, 所有捕獲參數(shù)由Context封裝
InterceptEventListener:事件劫持監(jiān)聽(tīng)器, 所有監(jiān)聽(tīng)器需繼承并注冊(cè)監(jiān)聽(tīng)
AppProfilingListener:服務(wù)畫(huà)像監(jiān)聽(tīng)器, 監(jiān)聽(tīng)所有服務(wù)畫(huà)像事件
AppFrkHookFactoryListener:客戶端畫(huà)像監(jiān)聽(tīng)代理
關(guān)鍵類(lèi)說(shuō)明StandardProfile:實(shí)現(xiàn)了Profile接口,是畫(huà)像數(shù)據(jù)抓取實(shí)現(xiàn)類(lèi),提供了doProfiling方法負(fù)責(zé)抓取行為和生成抓取結(jié)果;
ProfileHandler:不同的抓取邏輯和抓取點(diǎn)的共同接口,實(shí)現(xiàn)不同的抓取邏輯;提供了抓取行為的doProfiling方法;
StandardProfileRepository:存儲(chǔ)畫(huà)像數(shù)據(jù)抓取數(shù)據(jù)結(jié)構(gòu);
DataObserver:暴露了JMX/HTTP接口數(shù)據(jù);
Profile實(shí)時(shí)監(jiān)控在從AppProfilingListener類(lèi)調(diào)用startProfiling時(shí),將Profile對(duì)象安裝到DataObserver對(duì)象中;
DataObserver提供JMX/HTTP服務(wù),供后續(xù)抓取使用,其中Http服務(wù)注冊(cè)了HttpJEEProfileObserver,主要負(fù)責(zé)畫(huà)像數(shù)據(jù)的抓取服務(wù);
各個(gè)Handler類(lèi)具體處理抓取的各類(lèi)數(shù)據(jù)。
畫(huà)像數(shù)據(jù)畫(huà)像數(shù)據(jù)即靜態(tài)數(shù)據(jù),是在進(jìn)程啟動(dòng)時(shí)即可得到的數(shù)據(jù),包括操作系統(tǒng)相關(guān)的信息、程序相關(guān)的信息、程序啟動(dòng)后相關(guān)的初始化信息。
畫(huà)像數(shù)據(jù)主要包括服務(wù)畫(huà)像、溯源感知畫(huà)像和客戶端畫(huà)像三部分,如上圖所示。以下分別從這三個(gè)方面介紹畫(huà)像采集:
服務(wù)畫(huà)像采集服務(wù)畫(huà)像描述了服務(wù)本體的信息,包括應(yīng)用唯一標(biāo)識(shí)(AppID)、服務(wù)名(Service ID)、服務(wù)實(shí)例的URI、服務(wù)接口的URI、服務(wù)接口的元數(shù)據(jù)(類(lèi)、方法、入?yún)⒊鰠ⅰ⒆⒔狻⒉渴鹈枋龇?/p>
以Tomcat為例,應(yīng)用的啟動(dòng)過(guò)程需要經(jīng)過(guò)StandardContext的start方法。我們可以在此方法的最后植入代碼邏輯進(jìn)行攔截,通過(guò)攔截可以獲取到以下信息:
應(yīng)用名、webworkdir(工作目錄)、servletcontext、contextpath、basepath(應(yīng)用實(shí)際路徑)等容器上下文信息;
根據(jù)相應(yīng)的技術(shù)規(guī)范(Servlet、JAXRS、JAXWS、Spring等)獲取畫(huà)像數(shù)據(jù),主要包括:通過(guò)反射的方式獲取類(lèi)和方法名以及出參入?yún)⑿畔ⅰ呙枳⒔忸?lèi)、獲取注解信息、解析部署描述符文件(web.xml等)信息。
服務(wù)畫(huà)像除了獲取以上信息外,還獲取應(yīng)用的日志路徑和所用JAR包等信息。
溯源畫(huà)像采集溯源畫(huà)像采集主要借助HTTP協(xié)議Header中的字段進(jìn)行溯源,通過(guò)中間件劫持技術(shù)攔截Tomcat中StandardEngineValve的Invoke方法,獲取溯源數(shù)據(jù)。
收集的數(shù)據(jù)有以下幾種:
Client Address:直連客戶端IP地址;
X-Forwarded-For:如果存在,則為代理路由地址鏈,則直連客戶端為代理服務(wù);
Host:表明遠(yuǎn)程主機(jī)甚至端口信息,如果直連客戶端是代理服務(wù),則Host為代理IP地址和端口;
User-Agent:代理描述,可用來(lái)區(qū)分瀏覽器還是程序客戶端,還可以提取很多瀏覽器終端信息;
UAV-Client-Src:HTTP客戶端劫持加入的Header字段,用于UAV應(yīng)用之間調(diào)用的擬合。
客戶端畫(huà)像采集客戶端畫(huà)像通過(guò)對(duì)一系列常用中間件客戶端進(jìn)行劫持實(shí)現(xiàn),目前已支持同步/異步http、數(shù)據(jù)庫(kù)jdbc、redis(jedis,aredis,lettuce)、mongodb、rocketmq/rabbitmq/Kafka、ESClient等。
劫持通過(guò)javaassist字節(jié)碼改寫(xiě)、動(dòng)態(tài)代理等AOP技術(shù),在客戶端調(diào)用代碼中嵌入特定處理邏輯,獲取調(diào)用相關(guān)的信息,如調(diào)用地址、調(diào)用協(xié)議、調(diào)用結(jié)果等。
畫(huà)像數(shù)據(jù)基于調(diào)用地址、訪問(wèn)協(xié)議、調(diào)用結(jié)果的特征提取來(lái)確定目標(biāo)服務(wù)。
調(diào)用地址:以類(lèi)URI格式表示
http/https服務(wù)(業(yè)務(wù)/代理服務(wù)):http://
關(guān)系型數(shù)據(jù)庫(kù)(數(shù)據(jù)源服務(wù)):jdbc:
非關(guān)系型數(shù)據(jù)庫(kù)或緩存(數(shù)據(jù)源服務(wù)):
消息隊(duì)列(消息服務(wù)):mq:
訪問(wèn)協(xié)議:某種訪問(wèn)動(dòng)作。例如HTTP的POST、SQL插入、發(fā)送/訂閱消息、Redis的hgethashall、Mongo的Collection操作等。
訪問(wèn)結(jié)果特征:服務(wù)的基礎(chǔ)棧類(lèi)型、是否集群,例如Nginx、Tomcat、Apache等。
以ESClient為例,我們可以劫持TransportService的sendRequest方法,植入我們的攔截代碼邏輯。
與服務(wù)畫(huà)像不同的是,客戶端畫(huà)像發(fā)生在具體客戶端調(diào)用過(guò)程中,并非在應(yīng)用的啟動(dòng)環(huán)節(jié)。
畫(huà)像存儲(chǔ)結(jié)構(gòu)畫(huà)像存儲(chǔ)按以下結(jié)構(gòu)分層存儲(chǔ):
StandardProfileRespository存儲(chǔ)某個(gè)應(yīng)用的整個(gè)畫(huà)像;
StandardProfileElement存儲(chǔ)某類(lèi)組件畫(huà)像(服務(wù)端、客戶端、日志、jar等);
ProfileElementInstance存儲(chǔ)某類(lèi)組件當(dāng)中的某一個(gè)組件畫(huà)像,以服務(wù)組件畫(huà)像為例,如:如組件JAXRS、Servlets各為一個(gè)ProfileElementInstance,但它們同屬于服務(wù)組件這一StandardProfileElement.
DataObserver提供了JMX和HTTP兩種模式來(lái)暴露接口畫(huà)像數(shù)據(jù),這一點(diǎn)與實(shí)時(shí)數(shù)據(jù)類(lèi)似,在我們MOF系列的兄弟篇《中間件增加框架之CaptureFramework》中已經(jīng)詳細(xì)介紹過(guò),在此處不再贅述。
作者:李興勝
宜信技術(shù)學(xué)院
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/72860.html
摘要:頁(yè)面展示的統(tǒng)計(jì)追蹤等信息則通過(guò)的接口獲取四功能展示數(shù)據(jù)庫(kù)監(jiān)控目前已實(shí)現(xiàn)的功能有分類(lèi)統(tǒng)計(jì)數(shù)據(jù)庫(kù)連接池監(jiān)控慢耗時(shí)分布統(tǒng)計(jì)慢統(tǒng)計(jì)慢追蹤以及調(diào)用鏈日志關(guān)聯(lián)功能。 作者: 王林林 出處:UAVStack智能運(yùn)維 來(lái)源:宜信技術(shù)學(xué)院技術(shù)沙龍001期|AI中臺(tái):一種敏捷的智能業(yè)務(wù)支持方案|宜信技術(shù)沙龍 3月28日晚8點(diǎn)線上直播,點(diǎn)擊報(bào)名 UAVStack是一個(gè)全維監(jiān)控與應(yīng)用運(yùn)維平臺(tái)。UAV.Mon...
摘要:本文為大家講解中的框架。在系統(tǒng)中,中間件增強(qiáng)框架探針提供了應(yīng)用畫(huà)像及性能數(shù)據(jù)收集等功能,其中數(shù)據(jù)收集功能主要采集四類(lèi)數(shù)據(jù)實(shí)時(shí)數(shù)據(jù)畫(huà)像數(shù)據(jù)調(diào)用鏈接數(shù)據(jù)生成以及線程數(shù)據(jù)分析數(shù)據(jù)。提供服務(wù),供后續(xù)抓取使用,其中服務(wù)注冊(cè)了三個(gè),分別為。 本文為大家講解MOF中的CaptureFramework框架。該框架提供統(tǒng)一的數(shù)據(jù)抓取行為和生成抓取結(jié)果能力,實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)采集。 背景 應(yīng)用服務(wù)監(jiān)控是智能運(yùn)維...
摘要:原文地址沒(méi)想到這篇文章這么晚才出,最近發(fā)生了太多的事情,已致于心態(tài)全無(wú),最終也離開(kāi)了現(xiàn)在的公司,沒(méi)想到是這么的狼狽一個(gè)人的光芒可以放到很大也可以小到微乎其微,如果不能好好的規(guī)劃最終也只能默默的承受世上沒(méi)有相同的感同身受,感受真實(shí)才能真正的 原文地址:https://gmiam.com/post/react-... 沒(méi)想到這篇文章這么晚才出,最近發(fā)生了太多的事情,已致于心態(tài)全無(wú),最終也離...
摘要:在該版本發(fā)布之后,開(kāi)發(fā)團(tuán)隊(duì)并不會(huì)繼續(xù)發(fā)布新的特性,而會(huì)著眼于進(jìn)行重大的錯(cuò)誤修復(fù)。發(fā)布每六個(gè)星期,團(tuán)隊(duì)就會(huì)創(chuàng)建新的分支作為發(fā)布通道,本文即是對(duì)新近發(fā)布的版本進(jìn)行簡(jiǎn)要介紹。 showImg(https://segmentfault.com/img/remote/1460000013229009); 前端每周清單專(zhuān)注前端領(lǐng)域內(nèi)容,以對(duì)外文資料的搜集為主,幫助開(kāi)發(fā)者了解一周前端熱點(diǎn);分為新聞熱...
閱讀 3588·2021-09-13 10:28
閱讀 1937·2021-08-10 09:43
閱讀 1010·2019-08-30 15:44
閱讀 3178·2019-08-30 13:14
閱讀 1830·2019-08-29 16:56
閱讀 2938·2019-08-29 16:35
閱讀 2843·2019-08-29 12:58
閱讀 864·2019-08-26 13:46