使用InfluxDB和Grafana图形化展示k6压测工具的测试数据

一、K6 是什么?

k6 是一个现代的、开源的性能测试工具,用于测试和评估 Web 应用程序的性能。它是一个命令行工具,使用 JavaScript 或 TypeScript 编写测试脚本。k6 专注于开发人员友好性和简单性,使其易于使用和集成到持续集成/持续交付(CI/CD)流程中。

以下是 k6 的一些主要特点:

JavaScript/TypeScript 编写: k6 测试脚本使用 JavaScript 或 TypeScript 编写,这使得它对于许多开发人员来说是非常熟悉和易于上手的。

负载生成: k6 可以模拟大量用户同时访问你的 Web 应用程序,从而帮助你评估应用程序在高负载下的性能表现。

HTTP 请求: k6 支持发送各种类型的 HTTP 请求,包括 GET、POST 等,以模拟真实用户与 Web 服务器的交互。

WebSocket 支持: 除了 HTTP 请求,k6 还支持 WebSocket,可以用于测试实时应用程序,如聊天应用或实时协作工具。

图形化输出: k6 提供了直观的图形化输出,包括性能指标和结果,以便更容易地分析和理解性能测试的结果。

分布式执行: k6 支持在多台机器上分布式执行测试,这对于模拟大规模用户负载非常有用。

插件系统: k6 具有可扩展的插件系统,允许用户根据需要扩展和定制功能。

总体而言,k6 是一个强大而灵活的工具,适用于开发人员和测试人员,用于评估 Web 应用程序在不同负载下的性能表现。

二、K6 的安装


sudo dnf install https://dl.k6.io/rpm/repo.rpm
sudo dnf install k6

参考:https://k6.io/docs/get-started/installation/

三、K6 的使用

1、编写 test.js 脚本


 import http from "k6/http";
 import {group, check} from "k6";
 
 export let options = {
   stages: [
     {duration: '30s', target: 5},
     {duration: '30s', target: 20},
     {duration: '30s', target: 50},
     {duration: '60s', target: 100},
   ]
 };
 
 export default function () {
 
   group('html page', function () {
     const res = http.get("https://www.iwmyx.cn/");
     check(res, {
       "status was 200": (r) => r.status === 200
     });
   });
 
 };

这个脚本是用于使用 k6 对网站进行负载测试的,k6 是一个流行的开源负载测试工具。

以下是脚本的功能:

1. 它从 k6 导入必要的模块:`http` 用于发出 HTTP 请求,`check` 用于验证响应。

2. 它在 `options` 对象中定义了测试的负载配置。测试将从 30 秒的 5 个虚拟用户开始,然后在接下来的 30 秒内增加到 20 个用户,再在接下来的 30 秒内增加到 50 个用户,最后在 60 秒内增加到 100 个用户。

3. `default` 函数是测试的入口点。它定义了每个虚拟用户在测试期间将执行的操作。

4. 在 `default` 函数内部,它将操作分组在 ‘html page’ 下。这对于组织测试结果非常有用。

5. 它向网站的 “/about” 页面发送 GET 请求(将 “www.xxx.com” 替换为你要测试的实际网站)。

6. 它检查响应状态码以确保它是 200(HTTP OK)。如果状态码不是 200,检查将失败,并在测试结果中报告失败。
2、运行 Web 负载测试、指明 influxdb 信息


k6 run --out influxdb=http://192.168.4.130:8086/load_test index.js

