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

【UAVStack的中間件加強框架專題(MOF)】爲你們詳細講述UAV中的MOF Agent是如何藉助javaagent(premain)和javaassist技術在對應用無侵入的前提下完成數據捕獲的。歡迎繼續關注UAVStack,瞭解UAV更多的技術創新。java

前言

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,寓意轉化器,提供字節碼文件流轉化的能力。編碼

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

圖1 Class文件轉化圖spa

集合premain和transformer兩大神器,能夠對加載進JVM的任意Class文件進行修改。其流程如圖1所示,任何Class文件加載時候,都要通過premain這一關卡,經過一系列的transformer,Class字節碼文件流最終變成那個完美的它,而後被加載到JVM中。固然,修改Class字節碼文件流的動做是在transformer中進行的。這就有個問題,拿到了字節碼文件流,怎麼修改呢?固然是發揮人類的特長,藉助工具,好比說javassist。3d

Javassist技術

Javaassist是一個開源的分析、編輯和建立Java字節碼的類庫,能運行時動態生成類,修改類,而且能直接使用java編碼。orm

前文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)進行具體的切點注入實現。

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

圖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 做者:曾禮

相關文章
相關標籤/搜索