目前大部分资料都是介绍有关 jmeter 与 influxdb1.x 版本的集成,但是,在 2021 年,influxdb 升级到 2.x 版本,这个版本与 1.x 版本有结构性的调整,完全不兼容,直接要切换过来难度不小,官网和社区这方面的资料也不多,所以我边用边做个笔记,方便自我查阅,有需要的人也可以参考。
一、使用条件
1、Grafana版本 >= 8.5.4
Download Grafana | Grafana Labs
2、Influxdb版本 >= 2.0
Install InfluxDB | InfluxDB OSS 2.3 Documentation
3、JMeter版本 >= 5.4.1,JDK 11
Apache JMeter - Download Apache JMeter
Java Downloads | Oracle
4、influxdb2后端监听器:jmeter-influxdb2-listener-plugin
Releases · mderevyankoaqa/jmeter-influxdb2-listener-plugin · GitHub
5、Grafana视图模板
JMeter Load Test (org.md.jmeter.influxdb2.visualizer) - influxdb v2.0 (Flux) dashboard for Grafana | Grafana Labs
(influxdb2后端监听器源码中也带有一份一样的grafana模板)
二、启动和配置influxdb及grafana
1、启动influxdb
直接解压安装包,运行influxd,linux下可以后台进程运行 nohup ./influxd &
2、使用UI界面设置influxdb
-
访问 http://ip:8086
-
点击Get Started
-
按要求输入Username、Password、Confirm Password、Organization Name、Bucket Name
-
点击Continue
3、influxdb关键配置查看或修改
(1)通过About查看Organization Name
(2)通过Buckets查看Bucket Name
在influxdb2,没有database的概念,数据源就是bucket
(3)通过API Tokens查看和修改influxdb token
点击可以查看token并复制token:
4、启动grafana
bin/grafana-server,linux下可以后台运行nohup ./grafana-server > ../out.log &
5、配置grafna数据源
创建jmeter名称的数据源,配置项如下:
主要是配置URL、Organization name、influxdbToken、Bucket
6、导入grafana视图模板
导入时,选择数据源Jmeter
三、InfluxDB中查看JMeter数据
其实JMeter原生的influxdb后端监听器也可以向influxdb2发送数据,配置方式如下(标红的是必要配置项,默认缺的项可以手动添加):
org.apache.jmeter.visualizers.backend.influxdb.InfluxdbBackendListenerClient
org.apache.jmeter.visualizers.backend.influxdb.InfluxDBRawBackendListenerClient
既然默认的influxdb的监听器能够支持,为什么我们还要引入第三方的influxdb2监听器呢?一句话,使用不方便,有些配置项默认没有是手动添加的,而且是目前我们在grafna上找不到合适的视图模板,需要自己手动改造。
而我们引入influxdb2监听器jmeter-plugins-influxdb2-listener-2.4.jar,把它放到JMeter的lib/ext目录下,重新打开JMeter,在后端监听器就能看到新的选项:
注意:这个监听器,只有在JDK11环境下才能显示,如果原来使用的是JDK1.8,那么可以下载个绿色版的JDK11,在Jmeter启动文件如jmeter.bat开头引用JDK11环境变量路径就行:
setlocal
set JAVA_HOME="D:\Program Files\Java\jdk-11.0.16"
set PATH=%JAVA_HOME%\bin;%PATH%
监听器的配置如下图(关键配置项为标红区域):
然后我们跑JMeter脚本,在influxdb的界面上就能查到监听的数据:
以上是Data Explorer界面,这个界面不仅能查询数据,还能生成查询的脚本(influxdb2默认使用的是Flux语法,不是1.x时候的SQL语法),上图查询所对应的查询脚本如下:
在Grafana中我们也可以用influxdb的Data Explorer界面来辅助监控视图的编辑,特别是对于Flux语法不熟悉的情况。我们看一下Data Explorer的脚本生成器当中最基本的应用模式:
首先是FROM,选择bucket(相当于influxdb1.x的数据库),接着通过过滤器Filter添加多维度过滤(可以一直添加),默认第一维度是_measurement(相当于表),默认第二维度是_field(相当于字段),第三维度可以是application(应用)或其他等等,如下所示:
选择完多个维度后我们查看脚本,在table模式下(默认Graph曲线图模式),Filter也能对应到数据表里的相应字段内容:
四、在Grafana中展示数据
我们把上面提到的Grafana视图模板 jmeter-load-test-org-md-jmeter-influxdb2-visualizer-influxdb-v2-0-flux_rev6.json,下载到本地,然后导入Grafana:
导入后查看刚刚测试时段的数据,如下:
五、influxdb2语法介绍
influxDB 2.x版本相对1.x版本改动较大,尤其是语法方面的改动,2.x版本的语法使用的是JavaScript,1.x使用的是sql
示例如下:
from(bucket:"example-bucket")
|> range(start:-1h)
|> filter(fn:(r) =>
r._measurement == "cpu" and
r.cpu == "cpu-total"
)
|> aggregateWindow(every: 1m, fn: mean)
(1)from 指定数据源bucket
from(bucket:"example-bucket")
(2)|> 管道连接符
将数据从数据源管道传输到指定地方,如range()和filter()
(3)range 指定起始时间段
range有两个参数start,stop,stop不设置默认为当前时间。range可以是相对的(使用负持续时间)或绝对(使用时间段)
// Relative time range with start only. Stop defaults to now.
from(bucket:"example-bucket")
|> range(start: -1h)
// Relative time range with start and stop
from(bucket:"example-bucket")
|> range(start: -1h, stop: -10m)
// Absolute time range with start and stop
from(bucket:"example-bucket")
|> range(start: 2020-03-02T01:00:00Z)
(4)filter 过滤
对range()中的数据进行过滤,filter()有一个参数fn,是基于列和属性过滤数据逻辑的匿名函数。
flux的匿名函数语法与JavaScript的语法类似。记录或行在filter()中作为对象,根据条件完成一些过滤的操作,多个过滤规则间用and或or连接。
// Pattern
(r) => (r.objectProperty comparisonOperator comparisonExpression)
// Example with single filter
(r) => (r._measurement == "cpu")
// Example with multiple filters
(r) => (r._measurement == "cpu") and (r._field != "usage_system" )
(5)以我们的Jmeter指标获取为例
from(bucket:"jmeter")
|> range(start: -15m)
|> filter(fn:(r) =>
r._measurement == "jmeter"
)
|> filter(fn: (r) =>
r["_field"] == "pct90.0" or
r["_field"] == "pct95.0" or
r["_field"] == "pct99.0"
)
|> aggregateWindow(every: 1m, fn: mean)
|> yield(name: "mean")
表示:查询jmeter最近15分钟90%、95%、99%响应时间数据,采集频率为每分钟。
(6)yield函数
flux的yield()函数作为查询结果输出过滤的tables。
from(bucket:"example-bucket")
|> range(start: -15m)
|> filter(fn: (r) =>
r._measurement == "cpu" and
r._field == "usage_system" and
r.cpu == "cpu-total"
)
|> yield()
为了输出和可视化数据,Flux在每个脚本的末尾自动添加一个yield()函数。只有在同一个流量查询中包含多个查询时,才需要显式调用yield()。每一组返回的数据都需要使用yield()函数来命名。
六、总结
虽然我们一开始不习惯用Flux脚本,但是InfluxData主推它,不久以后也会成为influxdb的主流语言,所以掌握它也是必要的。
Flux是第四代编程语言,专为数据脚本、ETL、监控和警报而设计。它的作用超越了一门查询语言和编程语言。它提供了一个规划器和优化器,无缝地结合了查询和编程,形成了一个统一的整体。Flux最大的特点在于能够交叉编译,InfluxData希望使用者可以使用不同的语言,像是InfluxQL、PromQL以及Flux等,操作时间序列的数据与相关查询工作,InfluxData表示,他们希望这项工作可以在单一Optimizer进行,并对许多不同的来源进行规画。由于开发者使用的语言很多种,因此支持更多的语言将有助于拥抱更广的生态系。
监听器源码路径:https://github.com/mderevyankoaqa/jmeter-influxdb2-listener-plugin
influxdb虽然功能强大,但是只有单机版是免费的,集群版是收费的。对于大规模压测场景,单机版肯定撑不住,所以我在上一篇文章《玩转 jmeter backend listener kafka》说到引入kafka作为缓冲组件是有必要的。另外从influxdb官方文档来看,是支持通过telegraf配置连接influxdb2的(即从kafka读取数据传输给influxdb2):
[[outputs.influxdb_v2]]
urls = ["http://localhost:8086"]
token = "$INFLUX_TOKEN"
organization = "example-org"
bucket = "example-bucket"
参考: Manually configure Telegraf for InfluxDB v2.0 | InfluxDB OSS 2.0 Documentation
具体其他使用说明,参考influxdb2的官方使用说明:InfluxDB OSS 2.0 Documentation
以下是从kafka监听器收集到数据传给influxdb2的效果:文章来源:https://www.toymoban.com/news/detail-409817.html
文章来源地址https://www.toymoban.com/news/detail-409817.html
到了这里,关于JMeter关于influxDB 2.x 后端监听器使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!