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 目录下
相关文章
|
20天前
|
API 数据库 决策智能
基于百炼平台qwen-max的api 打造一套 检索增强 图谱增强 智能工具调用决策的智能体
本文介绍了一种基于阿里云百炼平台的`qwen-max` API构建的智能体方案,该方案集成了检索增强、图谱增强及智能工具调用决策三大模块,旨在通过结合外部数据源、知识图谱和自动化决策提高智能回答的准确性和丰富度。通过具体代码示例展示了如何实现这些功能,最终形成一个能灵活应对多种查询需求的智能系统。
101 11
|
20天前
|
自然语言处理 NoSQL API
基于百炼平台qwen-max的api 打造一套 检索增强 图谱增强 基于指令的智能工具调用决策 智能体
基于百炼平台的 `qwen-max` API,设计了一套融合检索增强、图谱增强及指令驱动的智能工具调用决策系统。该系统通过解析用户指令,智能选择调用检索、图谱推理或模型生成等工具,以提高问题回答的准确性和丰富性。系统设计包括指令解析、工具调用决策、检索增强、图谱增强等模块,旨在通过多种技术手段综合提升智能体的能力。
107 5
|
1月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
74 9
|
28天前
|
SQL Java 索引
java小工具util系列2:字符串工具
java小工具util系列2:字符串工具
140 83
|
14天前
|
人工智能 API 语音技术
TEN Agent:开源的实时多模态 AI 代理框架,支持语音、文本和图像的实时通信交互
TEN Agent 是一个开源的实时多模态 AI 代理框架,集成了 OpenAI Realtime API 和 RTC 技术,支持语音、文本和图像的多模态交互,具备实时通信、模块化设计和多语言支持等功能,适用于智能客服、实时语音助手等多种场景。
105 15
TEN Agent:开源的实时多模态 AI 代理框架,支持语音、文本和图像的实时通信交互
|
23天前
|
人工智能 自然语言处理 JavaScript
Agent-E:基于 AutoGen 代理框架构建的 AI 浏览器自动化系统
Agent-E 是一个基于 AutoGen 代理框架构建的智能自动化系统,专注于浏览器内的自动化操作。它能够执行多种复杂任务,如填写表单、搜索和排序电商产品、定位网页内容等,从而提高在线效率,减少重复劳动。本文将详细介绍 Agent-E 的功能、技术原理以及如何运行该系统。
74 5
Agent-E:基于 AutoGen 代理框架构建的 AI 浏览器自动化系统
|
25天前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
46 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
10天前
|
监控 Linux Windows
如何在主机安装主机管理工具WGCLOUD的agent端
WGCloud 是一款用于主机监控的工具,通过在目标主机上部署 agent 实现监控。无论是 server 主机还是被监控主机,均需运行 agent。安装包中包含 server 和 agent,只需启动相应 agent 即可。支持多种部署方式,包括压缩包复制、一键部署脚本等。确保 server 和 agent 版本一致,并正确配置 `application.properties` 中的 `serverUrl` 和 `wgToken`。
|
1月前
|
Arthas 监控 Java
拥抱 OpenTelemetry:阿里云 Java Agent 演进实践
本文介绍了阿里云 Java Agent 4.x 版本在基于 OTel Java Agent 二次开发过程中的实践与思考,并重点从功能、性能、稳定性、兼容性四个方面介绍了所做的工作。同时也介绍了阿里云可观测团队积极参与开源建设取得的丰厚成果。
206 7
拥抱 OpenTelemetry:阿里云 Java Agent 演进实践
|
28天前
|
Java 数据库
java小工具util系列1:日期和字符串转换工具
java小工具util系列1:日期和字符串转换工具
55 26