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,寓意转化器,提供字节码文件流转化的能力。编码

1
图1 Class文件转化图

集合premain和transformer两大神器,能够对加载进JVM的任意Class文件进行修改。其流程如图1所示,任何Class文件加载时候,都要通过premain这一关卡,经过一系列的transformer,Class字节码文件流最终变成那个完美的它,而后被加载到JVM中。固然,修改Class字节码文件流的动做是在transformer中进行的。这就有个问题,拿到了字节码文件流,怎么修改呢?固然是发挥人类的特长,借助工具,好比说javassist。orm

Javassist技术cdn

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官方微信群,相信您必定会有收获!

相关文章
相关标签/搜索