前言

Jmeter是一款性能测试,压力测试的开源工具,被大量的测试人员拿来测试产品的性能,负载等等。 Jmeter除了强大的预置的各种插件,各种可视化图表工具以外,也有些固有的缺陷,例如:

  • 我们往往只能在报告中分析同一个部署的性能,不方便进行纵向的比较,例如我们每个build都会跑一次性能测试,但是两个build之间性能有没有变差?这些只能我们拿到结果报告,然后自己用其他第三方工具来分析
  • Jmeter的图表插件产生的报告不够灵活,一般是固定的几个维度,不能更灵活的进行分析

本文会尝试将JMeter的sample数据写入ElasticSearch,然后通过Kibana强大的搜索和可视化能力,进行各种维度的性能分析,帮助开发测试人员找出性能的瓶颈,监控系统性能的变化情况,给整个开发,测试和运维团队发布各种报告

问题

如何自动化的把性能测试的各种原始数据写入ElasticSearch

信息采集上这里有两种可行的方案,

  • 一种让JMeter生成各种报告,然后在测试跑完之后,用自己写的结果分析脚本,把数据导入ElasticSearch,这种方式不影响JMeter的运行,但是不具有通用性/实时性,而且由于一般JMeter的各种报告并没有包含全面的性能信息,这些信息的缺失是致命的,没有原始信息,接下来的各种分析就是无源之水
  • 另外一种,就是我们采用的,实时的采集JMeter的Sample的性能信息,在不影响JMeter本省性能的情况下,相对实时的把结果写入ElasticSearch。优点是信息比较完备,而且可以包含其他自定义参数,在跑长时间的负载测试的时候,可以实时的监控系统的性能

对于数据采集,技术上,我们采用了开发一个JMeter的Backend Listener插件,这个插件会处理JMeter的每个Sample的结果

与BackendListener有关的信息可以查看 http://jmeter.apache.org/api/org/apache/jmeter/visualizers/backend/BackendListenerClient.html

我们着重看看SampleResult包含的信息,基本上我们可以拿到:

  • 请求的URL
  • 请求的各种参数
    • Cookies
    • Headers
    • Paramters
  • 响应的各种参数
    • Headers
    • Cookies
    • Body
    • Response Code
  • JMeter相关信息
    • Sample Label

这些信息已经足够我们用来分析性能了,在具体采集上,我们也会看自己的需要,只保存感兴趣的参数,用来节省ElasticSearch的存储空间,例如只保存出错的响应的body

关于SampleResult,具体可以参见 https://jmeter.apache.org/api/org/apache/jmeter/samplers/SampleResult.html

对于保存采样结果,技术上也有几个选择:

  • 通过ElasticSearch的RestClient
  • 通过我们这里使用的TransportClient
  • 通过ElasticSearch的NodeClient

三种方式性能是依次提高的,能实现的功能也是逐个增强的。因为我们只是保存数据,并没有ElasticSearch的管理的需求,但是对性能有很强的需求,所以我们选择了TransportClient, 关于三种连接方式的具体介绍,可以参见:

  • RestClient       https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/index.html
  • TransportClient   https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/transport-client.html
  • NodeClient         https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/client.html

如何不影响JMeter本身的性能

JMeter本身就需要生成和管理多个Threads,所以一般情况下,并不建议JMeter 的Test Plan中,包含图形化的分析插件,或者尽量减少各种分析插件的使用。我们引入一个Backendlistener,当然也不希望影响JMeter的性能,或者尽量减少对JMeter本身的影响,我们的策略是:

  采用异步的策略,每50个采样的结果,通过ElasticSearch bulk ingest的API,存入ElasticSearch,减少网络的开销。当然,这里的50是可以自己配置的,根据自己的机器性能、采样数据的大小和网络状况确定

  可以定制化的数据保存策略,例如只保存感兴趣的采样信息

而JMeter本身的BackendListener也是异步的,JMeter的Load并不会等待结果的存储是否完成

当然,具体的性能影响,也需要严格的测试确定,这里我就不展开了,可能接下来会进行一些相关的测试

如何支持Jmeter的Controller/Server的部署方式

初步看下来,JMeter是把各个Server的Sample信息传给Controller处理的,所以呢,当JMeter部署规模比较大的时候,Controller的Sample信息处理会重一些,好在我们一般情况下,Controller上并不会有Load需要处理,所以也还好。。。但是对于插件的使用上,我接下来会部署几台JMeter的server确认下,是各个Server来处理SampleResult还是传回Controller,这个我会在更新中详细介绍,公司的网络,各种限制,还没有机会做这部分。

如何保存各种自定义的参数(除了Jmeter自己提供的参数之外),用于为将来提供更多分析的可能性

比如我们希望保存当前部署的产品的版本号,这个在比较各个不同版本的性能的时候,非常有用。我们在插件中,会把当前机器的以自定义的字符串开头的环境变量都存储到每条JMeter的记录中去。事后,用户就可以很灵活的使用这些自定义的参数来分析性能了(例如,地域代码,产品部署相关的各种参数)

由于时间的问题,今天先介绍下大概的情况,接下来我会更新

  • 如何创建一个JMeter BackendListener,并且调用ElasticSearch的TransportClient保存SampleResult
  • 如何使用Kibana/Kibana Timelion从各个维度分析性能结果
  • 如何与Jenkins集成,创建完成一套性能测试的框架,让所有者一切对使用者都透明

接下来我会把相关的Code放到Github上,并把相关代码开源, 请关注后续的更新。

