• JMeter关于influxDB 2.x 后端监听器使用


    目前大部分资料都是介绍有关 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环境变量路径就行:

    1. setlocal
    2. set JAVA_HOME="D:\Program Files\Java\jdk-11.0.16"
    3. 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

    示例如下:

    1. from(bucket:"example-bucket")
    2. |> range(start:-1h)
    3. |> filter(fn:(r) =>
    4. r._measurement == "cpu" and
    5. r.cpu == "cpu-total"
    6. )
    7. |> aggregateWindow(every: 1m, fn: mean)

     (1)from 指定数据源bucket

    from(bucket:"example-bucket")

     (2)|> 管道连接符

    将数据从数据源管道传输到指定地方,如range()和filter()

    (3)range 指定起始时间段

    range有两个参数start,stop,stop不设置默认为当前时间。range可以是相对的(使用负持续时间)或绝对(使用时间段)

    1. // Relative time range with start only. Stop defaults to now.
    2. from(bucket:"example-bucket")
    3. |> range(start: -1h)
    4. // Relative time range with start and stop
    5. from(bucket:"example-bucket")
    6. |> range(start: -1h, stop: -10m)
    7. // Absolute time range with start and stop
    8. from(bucket:"example-bucket")
    9. |> range(start: 2020-03-02T01:00:00Z)

    (4)filter 过滤

    对range()中的数据进行过滤,filter()有一个参数fn,是基于列和属性过滤数据逻辑的匿名函数。
    flux的匿名函数语法与JavaScript的语法类似。记录或行在filter()中作为对象,根据条件完成一些过滤的操作,多个过滤规则间用and或or连接。

    1. // Pattern
    2. (r) => (r.objectProperty comparisonOperator comparisonExpression)
    3. // Example with single filter
    4. (r) => (r._measurement == "cpu")
    5. // Example with multiple filters
    6. (r) => (r._measurement == "cpu") and (r._field != "usage_system" )

    (5)以我们的Jmeter指标获取为例

    1. from(bucket:"jmeter")
    2. |> range(start: -15m)
    3. |> filter(fn:(r) =>
    4. r._measurement == "jmeter"
    5. )
    6. |> filter(fn: (r) =>
    7. r["_field"] == "pct90.0" or
    8. r["_field"] == "pct95.0" or
    9. r["_field"] == "pct99.0"
    10. )
    11. |> aggregateWindow(every: 1m, fn: mean)
    12. |> yield(name: "mean")

    表示:查询jmeter最近15分钟90%、95%、99%响应时间数据,采集频率为每分钟。

    (6)yield函数

    flux的yield()函数作为查询结果输出过滤的tables。

    1. from(bucket:"example-bucket")
    2. |> range(start: -15m)
    3. |> filter(fn: (r) =>
    4. r._measurement == "cpu" and
    5. r._field == "usage_system" and
    6. r.cpu == "cpu-total"
    7. )
    8. |> 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):

    1. [[outputs.influxdb_v2]]
    2. urls = ["http://localhost:8086"]
    3. token = "$INFLUX_TOKEN"
    4. organization = "example-org"
    5. bucket = "example-bucket"

    参考: Manually configure Telegraf for InfluxDB v2.0 | InfluxDB OSS 2.0 Documentation

     具体其他使用说明,参考influxdb2的官方使用说明:InfluxDB OSS 2.0 Documentation

    以下是从kafka监听器收集到数据传给influxdb2的效果:

  • 相关阅读:
    Android | ADB 命令
    2024/3/5打卡最长上升子序列**----线性DP,贪心,单调栈
    GIS工具maptalks开发手册(二)03-02——示例之json格式添加绘制工具、渲染点、文字和多个面
    ai实景直播矩阵式引流---技术开发搭建(剪辑、矩阵、直播)
    评价类——熵权法(Entropy Weight Method, EWM),完全客观评价
    【错误解决方案】ModuleNotFoundError: No module named ‘cPickle‘
    23、JAVA进阶——日期操作类
    排序方法——《快速排序》
    微服务项目使用RabbitMQ
    ADSP-21489的图形化编程详解(3:音效开发例程-直通三个例程讲清楚)
  • 原文地址:https://blog.csdn.net/smooth00/article/details/126227634