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

Wesley13
• 阅读 323

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

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

图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)进行具体的切点注入实现。

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 作者:曾礼

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
2年前
BeeAPM无侵入分布式全链路监控&追踪
BeeAPM是一个分布式跟踪和应用性能监控系统。该系统应用JavaAgent技术,使用bytebuddy(基于ASM的框架)进行字节码植入,从而对java应用程序进行相关数据采集和性能监控,对应用无侵入。部署agent部署server部署UI部署介绍采集端(age
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
UAVStack的慢SQL数据库监控功能及其实现
!(https://oscimg.oschina.net/oscnet/4d6e0c184a1cee4f0acc5a7e689fc556ec7.png)UAVStack是一个全维监控与应用运维平台。UAV.Monitor具备监控功能,包含基础监控、应用/服务性能监控、日志监控、业务监控等。在应用监控中,UAV可以根据应用实例画像;其中应用实例
Python进阶者 Python进阶者
5个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这