暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

「测试」jmeter+influxdb+grafana实践

将咖啡转化为程序的工具人 2021-09-08
1426

在上一篇阶梯式压测的文章中,我们通过jmeter的插件来查看TPS和响应时间的结果:

对于压力测试来说,我们关心的无非就是TPS、RT、错误率这三个指标。通过jmeter自带的插件去生成结果图,比较简陋,且后期整理起来会比较麻烦,需要一个个去查找,无法分析趋势。因此,这篇文章将介绍如何解决这个问题。


我们可以通过Jmeter+InfluxDB+Grafana来展示性能的结果及趋势。可以通过influxdb将每次jmeter执行的结果保存起来。InfluxDB是一款用Go语言编写的开源分布式时序、事件和指标数据库,无需外部依赖。该数据库现在主要用于存储涉及大量的时间戳数据,如DevOps监控数据,APP metrics, loT传感器数据和实时分析数据。

InfluxDB的特点可以归纳为以下9个方面:

  • 无结构(无模式):可以是任意数量的列;

  • 可以设置metric的保存时间;

  • 支持与时间有关的相关函数(如min、max、sum、count、mean、median等),方便统计;

  • 支持存储策略:可以用于数据的删改。(influxDB没有提供数据的删除与修改方法);

  • 支持连续查询:是数据库中自动定时启动的一组语句,和存储策略搭配可以降低InfluxDB的系统占用量;

  • 原生的HTTP支持,内置HTTP API;

  • 支持类似sql语法;

  • 支持设置数据在集群中的副本数;

  • 支持定期采样数据,写入另外的measurement,方便分粒度存储数据。


再通过grafana的看板展示具体的性能指标和趋势,grafana是一款用Go语言开发的开源数据可视化工具,可以做数据监控和数据统计,带有告警功能。

grafana的特点可以归纳为如下:

  • 可视化:快速和灵活的客户端图形具有多种选项。面板插件为许多不同的方式可视化指标和日志。

  • 报警:可视化地为最重要的指标定义警报规则。Grafana将持续评估它们,并发送通知。

  • 通知:警报更改状态时,它会发出通知。接收电子邮件通知。

  • 动态仪表盘:使用模板变量创建动态和可重用的仪表板,这些模板变量作为下拉菜单出现在仪表板顶部。

  • 混合数据源:在同一个图中混合不同的数据源!可以根据每个查询指定数据源。这甚至适用于自定义数据源。

  • 注释:注释来自不同数据源图表。将鼠标悬停在事件上可以显示完整的事件元数据和标记。

  • 过滤器:过滤器允许您动态创建新的键/值过滤器,这些过滤器将自动应用于使用该数据源的所有查询。

大致的操作就是通过添加jmeter的backend listener来完成监控数据的存储,可以配置application name,measurement name,percentage和test title等。

我们一起简单看一看的jmeter源码,在InfluxdbBackendListenerClient.java中:jmeter会将运行的事务的total请求,发送和接受字节,最大值、最小值、平均值都加到metric中,同时也会分别统计成功和失败的事务信息。

然后通过influxdbMetricsManager.writeAndSendMetrics()将监控数据发送给influxDB。

influxdb安装:

    brew update
    brew install influxdb

    启动influxdb:

      1)执行influxd命令启动后台服务
      2)执行influx命令启动influxdb cli


      通过select * from measurements看一下influxDB的存储的数据结构:


      在influxDB中,创建了两个measurements,分别是events和jmeter。在jmeter的measurement中,我们可以看到所有事务的统计信息,grafana展示时所用到的数据也是来自这个表,根据数据的时序展示不同的曲线。


      在 InfluxDB 中,我们可以粗略的将要存入的一条数据看作一个虚拟的 key 和其对应的 value(field value),格式如下:

      cpu_usage,host=server01,region=us-west

      value=0.64 1434055562000000000



      再来看一下grafana的配置,1)配置influxdb的数据源url:

      2)配置influxdb的database信息:

      3)在grafana中import官方提供的jmeter的dashboard模板:

      就可以看到界面了:

      我们来看下具体的TPS的图是按照什么规则绘制出来的?

      通过select last('count') from all transaction 计算TPS。


      再看看响应时间的计算规则:

      通过统计status = OK 的last(avg) 来获取平均响应时间,也可以通过

        SELECT last("pct90.0") FROM "$measurement_name" WHERE ("transaction" =~ ^$transaction$/ AND "statut" = 'ok') AND $timeFilter GROUP BY time($__interval) fill(null)

        来获取P90的响应时间。


        错误率是如何计算出来的?

        可以通过如下方式error总量/所有事务数获得:

          SELECT sum("error")  sum("all") 
          FROM
          (SELECT sum("count") AS "all" FROM "$measurement_name"
          WHERE "transaction" =~ /^$transaction$/ AND "statut" = 'all'
          AND "application" =~ /^$application$/
          AND $timeFilter GROUP BY time($__interval) fill(null)),
          (SELECT sum("count") AS "error" FROM "$measurement_name"
          WHERE "transaction" =~ /^$transaction$/ AND "statut" = 'ko' 
          AND "application" =~ /^$application$/ 
          AND $timeFilter GROUP BY time($__interval) fill(null))

          至此,jmeter+influxdb+grafana的配置就完成了,可以通过筛选不同的时间段,来分析性能的各项指标以及趋势。


          今天的学习就到这里,如果这篇文章对你有所帮助,请点赞和转发哦👍

          文章转载自将咖啡转化为程序的工具人,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

          评论