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