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配置

加载完系统配置根据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开发之oneAgent相关推荐

  1. U9二次开发之BP定时任务插件开发

    采购订单BP定时任务插件开发 最近我们公司要做采购订单审批和OA的集成,也就是把u9的审批流程搬到OA里去做.当业务员点击标准采购提交按钮的时候,把采购订单的信息触发到OA流程,在OA里做审核,OA审 ...

  2. 镜像处理坐标 android,Android应用开发之Android重写ImageView实现图片镜像效果的代码教程...

    本文将带你了解Android应用开发之Android重写ImageView实现图片镜像效果的代码教程,希望本文对大家学Android有所帮助. 前两天朋友问我一个问题,如何实现从手机系统相册加载一张图 ...

  3. iOS开发之AVKit框架使用

    2019独角兽企业重金招聘Python工程师标准>>> iOS开发之AVKit框架使用 一.引言 在iOS开发框架中,AVKit是一个非常上层,偏应用的框架,它是基于AVFounda ...

  4. Android NDK开发之旅31 FFmpeg音频解码

    ###前言 #####基于Android NDK开发之旅30--FFmpeg视频播放这篇文章,我们已经学会视频解码基本过程.这篇文章就对音频解码进行分析. #####音频解码和视频解码的套路基本是一样 ...

  5. android 监听物理返回键,Android应用开发之react-native 监听Android物理返回键

    本文将带你了解Android应用开发之react-native 监听Android物理返回键,希望本文对大家学Android有所帮助. 1. componentWillMount(){         ...

  6. android开发之Intent.setFlags()_让Android点击通知栏信息后返回正在运行的程序

    android开发之Intent.setFlags()_让Android点击通知栏信息后返回正在运行的程序   在应用里使用了后台服务,并且在通知栏推送了消息,希望点击这个消息回到activity, ...

  7. 谷歌的AI应用开发之道

    https://www.toutiao.com/a6718151019873698308/ 全球AI第一大厂,打造AI产品时有何指导思想? 软件+硬件+AI. 没错,这是谷歌CEO皮猜在Google ...

  8. WinForm界面开发之“HTML内容编辑控件”

    做过了很多Winform的共享软件,对界面的设计有了一定的经验和积累,准备开一个"WinForm界面开发"系列文章,介绍下相关的Winform界面设计和相关控件的使用,促进相互交流 ...

  9. python运维开发之socket网络编程01

    python运维开发之socket网络编程01说明:本文来自来自北京老男孩linux运维实战培训中心-运维开发课程免费视频内容,本文内容为系列内容,更多分享信息见:http://oldboy.blog ...

最新文章

  1. 深入浅出CMake(一):基础篇
  2. 关于学生信息录入(文件操作)的心得体会
  3. Go语言中如何进行测试
  4. Java命令行运行参数说明大全--转
  5. 【Python】 文件和操作文件方法
  6. C#获取二叉树深度及分层遍历二叉树
  7. HDU 4117 GRE Words
  8. ESP8266:(2)获取时间和天气
  9. 求斐波那契数列第n位的几种实现方式及性能对比(c#语言)
  10. C#通过字符串分割字符串Split
  11. osg 镜面_浙江天梭手表镜面抛光
  12. 开发者的实用 Vim 插件(二)
  13. 如何将图片的背景色去掉?怎样快速去除背景色?
  14. 印章与印鉴的区别_篆刻与印章到底有什么区别?
  15. 如何防止滴滴出行后台自启
  16. 一只喵的西行记-11 与大叔小萝莉的不打不相识
  17. Notepad++ 设置tab为N个空格
  18. ECCV 2020 论文大盘点-动作检测与识别篇
  19. 理解热插拔技术:热插拔保护电路设计过程实例
  20. 拓扑排序在实际项目中应用

热门文章

  1. linux空格键命令,linux 命令(快捷键)
  2. 丘成桐计算机竞赛用什么电脑,丘成桐这样的学术竞赛到底对申请有没有用?
  3. C语言求1到20的阶乘之和
  4. 屏蔽FF新推荐弹出框
  5. Pandas中describe()函数的使用介绍
  6. 统计软件与数据分析—Lesson2
  7. word两幅图并排并且插入题注不会乱
  8. cmd的tree命令使用方法
  9. android studio 61歌曲服务器搭建 歌曲app 下载 完整代码
  10. MATLAB数列与极限