- 1. 陈禧,韦光林云平台监控数据收集jmeter插件开发
- 2. 1、项目背景与目标2、项目难点及重点3.前期分析与项目实施目录
- 3. 项目背景与目标 1. 项目背景
公司需要搭建一套性能自动化测试云平台用于性能测试回归及执行,以便提升性能测试效率,减少人力回归成本以及完善部门容量规划。
在压测监控数据收集方面,考虑在jmeter-plugin跟serveragent源码的基础上改造一套数据收集插件。
2. 任务目标
改造jmeter-plugin以及serveragent插件,使其当进行自动化性能压测时,可以自动收集服务器压测数据包括pc端,jvm,c3p0,tbico等数据并将数据存入mongodb,以供云平台前端读取数据,解析展示成数据图形。
- 4. 项目难点跟重点总体思路之五个如何:
1.jmeterplugin是如何将参数指标传给serveragent,serveragent又是如何接收到数据的?
2.如何使得jmeterplugin传完参数给serveragent后彻底断开链接并让serveragent继续收集数据?
3.serveragent通过什么方式收集数据,具体的每一个参数指标的数据收集又是如何实现?
4.jvm,tbico,c3p0等数据获取的插件如何编写?
5.serveragent收集到数据后如何存入mongodb,以什么样的模式和格式?
- 5. 前期分析及项目实施1. 环境搭建
1. 1. 网上下载jmeter-plugin以及serveragent源码包
下载地址:https://github.com/undera/jmeter-plugins。
1.2. Eclipse 安装好maven插件,将源码包以Existing Maven Projects形式导入Eclipse,即建立一个新的maven项目。
- 6. 前期分析及项目实施2. 前期分析
2. 1.第一版设计:通过jmeterplugin以原始长连接的方式向serveragent传送参数,serveragent收到需要收集的参数指标后,自行从服务器收集数据,把结果返回给jmeterplugin,再通过jmeterplugin通过mongodb的插件将数据写入mongodb
- 7. 前期分析及项目实施2. 1.1.通过PerfMonCollector类重写initiateConnectors()方法让其能从user.properties中获取需要收集的指标参数通过addMetric()方法进行传参给serveragent
- 8. 前期分析及项目实施2. 1.2.通过PerfMonCollector类中generateSample()方法取到serveragent返回的监控数据结果,并把其存入mongodb
- 9. 前期分析及项目实施2. 2.第二版设计:因为第一版设计收集数据是用的TCP长连接的方式,考虑到监控服务器较多的时候会占用较大内存有损性能,所以需要进行改进,使用短链接的方式进行。
- 10. 前期分析及项目实施这里我们前期讨论了两个方案
第一个方案:jmeterplugin与serveragent建立连接后传送指标参数给serveragent,然后断开连接让serveragent自动收集数据之后存入mongodb,当压测完成后再使jmeterplugin与serveragent重新建立连接,发送停止收集的指令,
那么这里如何通过程序建立第二次链接并发送停止收集指令
初步思路是,第一次通过shutdownconnect()方法断开链接,第二次当压测完成后通过手动点击jmeter stop按钮让其触发重写建立链接然后发送停止指令的程序
不过这里考虑重写那段代码有一定难度,
所以有了第二个方案:就是当jmeterplugin与serveragent建立连接后传送指标参数给serveragent的同时传入收集的次数跟间隔时间,然后断开连接
让serveragent自动收集数据存入mongodb,当收集完指定次数后自行停止收集,这样就解决了需要通过再次建立连接发送停止收集指令的问题
- 11. 前期分析及项目实施2.2.1.通过PerfMonCollector类中shutdownConnectors()方法自动断开链接
改造serveragent当jmeterplugin传入cmdtype=exit时,继续收集数据,循环指定次数后停止
- 12. 前期分析及项目实施2.2.2.以什么样的模式将获取的数据存入mongodb,这里也有两种方式。第一种方式通过getMetricsLine()方法可以统一取到收集的结果数据,然后分别Put进入mongodb
- 13. 前期分析及项目实施2.2.3.另一种方式通过分层的模式分别取到Pcdata,Jvmdata,C3p0data,Mqdata,
然后统一封装成一个MonitorResult对象,转换成Json统一insert进mongodb。
ResultData rd=new ResultData();
JvmData Jvm=new JvmData();
Jvm.jvmtoData();
rd.setJvmdata(Jvm);
DsData ds=new DsData();
ArrayList List = new ArrayList();
try{
ds.dstoList(List);
}catch(Exception e){
}
rd.setDsdata(List);
PcData pc=new PcData();
pc.pctodata();
rd.setPcdata(pc);
Gson gson=new Gson();
//转换成json字符串,再转换成DBObject对象
DBObject dbObject = (DBObject) JSON.parse(gson.toJson(rd));
- 14. 前期分析及项目实施2.3.具体pcdata之cpu的收集
首先通过CPUTotalMetric()方法获取到要收集的cpu的param及Type类型,然后通过getValue()方法获取到值
switch (this.type) {
case 0:
val = cpu.getCombined();
double cpures1=100 * val;
cpures=df.format(cpures1);// cpu百分比
break;
case 1:
val = cpu.getIdle();
double cpuidleres1=100 * val;
cpuidleres=df.format(cpuidleres1);// cpu空闲
break;
case 2:
val = cpu.getUser();
double cpuuserres1=100 * val;
cpuuserres=df.format(cpuuserres1);// cpu用户态
break;
case 3:
val = cpu.getWait();
double cpuiowaitres1=100 * val;
cpuiowaitres=df.format(cpuiowaitres1);// cpu IO等待
break;
default:
throw new SigarException("Unknown proc total type " + this.type);
}
- 15. 前期分析及项目实施2.4.1具体jmx数据及c3p0数据的收集
想想如何构思?第一步:取到传过来的参数,第二步:获取连接的方法,第三步:需要收集的具体param类型使用什么方法获取到数据?
JMXMetric(SigarProxy aSigar,MetricParams params) 获取参数
getJmxConnection(String url,String username,String password) 建立链接
- 16. 前期分析及项目实施2.4.2具体jmx数据及c3p0数据的收集
- 17. 前期分析及项目实施2.5.具体tibco数据的收集
具体思路同jmx,c3p0数据收集的思路
- 18. 前期分析及项目实施2.6.存入mongodb后的结果展示
- 19. 谢谢!