agent-one 集成多个agent为一个agnet的工具集成包
当前存在多个Agent:JMX、skywalking、在线压测、安全agent等
多Agent存在,每个Agent的注入方式、加载参数加载顺序不固定,用户注入过程复杂。
没有统一的状态监控界面,不利于管理。
oneagent 需要支持的 功能:
支持加载指定目录下的jar,并执行其指定的agentStartMethod,默认是premain
支持指定加载的agent顺序。通过agentEnableList设置
支持用户设置classLoader 的类型,默认是系统类加载器
支持将jar包添加到bootstrap里面
支持设置jvm参数、agent args运行参数
项目启动的时候会加载系统配置agent_one_sys-{agent_env}.properties。 可以通过-Dagent_env 设置环境
加载优先顺序:
1 jvm参数/系统环境变量中的sys_config_path
2 {agent jar所在路径}/agent-one/agent-conf/
3 {agent jar包内部}/META-INF/agentone/
系统配置的配置项都可以支持环境变量/jvm -D参数设置
# 启动列表,多个agent逗号分隔
agent_enable_list=jmx
# agent的默认配置目录,会去加载xx_agent_conf.properties文件
agent_default_conf_dir=#{agent_one_class_path}/agent-one/agent-conf/
# 全局设置 是否以线程方式启动agent
agent_default_enable_thread=true
#类加载器类型 system:系统类加载器 url:自定义的urlClassLoader 默认是system
agent_default_class_type=system
# agent的配置路径,可以在系统配置里面配置某个agent的配置 格式:{agent名称}.{配置属性}
# 定制插件配置地址
jmx.conf_dir=#{agent_one_class_path}/agent-one/agent-conf/
jmx.agent_path=#{agent_one_class_path}/agent-one/agent-modules/jmx_prometheus_javaagent-0.16.2-SNAPSHOT.jar
# agent的类名称
jmx.agent_class_name=io.prometheus.jmx.shaded.io.prometheus.jmx.JavaAgent
# agent的参数
jmx.agent_param=19090:#{jmx_agent_class_path}/config.yaml
# agent的启动函数
jmx.agent_start_method=premain
jmx.jvm_param=
#internal 内部的 agent 外部agent file 文件 url 下载文件
jmx.agent_type=agent
# 文件/下载地址
jmx.filePath=
加载完系统配置根据agent_default_conf_dir/xx.conf_dir配置的目录地址加载xx_agent_conf.properties文件,如果文件不存在则不加载。
不支持环境变量/jvm -D参数设置
name=jmx
agent_path=#{agent_one_class_path}/agent-one/agent-modules/jmx_prometheus_javaagent-0.16.2-SNAPSHOT.jar
# agent的类名称
agent_class_name=io.prometheus.jmx.shaded.io.prometheus.jmx.JavaAgent
# agent的参数
agent_param=19090:#{jmx_agent_class_path}/config.yaml
# agent的启动函数
agent_start_method=premain
jvm_param=
#internal 内部的 agent 外部agent file 文件 url 下载文件
agent_type=agent
# 文件/下载地址
file_path=
系统配置支持jvm和环境变量设置,agent配置不支持
例如:可以通过jvm参数或者系统环境变量设置agent_enable_list 来控制启动agent列表
jvm > 系统环境变量 > agent配置 > 系统配置
类加载器类型 system:系统类加载器 url:自定义的urlClassLoader 默认是system
system: 使用系统的类加载器
url: 每个agent都新建一个URLClassLoader,其父类是Thread.currentThread().getContextClassLoader()。
安全iast接入agent配置案例:
name=iast
agent_path=/app/deploy/iast/agent.jar
agent_class_name=cn.xmirror.iast.agent
agent_jvm_param=xmiast.ip=xxx;xmiast.port=xxxx;xmiast.projectname=#{SYSTEM_CODE}+#{SERVICE_NAME};xmiast.writeconfig=false;xmiast.nodename=#{IMAGE_ADDRESS}
agent_start_method=premain
agent_class_type=system
agent_type=url
agent_file_path=http://itao-ujp-core-shenzhen-xili1-oss.sit.sf-express.com:8080/v1/AUTH_ITAO-UJP-CORE/ujp/iast.sh
安全iast接入agent配置案例:
name=iast
agent_path=/app/deploy/iast/agent.jar
agent_class_name=cn.xmirror.iast.agent
agent_jvm_param=xmiast.ip=xxxx;xmiast.port=xxxx;xmiast.projectname=#{SYSTEM_CODE}+#{SERVICE_NAME};xmiast.writeconfig=false;xmiast.nodename=#{IMAGE_ADDRESS}
agent_start_method=premain
agent_class_type=system
agent_type=file
agent_file_path=/app/deploy/iast.sh
系统配置类
package com.sf.cnp.agent.config;
import java.util.List;
import java.util.Map;
public class SysConfig {
/**
* 启动agent列表
*/
List<String> agentEnableList;
/**
* agent所在的默认路径
*/
String agentConfDir;
/**
* key:agentName value:AgentConfig
*/
Map<String,AgentConfig> agentConfigMap;
/**
* 以线程方式启动
*/
String enableThread;
/**
* 类加载器类型 system:系统类加载器 url:自定义的urlClassLoader
*/
String classLoaderType;
}
某个agent的配置类
package com.sf.cnp.agent.config;
public class AgentConfig {
String name;
/**
* 配置目录
*/
String confDir;
/**
* agent jar路径
*/
String agentPath;
/**
* agent class name
*/
String agentClassName;
/**
* 参数
*/
String agentParam;
/**
* jvm参数
*/
String jvmParam;
/**
* 启动方法
*/
String agentStartMethod;
/**
* 销毁方法
*/
String agentStopMethod;
/**
* internal 内部的 agent 外部agent file 文件 url 下载文件
*/
String type;
/**
* file 或url地址
*/
String filePath;
/**
* 以线程方式启动
*/
String enableThread;
/**
* 类加载器类型 system:系统类加载器 url:自定义的urlClassLoader
*/
String classLoaderType;
/**
* 是否加到bootstrap path
*/
String addBootStrapPath;
public AgentConfig(){
//默认值
this.type = "agent";
this.agentStartMethod = "premain";
this.addBootStrapPath = "false";
}
}