• 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. 谢谢!