UAV MOF工作原理之Agent注入機制原理

宜信技術學院發表於2019-08-13

大家好,本月我們將為大家推送UAVStack的中介軟體增強框架專題(MOF),為大家詳細講述UAV中的MOF Agent是如何藉助javaagent(premain)和javaassist技術在對應用無侵入的前提下完成資料捕獲的。歡迎繼續關注UAVStack,瞭解UAV更多的技術創新。

前言

MOF(Moniter Framwork)作為UAV應用資料捕獲框架,不但實現了對應用無侵入的資料捕獲,而且在框架層面實現了功能的靈活控制,並且保證了良好的可擴充套件性,在UAV中具有舉足輕重的地位。 MOF Agent注入機制作為UAV MOF工作的基礎,也為UAV無侵入捕獲應用資料提供可能。UAV Agent程式碼注入機制結合javaagent(premain)和javaassist技術,在應用位元組碼載入到JVM之前進行位元組碼改寫。通過介面卡適配(adaptor)不同應用伺服器,目前支援的包括Tomcat(6+)、SpringBoot、Jetty(7+)等,結合攔截器(interceptor)實現對不同應用伺服器切點,為MOF框架和應用資料捕獲提供基礎。

Java Agent技術

自JDK1.5開始, JDK中引入了java.lang.Instrument包,提供在Java程式類載入之前修改class位元組碼和執行時動態修改系統中Class型別的能力,其中一個核心概念即Java Agent,可以理解為一個位元組碼轉換器或者Class物件轉換器。針對位元組碼轉化和Class物件轉化,Java agent分別提供了相應的方式,即Java agent premain方式和Java agent agentmain方式。UAV MOF使用的是Java agent premain方式,因此本文主要講解該轉化方式。

Java agent premain方式提供了在位元組碼class檔案被JVM載入之前攔截並修改的神奇能力,目前基本所有基於探針的監控系統(如ONEAPM Servers)都是基於這種能力實現的對應用的無侵入監控。Java agent premain中有兩個重要的概念,分別是premain和transformer。

premain將在程式的main方法之前執行,我們知道程式的入口是main方法,premain代表了在程式正式啟動之前執行的動作,具備類似AOP的能力。transformer,寓意轉化器,提供位元組碼檔案流轉化的能力。

1
圖1 Class檔案轉化圖

集合premain和transformer兩大神器,可以對載入進JVM的任意Class檔案進行修改。其流程如圖1所示,任何Class檔案載入時候,都要經過premain這一關卡,通過一系列的transformer,Class位元組碼檔案流最終變成那個完美的它,然後被載入到JVM中。當然,修改Class位元組碼檔案流的動作是在transformer中進行的。這就有個問題,拿到了位元組碼檔案流,怎麼修改呢?當然是發揮人類的特長,藉助工具,比如說javassist。

Javassist技術

Javaassist是一個開源的分析、編輯和建立Java位元組碼的類庫,能執行時動態生成類,修改類,並且能直接使用java編碼。

前文Java agent技術中,在transformer中拿到了類的位元組碼檔案流,利用Javaassist解析位元組碼流為類物件,並對其進行修改,非常快速便捷。Javassist與Java agent結合將事半功倍。關於Javaassist的使用還請參考官網http://www.javassist.org。

MOF Agent注入機制

前文中介紹了一對好夥伴:Javaagent技術和Javassit技術。Java agent負責攔截和轉換位元組碼流,轉換的過程中使用Javaassist進行解析和修改。此兩者技術為MOF Agent注入機制提供了技術基礎。相信小夥伴對MOF Agent注入機制已經有了一定了猜想。

圖2為MOF Agent的元件圖,MOFAgent基於java agent premain技術實現,攔截所有載入的Class位元組碼檔案流;並通過UAV的transformer(MOFClsTransformer)進行位元組碼劫持和轉化。UAV做的不僅僅是這些,還能自動感知不同應用伺服器,並對不同應用伺服器生命週期中的重要位置注入切點。UAV通過介面卡(Adaptor)進行不同應用服務適配,通過攔截器(interceptor)進行具體的切點注入實現。

2
圖2 MOF Agent元件圖

MOFAgent注入機制將對應用伺服器生命週期中關鍵位置注入切點,為MOF框架初始化、應用的畫像資訊和實時監控資料資訊捕獲提供基礎。MOF Agent注入的不同切點會產生不同的事件,通過事件驅動後續MOF框架。MOF支援的主要切點如下:

應用伺服器入口: 應用伺服器入口切點,UAV將完成MOF Jar包載入和配置檔案初始化;

應用伺服器啟動: 應用伺服器啟動時,切將保證UAV MOF將隨應用伺服器啟動完成MOF內部程式碼的自啟動和初始化;

應用伺服器請求處理和回覆: 應用伺服器請求和回覆切點,是UAV對應用實時監控資料捕獲的重要切點,監控應用伺服器,應用,所有的URL的效能指標;

應用初始化: 應用初始化切點時,UAV將對應用的Filter進行改寫,支援MOF的Global Filter機制;同時完成對應用畫像資訊進行捕獲等;

應用停止: 應用停止時切點,UAV將完成MOF相關機制的停止等操作

本文主要目的是讓讀者瞭解UAV MOF Agent程式碼注入機制原理和相關實現。MOF中其它重要框架及其實現原理將會在後續文章中依次剖析,敬請期待,同時歡迎大家繼續關注UAVStack官方微信群,相信您一定會有收穫!

相關文章