热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

搭建jmeter+influxdb+grafana压测实时监控平台(超详细,小白适用)

1.前言在使用jmeter做性能测试的时候,监控系统性能的时候,无论是使用插件还是报告生成,都没法实现实时监控。使用JMeter+Influxdb+Grafana可以实现实时监控。

1.前言

 在使用jmeter做性能测试的时候,监控系统性能的时候,无论是使用插件还是报告生成,都没法实现实时监控。使用JMeter+Influxdb+Grafana可以实现实时监控。

 

本次环境搭建各软件版本说明:

Grafana v6.2.5

InfluxDB 1.7.0

JMeter 5.2.1

 

2.Influxdb简介
 InfluxDB是用Go语言编写的高性能、高可用的分布式时序数据存储数据库,无其他依赖,安装简单快速。
  该数据库现在主要用于存储涉及大量的时间戳数据,如DevOps监控数据,APP metrics, loT传感器数据和实时分析数据。


InfluxDB特征:



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

  • 可以设置metric的保存时间

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

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

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

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

  • 支持类似sql语法select * from mysql.user

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

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





schemaless: 结构型数据库类似Mysql需要先定义列,influxdb无需预先定义,无结构的
与传统数据库中的名词比较























































































 influxDB中的名词 传统数据库的概念
 database 数据库
 measurement 数据库中的表
 points 表里面的一行数据

 

influxdb的points数据说明




    • time:默认存储数据会有时间,时间无需关心,会帮我们自动插入

    • tags:用来存储数据标识,比如CPU.idle

    • fileds:用来存储数据 value=90










 

3.下载

定位到/usr/local目录下,执行命令:wget https://dl.influxdata.com/influxdb/releases/influxdb-1.7.0.x86_64.rpm --no-check-certificate,然后等待下载完成

技术分享图片

 

 4.解压安装

执行命令:rpm -ivh influxdb-1.7.0.x86_64.rpm

技术分享图片

 安装完之后,生成默认的配置文件 /etc/influxdb/influxdb.conf,可以到/ect目录下去查看

 

5.修改influxDB配置文件

执行命令:vi /etc/influxdb/influxdb.conf,将最终修改的配置如下:

[[graphite]]
# Determines whether the graphite endpoint is enabled.
enabled = true
database = "jmeter" # 数据库名称
retention-policy = ""
bind-address = ":2003" # 端口
protocol = "tcp"
consistency-level = "one"
修改以下信息
[meta]
dir = "/usr/local/influxdb/meta" #存放最终存储的数据,文件以.tsm结尾
[data]
dir = "/usr/local/influxdb/data" #存放数据库元数据 wal
wal-dir = "/usr/local/influxdb/wal" #存放预写日志文件
修改HTTP端口信息
[http]
# Determines whether HTTP endpoint is enabled.
enabled = true
# The bind address used by the HTTP service.
bind-address = ":8086"

修改完成后执行:wq保存退出

 

6.在上一步中我们设置了存放数据的目录为/usr/local/influxdb,这个目录不会自动生成,因此需要手动创建并授权,执行命令如下:

技术分享图片

 我这里使用的是root用户,使用其他用户如果报权限不足则需要切换到root用户

 

7.启动influxDB服务

启动influxDB服务有两种方式:

方式一: 直接执行命令: influxd -config /etc/influxdb/influxdb.conf

启动后显示如下图:

技术分享图片

 方式二(推荐):

-bash-4.2# vi /etc/profile

技术分享图片

添加变量:export INFLUXDB_CONFIG_PATH=/etc/influxdb/influxdb.conf,然后保存,如下图:

技术分享图片

执行:source /etc/profile,是配置文件生效后,执行:influxd &,启动

技术分享图片

 influxDB的tcp端口是8088,执行:netstat -antp|grep 8088,显示如下则表示端口启动成功

技术分享图片

 

8.创建数据库及用户

执行命令如下:

-bash-4.2$ influx

> show databases

> CREATE DATABASE jmeter

> use jmeter

> create user "admin" with password ‘123456‘ with all privileges

此处设置的用户名和密码需要记录下来,后面配置JMeter和Grafana时有用到

技术分享图片 

 注:这里要注意一下,CREATE DATABASE必须使用大写

网上有使用小写创建数据库,如:create databases "jmeter",执行后会报错,报错信息如下

ERR: error parsing query: found DATABASES, expected CONTINUOUS, DATABASE, USER, RETENTION, SUBSCRIPTION at line 1, char 8
Warning: It is possible this error is due to not setting a database.
Please set a database with the command "use ".

 

端口说明:
2003端口:Jmeter往数据库发数据的端口,服务器端也是该端口接收数据,所以如果使用云服务器ECS的话,需要开启该2003端口
8086端口,Grafana从数据库取数据的端口

 