如何保存JMeter的性能测试数据到ElasticSearch上,并且使用Kibana进行可视化分析(1)的更多相关文章

  1. 【jmeter】基于InfluxDB&Grafana的JMeter实时性能测试数据的监控和展示

    本文主要讲述如何利用JMeter监听器Backend Listener,配合使用InfluxDB+Grafana展示实时性能测试数据 关于JMeter实时测试数据 JMeter从2.11版本开始,命令 ...

  2. jmeter --- 基于InfluxDB&Grafana的JMeter实时性能测试数据的监控和展示

    转自:https://blog.csdn.net/RickyOne_RR/article/details/50637839 本文主要讲述如何利用JMeter监听器Backend Listener,配合 ...

  3. Jmeter实时性能测试数据的监控

    Jmetet实时性能测试数据的监控和展示Jmeter Grafana InfluxDB 安装Grafana配置jmeter安装InfluxDB配置Grafana展示数据一安装InfluxDB 为了方便 ...

  4. 转:基于InfluxDB&Grafana的JMeter实时性能测试数据的监控和展示

    本文主要讲述如何利用JMeter监听器Backend Listener,配合使用InfluxDB+Grafana展示实时性能测试数据 关于JMeter实时测试数据 JMeter从2.11版本开始,命令 ...

  5. Elastic Stack核心产品介绍-Elasticsearch、Logstash和Kibana

    Elastic Stack 是一系列开源产品的合集,包括 Elasticsearch.Kibana.Logstash 以及 Beats 等等,能够安全可靠地获取任何来源.任何格式的数据,并且能够实时地 ...

  6. 性能测试 CentOS下结合InfluxDB及Grafana图表实时展示JMeter相关性能数据

    CentOS下结合InfluxDB及Grafana图表实时展示JMeter相关性能数据   by:授客 QQ:1033553122 实现功能 1 测试环境 1 环境搭建 2 1.安装influxdb ...

  7. ELK 性能(4) — 大规模 Elasticsearch 集群性能的最佳实践

    ELK 性能(4) - 大规模 Elasticsearch 集群性能的最佳实践 介绍 集群规模 集群数:6 整体集群规模: 300 Elasticsearch 实例 141 物理服务器 4200 CP ...

  8. ELK 性能(3) — 在 Docker 上运行高性能容错的 Elasticsearch 集群

    ELK 性能(3) - 在 Docker 上运行高性能容错的 Elasticsearch 集群 介绍 在 Docker 上运行高性能容错的 Elasticsearch 集群 内容 通常熟悉的开发流程是 ...

  9. 数据测试003:利用Jmeter推送测试数据(下)

    数据测试003:利用Jmeter推送测试数据(中) 今天继续学习用Jmeter推送数据,这次换Oracle数据 1)安装jdbc驱动,对应自己数据库安装的版本,我的是11g的,安装目录是在Jmeter ...

随机推荐

  1. oracle tkprof 工具详解

    oracle  tkprof 工具详解 今天是2013-09-26,进行tkprof工具使用学习,在此记录一下笔记: 一)查看需要跟踪会话信息: select s.sid,s.serial#,s.us ...

  2. Android应用程序中Activity的生命周期

    Android应用程序中Activity的生命周期 对于Android来说Activity的生命周期是非常的重要,尤其是对于新学者来说,只有充分了解了Activity的生命周期,才能写出优良用户体验的 ...

  3. Linux以KB显示内存大小

    Linux以KB显示内存大小 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ free -k total used free shared buffers ca ...

  4. [Python爬虫笔记][随意找个博客入门(一)]

    [Python爬虫笔记][随意找个博客入门(一)] 标签(空格分隔): Python 爬虫 2016年暑假 来源博客:挣脱不足与蒙昧 1.简单的爬取特定url的html代码 import urllib ...

  5. ibatis中的resultClass,parameterClass,resultMap,resultType的使用与区别

    parameterClass 是参数类.指定了参数的完整类名(包括包路径).可通过别名避免每次重复书写冗长的类名. resultClass 是结果类, 二.resultClass取值 1.result ...

  6. .NET程序集签名

    强命名程序集的一个好处是防篡改.假如我有一个程序集MyDll.dll,如果我用我自己的私钥进行签名将程序集中的内容进行哈希处理,其他人如果不知道我的私钥的话,就不能篡改我的这个程序集进行某些恶意的行为 ...

  7. taglib的使用

    使用自定义的taglib可以是我们对页面数据的处理放在后台,不仅使用方便,而且影藏了处理逻辑,也更加的安全. 需要使用到servlet.jar 1.在web-inf下建立taglib.tld文件 &l ...

  8. xml bug

    在Eclipse 创建动态WEB 工程,在src 下 创建 config.xml: 1 <?xml version="1.0" encoding="UTF-8&qu ...

  9. cas+tomcat+shiro实现单点登录-3-CAS服务器深入配置(连接MYSQL)

    目录 1.tomcat添加https安全协议 2.下载cas server端部署到tomcat上 3.CAS服务器深入配置(连接MYSQL) 4.Apache Shiro 集成Cas作为cas cli ...

  10. bestcoder r44 p3 hdu 5270 ZYB loves Xor II

    这是昨晚队友跟我说的题,不知道当时是什么玄幻的事件发生了,,我看成了两两相乘的XOR 纠结了好长时间间 不知道该怎么办 今天早上看了下这道题,发现是两两相加的XOR  然后就想了想昨晚的思路 发现可做 ...