摘要:注入機(jī)制作為工作的基礎(chǔ),也為無(wú)侵入捕獲應(yīng)用數(shù)據(jù)提供可能。代碼注入機(jī)制結(jié)合和技術(shù),在應(yīng)用字節(jié)碼加載到之前進(jìn)行字節(jié)碼改寫(xiě)。當(dāng)然,修改字節(jié)碼文件流的動(dòng)作是在中進(jìn)行的。
UAVStack的中間件增強(qiáng)框架專(zhuān)題(MOF)】為大家詳細(xì)講述UAV中的MOF Agent是如何借助javaagent(premain)和javaassist技術(shù)在對(duì)應(yīng)用無(wú)侵入的前提下完成數(shù)據(jù)捕獲的。歡迎繼續(xù)關(guān)注UAVStack,了解UAV更多的技術(shù)創(chuàng)新。
前言MOF(Moniter Framwork)作為UAV應(yīng)用數(shù)據(jù)捕獲框架,不但實(shí)現(xiàn)了對(duì)應(yīng)用無(wú)侵入的數(shù)據(jù)捕獲,而且在框架層面實(shí)現(xiàn)了功能的靈活控制,并且保證了良好的可擴(kuò)展性,在UAV中具有舉足輕重的地位。
MOF Agent注入機(jī)制作為UAV MOF工作的基礎(chǔ),也為UAV無(wú)侵入捕獲應(yīng)用數(shù)據(jù)提供可能。UAV Agent代碼注入機(jī)制結(jié)合javaagent(premain)和javaassist技術(shù),在應(yīng)用字節(jié)碼加載到JVM之前進(jìn)行字節(jié)碼改寫(xiě)。通過(guò)適配器適配(adaptor)不同應(yīng)用服務(wù)器,目前支持的包括Tomcat(6+)、SpringBoot、Jetty(7+)等,結(jié)合攔截器(interceptor)實(shí)現(xiàn)對(duì)不同應(yīng)用服務(wù)器切點(diǎn),為MOF框架和應(yīng)用數(shù)據(jù)捕獲提供基礎(chǔ)。
Java Agent技術(shù)自JDK1.5開(kāi)始, JDK中引入了java.lang.Instrument包,提供在Java程序類(lèi)加載之前修改class字節(jié)碼和運(yùn)行時(shí)動(dòng)態(tài)修改系統(tǒng)中Class類(lèi)型的能力,其中一個(gè)核心概念即Java Agent,可以理解為一個(gè)字節(jié)碼轉(zhuǎn)換器或者Class對(duì)象轉(zhuǎn)換器。針對(duì)字節(jié)碼轉(zhuǎn)化和Class對(duì)象轉(zhuǎn)化,Java agent分別提供了相應(yīng)的方式,即Java agent premain方式和Java agent agentmain方式。UAV MOF使用的是Java agent premain方式,因此本文主要講解該轉(zhuǎn)化方式。
Java agent premain方式提供了在字節(jié)碼class文件被JVM加載之前攔截并修改的神奇能力,目前基本所有基于探針的監(jiān)控系統(tǒng)(如ONEAPM Servers)都是基于這種能力實(shí)現(xiàn)的對(duì)應(yīng)用的無(wú)侵入監(jiān)控。Java agent premain中有兩個(gè)重要的概念,分別是premain和transformer。
premain將在程序的main方法之前執(zhí)行,我們知道程序的入口是main方法,premain代表了在程序正式啟動(dòng)之前執(zhí)行的動(dòng)作,具備類(lèi)似AOP的能力。transformer,寓意轉(zhuǎn)化器,提供字節(jié)碼文件流轉(zhuǎn)化的能力。
圖1 Class文件轉(zhuǎn)化圖
集合premain和transformer兩大神器,可以對(duì)加載進(jìn)JVM的任意Class文件進(jìn)行修改。其流程如圖1所示,任何Class文件加載時(shí)候,都要經(jīng)過(guò)premain這一關(guān)卡,通過(guò)一系列的transformer,Class字節(jié)碼文件流最終變成那個(gè)完美的它,然后被加載到JVM中。當(dāng)然,修改Class字節(jié)碼文件流的動(dòng)作是在transformer中進(jìn)行的。這就有個(gè)問(wèn)題,拿到了字節(jié)碼文件流,怎么修改呢?當(dāng)然是發(fā)揮人類(lèi)的特長(zhǎng),借助工具,比如說(shuō)javassist。
Javassist技術(shù)Javaassist是一個(gè)開(kāi)源的分析、編輯和創(chuàng)建Java字節(jié)碼的類(lèi)庫(kù),能運(yùn)行時(shí)動(dòng)態(tài)生成類(lèi),修改類(lèi),并且能直接使用java編碼。
前文Java agent技術(shù)中,在transformer中拿到了類(lèi)的字節(jié)碼文件流,利用Javaassist解析字節(jié)碼流為類(lèi)對(duì)象,并對(duì)其進(jìn)行修改,非常快速便捷。Javassist與Java agent結(jié)合將事半功倍。關(guān)于Javaassist的使用還請(qǐng)參考官網(wǎng)http://www.javassist.org。
MOF Agent注入機(jī)制前文中介紹了一對(duì)好伙伴:Javaagent技術(shù)和Javassit技術(shù)。Java agent負(fù)責(zé)攔截和轉(zhuǎn)換字節(jié)碼流,轉(zhuǎn)換的過(guò)程中使用Javaassist進(jìn)行解析和修改。此兩者技術(shù)為MOF Agent注入機(jī)制提供了技術(shù)基礎(chǔ)。相信小伙伴對(duì)MOF Agent注入機(jī)制已經(jīng)有了一定了猜想。
圖2為MOF Agent的組件圖,MOFAgent基于java agent premain技術(shù)實(shí)現(xiàn),攔截所有加載的Class字節(jié)碼文件流;并通過(guò)UAV的transformer(MOFClsTransformer)進(jìn)行字節(jié)碼劫持和轉(zhuǎn)化。UAV做的不僅僅是這些,還能自動(dòng)感知不同應(yīng)用服務(wù)器,并對(duì)不同應(yīng)用服務(wù)器生命周期中的重要位置注入切點(diǎn)。UAV通過(guò)適配器(Adaptor)進(jìn)行不同應(yīng)用服務(wù)適配,通過(guò)攔截器(interceptor)進(jìn)行具體的切點(diǎn)注入實(shí)現(xiàn)。
圖2 MOF Agent組件圖
MOFAgent注入機(jī)制將對(duì)應(yīng)用服務(wù)器生命周期中關(guān)鍵位置注入切點(diǎn),為MOF框架初始化、應(yīng)用的畫(huà)像信息和實(shí)時(shí)監(jiān)控?cái)?shù)據(jù)信息捕獲提供基礎(chǔ)。MOF Agent注入的不同切點(diǎn)會(huì)產(chǎn)生不同的事件,通過(guò)事件驅(qū)動(dòng)后續(xù)MOF框架。MOF支持的主要切點(diǎn)如下:
應(yīng)用服務(wù)器入口
應(yīng)用服務(wù)器入口切點(diǎn),UAV將完成MOF Jar包加載和配置文件初始化;
應(yīng)用服務(wù)器啟動(dòng)
應(yīng)用服務(wù)器啟動(dòng)時(shí),切將保證UAV MOF將隨應(yīng)用服務(wù)器啟動(dòng)完成MOF內(nèi)部代碼的自啟動(dòng)和初始化;
應(yīng)用服務(wù)器請(qǐng)求處理和回復(fù)
應(yīng)用服務(wù)器請(qǐng)求和回復(fù)切點(diǎn),是UAV對(duì)應(yīng)用實(shí)時(shí)監(jiān)控?cái)?shù)據(jù)捕獲的重要切點(diǎn),監(jiān)控應(yīng)用服務(wù)器,應(yīng)用,所有的URL的性能指標(biāo);
應(yīng)用初始化
應(yīng)用初始化切點(diǎn)時(shí),UAV將對(duì)應(yīng)用的Filter進(jìn)行改寫(xiě),支持MOF的Global Filter機(jī)制;同時(shí)完成對(duì)應(yīng)用畫(huà)像信息進(jìn)行捕獲等;
應(yīng)用停止
應(yīng)用停止時(shí)切點(diǎn),UAV將完成MOF相關(guān)機(jī)制的停止等操作
本文主要目的是讓讀者了解UAV MOF Agent代碼注入機(jī)制原理和相關(guān)實(shí)現(xiàn)。MOF中其它重要框架及其實(shí)現(xiàn)原理將會(huì)在后續(xù)文章中依次剖析,敬請(qǐng)期待。
宜信技術(shù)學(xué)院
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/72739.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)維...
摘要:攔截之前的準(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ù)采...
摘要:容器云的背景伴隨著微服務(wù)的架構(gòu)的普及,結(jié)合開(kāi)源的和等微服務(wù)框架,宜信內(nèi)部很多業(yè)務(wù)線逐漸了從原來(lái)的單體架構(gòu)逐漸轉(zhuǎn)移到微服務(wù)架構(gòu)。 容器云的背景 伴隨著微服務(wù)的架構(gòu)的普及,結(jié)合開(kāi)源的Dubbo和Spring Cloud等微服務(wù)框架,宜信內(nèi)部很多業(yè)務(wù)線逐漸了從原來(lái)的單體架構(gòu)逐漸轉(zhuǎn)移到微服務(wù)架構(gòu)。應(yīng)用從有狀態(tài)到無(wú)狀態(tài),具體來(lái)說(shuō)將業(yè)務(wù)狀態(tài)數(shù)據(jù)如:會(huì)話、用戶數(shù)據(jù)等存儲(chǔ)到中間件中服務(wù)中。 showI...
閱讀 854·2023-04-26 00:11
閱讀 2655·2021-11-04 16:13
閱讀 2101·2021-09-09 09:33
閱讀 1472·2021-08-20 09:35
閱讀 3817·2021-08-09 13:42
閱讀 3604·2019-08-30 15:55
閱讀 1039·2019-08-30 15:55
閱讀 2218·2019-08-30 13:55