资讯专栏INFORMATION COLUMN

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

atinosun / 1426人阅读

摘要:注入机制作为工作的基础,也为无侵入捕获应用数据提供可能。代码注入机制结合和技术,在应用字节码加载到之前进行字节码改写。当然,修改字节码文件流的动作是在中进行的。

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 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 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中其它重要框架及其实现原理将会在后续文章中依次剖析,敬请期待。
宜信技术学院

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/72739.html

相关文章

  • UAVStack的慢SQL数据库监控功能及其实现

    摘要:页面展示的统计追踪等信息则通过的接口获取四功能展示数据库监控目前已实现的功能有分类统计数据库连接池监控慢耗时分布统计慢统计慢追踪以及调用链日志关联功能。 作者: 王林林 出处:UAVStack智能运维 来源:宜信技术学院技术沙龙001期|AI中台:一种敏捷的智能业务支持方案|宜信技术沙龙 3月28日晚8点线上直播,点击报名 UAVStack是一个全维监控与应用运维平台。UAV.Mon...

    luodongseu 评论0 收藏0
  • 中间件增强框架-CaptureFramework框架

    摘要:本文为大家讲解中的框架。在系统中,中间件增强框架探针提供了应用画像及性能数据收集等功能,其中数据收集功能主要采集四类数据实时数据画像数据调用链接数据生成以及线程数据分析数据。提供服务,供后续抓取使用,其中服务注册了三个,分别为。 本文为大家讲解MOF中的CaptureFramework框架。该框架提供统一的数据抓取行为和生成抓取结果能力,实现实时数据采集。 背景 应用服务监控是智能运维...

    zhaofeihao 评论0 收藏0
  • 中间件增强框架InterceptFramework

    摘要:拦截之前的准备在应用启动的特定生命周期内改写字节码,植入特定的逻辑处理代码进行拦截。劫持通过字节码改写动态代理等技术,在客户端调用代码中嵌入特定处理逻辑,获取调用相关的信息,如调用地址调用协议调用结果等。 这次我们为大家带来中间件增强框架专题(MOF)的最后一篇文章,为大家讲解MOF中的InterceptFramework框架。该框架可以在应用启动过程中获取画像信息,实现应用画像数据采...

    chnmagnus 评论0 收藏0
  • Kubernetes在宜信落地实践

    摘要:容器云的背景伴随着微服务的架构的普及,结合开源的和等微服务框架,宜信内部很多业务线逐渐了从原来的单体架构逐渐转移到微服务架构。 容器云的背景 伴随着微服务的架构的普及,结合开源的Dubbo和Spring Cloud等微服务框架,宜信内部很多业务线逐渐了从原来的单体架构逐渐转移到微服务架构。应用从有状态到无状态,具体来说将业务状态数据如:会话、用户数据等存储到中间件中服务中。 showI...

    fxp 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<