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