one-java-agent-00-统一管理浩繁的Java Agent

打印 上一主题 下一主题

主题 969|帖子 969|积分 2907

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
java agent 系列

java agent 介绍
java agent-02-Java Instrumentation API
java agent-03-Java Instrumentation 结合 bytekit 实战笔记 agent attach
java agent-03-Java Instrumentation 结合 bytekit 实战笔记 agent premain
java agent-04-统一管理浩繁的Java Agent
java agent-05-bytekit 入门介绍
目标


  • 提供插件化支持,统一管理浩繁的Java Agent
  • 插件支持install/unstall,必要插件方实现接口
  • 支持传统的java agent,即已经开发好的java agent
插件体系

插件如果希望感知生命周期,可以实现 PluginActivator接口:
  1. public interface PluginActivator {
  2.     // 让插件本身判断是否要启动
  3.     boolean enabled(PluginContext context);
  4.     public void init(PluginContext context) throws Exception;
  5.     /**
  6.      * Before calling this method, the {@link PluginState} is
  7.      * {@link PluginState#STARTING}, after calling, the {@link PluginState} is
  8.      * {@link PluginState#ACTIVE}
  9.      *
  10.      * @param context
  11.      */
  12.     public void start(PluginContext context) throws Exception;
  13.     /**
  14.      * Before calling this method, the {@link PluginState} is
  15.      * {@link PluginState#STOPPING}, after calling, the {@link PluginState} is
  16.      * {@link PluginState#RESOLVED}
  17.      *
  18.      * @param context
  19.      */
  20.     public void stop(PluginContext context) throws Exception;
  21. }
复制代码
传统的java agent

插件目录下面放一个 plugin.properties,而且放上原生的agent jar文件。
例如:
  1. type=traditional
  2. name=demo-agent
  3. version=1.0.0
  4. agentJarPath=demo-agent.jar
复制代码
则 one java agent会启动这个demo-agent。
设置注入

One Java Agent很方便可以注入设置到插件里。

  • 设置到插件的plugin.properties文件里
  • 通过-D参数设置,比如插件aaa,则可以设置为-Doneagent.plugin.aaa.key1=value1
  • 然后可以通过PluginContext#getProperty("key1")来获取值。
迁徙

从一个传统的Java Agent如何迁徙到one java agent的情势?
如何同时支持传统的 -javaagent 方式和 one java agent情势?
比如一个传统的Agent,它会有一个包罗 premain 函数的类:
  1. public class MyAgent {
  2.     public static void premain(String args, Instrumentation inst) {
  3.         // do something
  4.     }
  5. }
复制代码
把上面的Agent做同时支持非常简朴,先把原来的初始化逻辑抽取为init函数,把原来的初始化逻辑移到里面:
  1. public class MyAgent {
  2.     public static void premain(String args, Instrumentation inst) {
  3.         init(args, inst);
  4.     }
  5.     public static void init(String args, Instrumentation inst) {
  6.         // do something
  7.     }
  8. }
复制代码
然后按上面的文档,编写一个MyActivator,在init函数里调用原来的MyAgent.init(args, instrumentation);函数
  1. public class MyActivator implements PluginActivator {
  2. ...
  3.     @Override
  4.     public void init(PluginContext context) throws Exception {
  5.         Instrumentation instrumentation = context.getInstrumentation();
  6.         String args = context.getProperty("args");
  7.         MyAgent.init(args, instrumentation);
  8.     }
  9. ...
  10. }
复制代码
在MyActivator init函数里,args可以通过设置注入一节注入,或者通过自定义的方式来获取。
这样子,Agent就可以同时支持传统方式和One Java Agent方式启动。
插件之间类共享

参考fastjson-demo-plugin,它在plugin.properties里设置了exportPackages=com.alibaba.fastjson。
当其它插件想引用共享的fastjson时,必要在plugin.properties里设置:
  1. importPackages=com.alibaba.fastjson
复制代码
插件注册自定义 ClassLoaderHandler

当插件增强应用ClassLoader里加载的类时,会出现一个问题,当调用插件自己的类时,会加载不到。
因此提供一个ClassLoaderHandler机制,插件方可以自行注册处置惩罚自己package下的类加载。
参考dubbo-test-plugin里:
  1. /dubbo-test-plugin/src/main/java/com/test/dubbo/DubboPluginClassLoaderHandler.java
  2. /dubbo-test-instrument/src/main/java/org/apache/dubbo/monitor/support/MonitorFilter.java
复制代码
在MonitorFilter里调用了在 plugin里加载的com.test.dubbo.RpcUtils。
设置define 工具类

在增强代码之后,如果把逻辑全部写到 @Instrument 里:

  • 增强代码会太复杂
  • 有重复的逻辑必要重用
  • @Instrument里插入的代码缺少行号
那么可以定义一些工具类,在运行时动态 define 到应用的 ClassLoader 里。
参考: dubbo-test-instrument/src/main/resources/instrument.properties里define设置。
编译开发

本项目依赖 bytekit: https://github.com/alibaba/bytekit ,可能必要先 mvn clean install bytekit
实验测试: mvn clean package -DskipTests && mvn test
mvn clean package -P local -DskipTests 会打包后安装最新到本地 ~/oneoneagent 目录下
参考资料

https://github.com/alibaba/one-java-agent

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

温锦文欧普厨电及净水器总代理

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表