[root@ELK-Master k6]# k6 run --out influxdb=http://192.168.4.130:8086/load_test index.js

          /\      |‾‾| /‾‾/   /‾‾/   
     /\  /  \     |  |/  /   /  /    
    /  \/    \    |     (   /   ‾‾\  
   /          \   |  |\  \ |  (‾)  | 
  / __________ \  |__| \__\ \_____/ .io

  execution: local
     script: index.js
     output: InfluxDBv1 (http://192.168.4.130:8086)

  scenarios: (100.00%) 1 scenario, 100 max VUs, 3m0s max duration (incl. graceful stop)
           * default: Up to 100 looping VUs for 2m30s over 4 stages (gracefulRampDown: 30s, gracefulStop: 30s)


     █ html page

       ✓ status was 200

     checks.........................: 100.00% ✓ 6002      ✗ 0    
     data_received..................: 34 MB   530 kB/s
     data_sent......................: 524 kB  8.2 kB/s
     group_duration.................: avg=86.04ms  min=21.73ms med=35.59ms max=1.99s    p(90)=178.68ms p(95)=360.78ms
     http_req_blocked...............: avg=378.7µs  min=542ns   med=1.91µs  max=88.07ms  p(90)=2.61µs   p(95)=3.23µs  
     http_req_connecting............: avg=365.52µs min=0s      med=0s      max=51.53ms  p(90)=0s       p(95)=0s      
     http_req_duration..............: avg=85.57ms  min=21.62ms med=35.34ms max=1.99s    p(90)=177.92ms p(95)=360.72ms
       { expected_response:true }...: avg=85.57ms  min=21.62ms med=35.34ms max=1.99s    p(90)=177.92ms p(95)=360.72ms
     http_req_failed................: 0.00%   ✓ 0         ✗ 6002 
     http_req_receiving.............: avg=52.9ms   min=12.44µs med=2.17ms  max=1.95s    p(90)=142.23ms p(95)=294.33ms
     http_req_sending...............: avg=10.51µs  min=2.82µs  med=8.62µs  max=295.55µs p(90)=12.89µs  p(95)=22.87µs 
     http_req_tls_handshaking.......: avg=0s       min=0s      med=0s      max=0s       p(90)=0s       p(95)=0s      
     http_req_waiting...............: avg=32.65ms  min=21.26ms med=28.11ms max=729.15ms p(90)=35.89ms  p(95)=38.79ms 
     http_reqs......................: 6002    93.535367/s
     iteration_duration.............: avg=86.05ms  min=21.75ms med=35.6ms  max=1.99s    p(90)=178.69ms p(95)=360.79ms
     iterations.....................: 6002    93.535367/s
     vus............................: 23      min=1       max=23 
     vus_max........................: 100     min=100     max=100


running (1m04.2s), 000/100 VUs, 6002 complete and 24 interrupted iterations
default ✗ [===============>----------------------] 003/100 VUs  1m04.2s/2m30.0s

三、安装 InfluxDB 时序数据库

在 CentOS7 中可以使用 yum 安装 InfluxDB。添加仓库配置文件:

vi /etc/yum.repos.d/influxdb.repo
仓库的配置如下:

[influxdb]
name = InfluxDB Repository – RHEL \$releasever
baseurl = https://repos.influxdata.com/rhel/\$releasever/\$basearch/stable
enabled = 1
gpgcheck = 1
gpgkey = https://repos.influxdata.com/influxdb.key
使用 yum 安装:

sudo yum install influxdb
启动 InfluxDB 服务:

sudo systemctl start influxdb
通过这种方式安装,InfluxDB 会自动配置开机启动,我们可以这样查看:

systemctl list-unit-files | grep influx
上面命令的输出结果为:

influxd.service enabled
influxdb.service enabled
查看当前 InfluxDB 的版本:

influxd version

四、配置 Grfana 的展示

使用 InfluxDB 和 Grafana 图形化展示 k6 压测工具的测试数据

导入模板
k6 官方推荐了一款由用户贡献的实用模板,https://grafana.com/grafana/dashboards/2587-k6-load-testing-results/

在导入模板时,只需要填上上面的模板地址,并选择刚才添加的数据源:
导入成功后,就能看到刚才测试的数据情况面板了:

使用 InfluxDB 和 Grafana 图形化展示 k6 压测工具的测试数据

使用 InfluxDB 和 Grafana 图形化展示 k6 压测工具的测试数据

© 版权声明

☆ END ☆
喜欢就点个赞吧
点赞0 分享
图片正在生成中,请稍后...