9.JMeter配置

新建一个测试计划,新建一个线程组,右键测试计划选择Add->Listener->Backend Listener,如果使用的是中文则添加后端监听器的路径是:右键测试计划选择添加->监听器->后端监听器

 技术分享图片

 

 技术分享图片

 

添加后端监听器,配置如下图:

 技术分享图片

 

新建请求,然后执行

 技术分享图片

 

 

 10.在服务器上查看influxdb是否有接收数据成功:

执行如下命令:

-bash-4.2$ influx
> show databases
> use jmeter
> show measurements

技术分享图片

 

 

11. 安装配置grafana

配置数据库:

技术分享图片

 选择InfluxDB

技术分享图片

 最终配置如下图,配置好后点击下面的 Save & Test 按钮,提示 Data source is working 就表示数据库连接成功

技术分享图片

 

 

 

 技术分享图片

接下来配置监控面板,配置panel有两种方式:1.手动配置panel  2.在官网下载panel模板 

下面先讲第一种方式:

点击左上角Grafana图标,进入Home界面,点击左侧“+”号菜单,点击Dashboard,

技术分享图片

 进入New dashboard界面,点击Add Query(各个版本的显示不一样,但是操作流程是一样的)

技术分享图片

进入面板设置界面,如下图

 技术分享图片

说明:想了解这些查询具体是什么意思,可以访问Jmeter的官网地址去查看 http://jmeter.apache.org/usermanual/realtime-results.html

线程数/用户相关指标
test.minAT-Min active threads:最小活跃线程数
test.maxAT-Max active threads:最大活跃线程数
test.meanAT-Mean active threads:活跃线程数
test.startedT-Started threads:启动线程数
test.endedT-Finished threads:结束线程数
响应时间指标
.ok.count:采样器的成功响应数
.h.count:每秒点击数
.ok.min:采样器成功最短响应时间
.ok.max:采样器成功最长响应时间
.ok.avg:采样器成功平均响应时间
.ok.pct:采样器成功响应百分比
.ko.count:采样器失败响应数
.ko.min:采样器失败的响应最短时间
.ko.max:采样称失败最长响应时间
.ko.avg:采样器失败平均响应时间
.ko.pct:采样器失败响应百分比
.a.count:采样器响应数(ok.count和ko.count的总和)
.a.min:采样器最小响应时间(ok.count和ko.count的最小值)
.a.max:采样器最大响应时间(ok.count和ko.count的最大值)
.a.avg:采样器平均响应时间(ok.count和ko.count的平均值)
.a.pct:采样器响应百分比(根据和失败样本的总数计算)
Backend Listener的默认百分位设置为“90;95;99”,即百分位数为90%,95%和99%。
Graphite使用点(“.”)去拆分的元素,这可能与十进制百分位值混淆。JMeter转换任何此类值,用下划线(“ - ”)替换点(“.”)。例如,“99.9 ”变为“99_9 ”
默认情况下,JMeter发送在samplerName“all”下累计的所有采样器的指标。 如果配置了 BackendListenerSamplersList,那么JMeter还会发送匹配样本名称的指标,前提是配置 summaryOnly=true

 技术分享图片

 最终显示结果如下:

技术分享图片

 

 接下来讲第二种方式:模板方式

点击左上角Grafana图标,点击Home,然后点击Find dashboards on Grafana.com,会跳转到Grafana官网,或者可以直接进入官网:https://grafana.com/grafana/dashboards?utm_source=grafana_search

技术分享图片

 

 技术分享图片

 

 左侧输入查询模板的条件,如下图,这里选择比较常用的JMeter Load Test模板

技术分享图片

 技术分享图片

 

 下载JMeter-InfluxDB-Writer界面如下图,这里下载的是最新版本1.2版本,点击JMeter-InfluxDB-Writer-plugin-1.2.jar即可下载

 技术分享图片

 下载完成后上传到JMeter安装目录lib/ext目录下,如下图:

 技术分享图片

 然后重启jmeter,选择rocks.nt.apm.jmeter.JMeterinfluxDBBackendListenerClient,输入influxDB的host和端口,之前创建Influxdb的用户名和密码,然后保存。如果host默认是localhost,直接执行会报错:Failed to connect to localhost/0:0:0:0:0:0:0:1:8086

 技术分享图片

 

上图中的用户名和密码可以在服务器中查看,密码是之前创建用户的时候自己输入的,执行命令:

influx

show users

技术分享图片

接下来导入Grafana模板,点击左上角Grafana Logo,点击Home,然后选择Import dashboard

技术分享图片

技术分享图片

打开的界面如下图,这些需要填写模板ID,模板ID获取详见下一步

