agent开发之oneAgent

agent-one 集成多个agent为一个agnet的工具集成包

背景

当前存在多个Agent:JMX、skywalking、在线压测、安全agent等

多Agent存在,每个Agent的注入方式、加载参数加载顺序不固定,用户注入过程复杂。
没有统一的状态监控界面,不利于管理。

oneagent 需要支持的 功能:
支持加载指定目录下的jar,并执行其指定的agentStartMethod,默认是premain
支持指定加载的agent顺序。通过agentEnableList设置
支持用户设置classLoader 的类型,默认是系统类加载器
支持将jar包添加到bootstrap里面
支持设置jvm参数、agent args运行参数

设计

整体包结构设计

agent开发之oneAgent_第1张图片

整体流程

agent开发之oneAgent_第2张图片

配置设计

系统配置加载优先级

项目启动的时候会加载系统配置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配置

加载完系统配置根据agent_default_conf_dir/xx.conf_dir配置的目录地址加载xx_agent_conf.properties文件,如果文件不存在则不加载。


不支持环境变量/jvm -D参数设置

agent配置内容
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=

配置环境变量支持

  • 格式#{lable}
  • 系统的环境变量、jvm -D参数都支持
  • “#{agent_one_class_path} 代表整个agent one的jar包路径”
  • “#{xx_agent_class_path} 代表 xx agent的jar包路径,例如#{jmx_agent_class_path}”

配置优先级


系统配置支持jvm和环境变量设置,agent配置不支持

例如:可以通过jvm参数或者系统环境变量设置agent_enable_list 来控制启动agent列表


jvm > 系统环境变量 > agent配置 > 系统配置

classLoder加载方式

类加载器类型 system:系统类加载器 url:自定义的urlClassLoader 默认是system

system: 使用系统的类加载器

url: 每个agent都新建一个URLClassLoader,其父类是Thread.currentThread().getContextClassLoader()。

第三方插件接入方式

方式一:url下载方式
  • 配置自己的下载agent的脚本,放到文件服务器(oss)
  • 将下载地址配置到agent的配置文件中
  • 新agent的配置文件,可以通过xx.conf_dir 环境变量设置。或者直接内置到agent的包
  • agent_enable_list 开启agent

安全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
方式二:挂载file方式
  • 配置自己的下载agent的脚本,挂载到k8s
  • 将file地址配置到agent的配置文件中
  • 新agent的配置文件,可以通过xx.conf_dir 环境变量设置。或者直接内置到agent的包
  • agent_enable_list 开启agent

安全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";
    }

}

你可能感兴趣的:(agent,java,jvm,java,linux)