Java代理工具 one-java-agent

简介: 提供插件化支持,统一管理众多的Java Agent插件支持install/unstall,需要插件方实现接口支持传统的java agent,即已经开发好的java agent

one-java-agent

目标

  1. 提供插件化支持,统一管理众多的Java Agent
  2. 插件支持install/unstall,需要插件方实现接口
  3. 支持传统的java agent,即已经开发好的java agent

插件系统

插件如果希望感知生命周期,可以实现 PluginActivator接口:

public interface PluginActivator {
    // 让插件本身判断是否要启动
    boolean enabled(PluginContext context);
    public void init(PluginContext context) throws Exception;
    /**
     * Before calling this method, the {@link PluginState} is
     * {@link PluginState#STARTING}, after calling, the {@link PluginState} is
     * {@link PluginState#ACTIVE}
     *
     * @param context
     */
    public void start(PluginContext context) throws Exception;
    /**
     * Before calling this method, the {@link PluginState} is
     * {@link PluginState#STOPPING}, after calling, the {@link PluginState} is
     * {@link PluginState#RESOLVED}
     *
     * @param context
     */
    public void stop(PluginContext context) throws Exception;
}

传统的java agent

插件目录下面放一个plugin.properties,并且放上原生的agent jar文件。

例如:

type=traditional
name=demo-agent
version=1.0.0
agentJarPath=demo-agent.jar

则 one java agent会启动这个demo-agent

配置注入

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

  1. 配置到插件的plugin.properties文件里
  2. 通过-D参数配置,比如插件aaa,则可以配置为-Doneagent.plugin.aaa.key1=value1

然后可以通过PluginContext#getProperty("key1")来获取值。

迁移

  • 从一个传统的Java Agent如何迁移到one java agent的形式?
  • 如何同时支持传统的 -javaagent 方式和 one java agent形式?

比如一个传统的Agent,它会有一个包含 premain 函数的类:

public class MyAgent {
    public static void premain(String args, Instrumentation inst) {
        // do something
    }
}

把上面的Agent做同时支持非常简单,先把原来的初始化逻辑抽取为init函数,把原来的初始化逻辑移到里面:

public class MyAgent {
    public static void premain(String args, Instrumentation inst) {
        init(args, inst);
    }
    public static void init(String args, Instrumentation inst) {
        // do something
    }
}

然后按上面的文档,编写一个MyActivator,在init函数里调用原来的MyAgent.init(args, instrumentation);函数

public class MyActivator implements PluginActivator {
...
    @Override
    public void init(PluginContext context) throws Exception {
        Instrumentation instrumentation = context.getInstrumentation();
        String args = context.getProperty("args");
        MyAgent.init(args, instrumentation);
    }
...
}

在MyActivator init函数里,args可以通过配置注入一节注入,或者通过自定义的方式来获取。

这样子,Agent就可以同时支持传统方式和One Java Agent方式启动。

插件之间类共享

参考fastjson-demo-plugin,它在plugin.properties里配置了exportPackages=com.alibaba.fastjson

当其它插件想引用共享的fastjson时,需要在plugin.properties里配置:

importPackages=com.alibaba.fastjson

插件注册自定义 ClassLoaderHandler

当插件增强应用ClassLoader里加载的类时,会出现一个问题,当调用插件自己的类时,会加载不到。因此提供一个ClassLoaderHandler机制,插件方可以自行注册处理自己package下的类加载。

参考dubbo-test-plugin里:

  • /dubbo-test-plugin/src/main/java/com/test/dubbo/DubboPluginClassLoaderHandler.java
  • /dubbo-test-instrument/src/main/java/org/apache/dubbo/monitor/support/MonitorFilter.java

MonitorFilter里调用了在 plugin里加载的com.test.dubbo.RpcUtils

编译开发

  • 本项目依赖 bytekit: https://github.com/alibaba/bytekit ,可能需要先mvn clean install bytekit
  • 执行测试: mvn clean package -DskipTests && mvn test
  • mvn clean package -P local -DskipTests会打包后安装最新到本地 ~/oneoneagent 目录下
相关文章
|
12天前
|
算法 数据可视化 Java
Java中的性能调优技巧与工具推荐
Java中的性能调优技巧与工具推荐
|
3天前
|
监控 Java 数据库连接
Java开发者的实用性能调优技巧与工具
Java开发者的实用性能调优技巧与工具
|
8天前
|
人工智能 自然语言处理 前端开发
你要的AI Agent工具都在这里
只有让LLM(大模型)学会使用工具,才能做出一系列实用的AI Agent,才能发挥出LLM真正的实力。本篇,我们让AI Agent使用更多的工具,比如:外部搜索、分析CSV、文生图、执行代码等。
你要的AI Agent工具都在这里
|
6天前
|
监控 Java 测试技术
Java性能测试与调优工具使用指南
Java性能测试与调优工具使用指南
|
13天前
|
JavaScript Java BI
BMapTileCutter(Java切图工具)
BMapTileCutter(Java切图工具)
20 7
|
14天前
|
网络协议 Java 程序员
TCP/IP协议栈是网络通信基础,Java的`java.net`包提供工具,使开发者能利用TCP/IP创建网络应用
【6月更文挑战第23天】 **TCP/IP协议栈是网络通信基础,它包含应用层(HTTP, FTP等)、传输层(TCP, UDP)、网络层(IP)、数据链路层(帧, MAC地址)和物理层(硬件信号)。Java的`java.net`包提供工具,使开发者能利用TCP/IP创建网络应用,如Socket和ServerSocket用于客户端和服务器通信。**
28 3
|
2天前
|
IDE Java 持续交付
Java中的代码质量检查与自动化工具
Java中的代码质量检查与自动化工具
|
2天前
|
设计模式 Java C++
Java中的静态代理与动态代理详解
Java中的静态代理与动态代理详解
|
2天前
|
敏捷开发 Java jenkins
实现Java中的自动化测试策略和工具推荐
实现Java中的自动化测试策略和工具推荐
|
4天前
|
设计模式 Java C++
Java中的静态代理与动态代理详解
Java中的静态代理与动态代理详解