# monitor-agent **Repository Path**: senvon/monitor-agent ## Basic Information - **Project Name**: monitor-agent - **Description**: No description available - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2020-03-31 - **Last Updated**: 2021-11-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # monitor-agent #### 介绍 monitor-agent原本是为开发APM的agent客户端的原型研究项目.主要的目的是使用javaagnet的机制,拦截所有需要拦截类,对调用链路进行跟踪. 在尝试APM原型的过程中,一种尝试一下几种方案 * 黑入spring的RootBeanDefinition的resloveBeanClass,使用ASM,给需要代理的类,动态创建非final的继承需要代理类的proxy 这种代理的方式,能很好的结合spring的使用,但是基本需要重写所有的类,而且spring的载入和annotation关系巨大,该方法不是最好的方案,很容易出现各种问题. * 使用spring的BeanPostProcessor的postProcessBeforeInitialization方法,直接使用ASM动态创建一个非final的代理类 这种方式不好的地方在于,无法很有效的识别spring中的factoryBean,以及各种特殊的bean,比如singleton注入的springBean访问.但是这种方法非常适合在应用程序中对dataSource的静态代理. * 在spring中,动态注入一个全局的AOP配置,在AOP过滤中,使用自定义的pointCut方案,即本方案. 在各种bean下面,运行良好.不能代理全局类,不能代理部分spring的原生bean,对service的bean代理很好,暂时没有方法可以直接识别应用service和spring原生bean,需要用户手动指定. #### 软件架构 在tomcat内部执行,还需要注意javaagent的classloader是优先于tomcat的webApplicationClassLoader的.所以在agent中的类,无法载入webApplicationClassLoader的类. 在本方案中,使用javaagent中的transform机制,当加载到spring的时候,直接使用transform中的classLoader(即webApplicationClassLoader)来加载agent里面的classes资源,通过这种方式,可以在agent启动的时候,不加载agent中的class,而在webApplicationClassLoader中加载agent中的class,实现无缝加载. #### 安装教程 在eclipse的配置,在Run Configuration->Arguments->VM argument中配置 -Djavaagen=monitor-agent的代码目录/target/monitor-agent.jar,同时需要在eclipse环境中,增加buildpath的项目依赖,否则有时候无法正确执行javaagent中的正确代码. #### 使用说明 1. xxxx 2. xxxx 3. x