技术分享图片

 

 在JMeter Load Test模板界面点击Copy ID to Clipboard,将ID复制好然后粘贴到Grafana导入模板界面,如下图:

技术分享图片

 技术分享图片

输入模板ID 1152后,点击空白处,会显示如下图信息,请按照下图中进行修改:

 技术分享图片

 查看模板可以点击左上角Grafana Logo,点击模板名称,这里是默认的JMeter Load Test

技术分享图片

 默认模板显示如下图:

技术分享图片

 

 重启JMeter,执行测试,在Grafana界面的右上角选择要显示的时间,最终显示压测结果如下图(右上角刷新时间建议选小一点,效果会比较明显): 技术分享图片

 

遇到的问题:

1.创建influxdb数据库的时候使用create databases "jmeter",报错

解决办法:必须使用大写来进行创建,命令是:CREATE DATABASE jmeter

 

2.执行Jmeter请求,jmeter日志报Error writing to Graphite: connect timed out,具体报错信息如下:

2020-07-17 16:51:29,810 ERROR o.a.j.v.b.g.TextGraphiteMetricsSender: Error writing to Graphite: connect timed out
java.net.SocketTimeoutException: connect timed out
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) ~[?:1.8.0_171]
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source) ~[?:1.8.0_171]
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) ~[?:1.8.0_171]
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) ~[?:1.8.0_171]
at java.net.AbstractPlainSocketImpl.connect(Unknown Source) ~[?:1.8.0_171]
at java.net.PlainSocketImpl.connect(Unknown Source) ~[?:1.8.0_171]
at java.net.SocksSocketImpl.connect(Unknown Source) ~[?:1.8.0_171]
at java.net.Socket.connect(Unknown Source) ~[?:1.8.0_171]
at org.apache.jmeter.visualizers.backend.graphite.SocketOutputStreamPoolFactory.create(SocketOutputStreamPoolFactory.java:77) ~[ApacheJMeter_components.jar:5.2.1]
at org.apache.jmeter.visualizers.backend.graphite.SocketOutputStreamPoolFactory.makeObject(SocketOutputStreamPoolFactory.java:48) ~[ApacheJMeter_components.jar:5.2.1]
at org.apache.jmeter.visualizers.backend.graphite.SocketOutputStreamPoolFactory.makeObject(SocketOutputStreamPoolFactory.java:34) ~[ApacheJMeter_components.jar:5.2.1]
at org.apache.commons.pool2.impl.GenericKeyedObjectPool.create(GenericKeyedObjectPool.java:1041) ~[commons-pool2-2.7.0.jar:2.7.0]
at org.apache.commons.pool2.impl.GenericKeyedObjectPool.borrowObject(GenericKeyedObjectPool.java:342) ~[commons-pool2-2.7.0.jar:2.7.0]
at org.apache.commons.pool2.impl.GenericKeyedObjectPool.borrowObject(GenericKeyedObjectPool.java:265) ~[commons-pool2-2.7.0.jar:2.7.0]
at org.apache.jmeter.visualizers.backend.graphite.TextGraphiteMetricsSender.writeMetrics(TextGraphiteMetricsSender.java:110) [ApacheJMeter_components.jar:5.2.1]
at org.apache.jmeter.visualizers.backend.graphite.TextGraphiteMetricsSender.writeAndSendMetrics(TextGraphiteMetricsSender.java:104) [ApacheJMeter_components.jar:5.2.1]
at org.apache.jmeter.visualizers.backend.graphite.GraphiteBackendListenerClient.sendMetrics(GraphiteBackendListenerClient.java:183) [ApacheJMeter_components.jar:5.2.1]
at org.apache.jmeter.visualizers.backend.graphite.GraphiteBackendListenerClient.run(GraphiteBackendListenerClient.java:146) [ApacheJMeter_components.jar:5.2.1]
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.8.0_171]
at java.util.concurrent.FutureTask.runAndReset(Unknown Source) [?:1.8.0_171]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(Unknown Source) [?:1.8.0_171]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source) [?:1.8.0_171]
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [?:1.8.0_171]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [?:1.8.0_171]
at java.lang.Thread.run(Unknown Source) [?:1.8.0_171]

打开配置文件,发现enabled的值为false,需要改为true,设置结果如下图:

技术分享图片

 修改之后还是没有解决,因为用的是阿里云服务器,需要去阿里云开启对应的端口,设置端口如下图,我这里是外网访问,端口一定开放公网入方向才可以,可以是内网则需要在内网入方向下开放2003端口

技术分享图片

 

然后重新执行JMeter,执行一段时间后在服务器上查看influxdb的数据库,显示结果如下图则表示jmeter发送数据到influxdb成功

技术分享图片

 

参考资料:

https://www.cnblogs.com/mike-liu/p/10080351.html


推荐阅读
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
author-avatar
rain
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有