当前位置: 首页 > article >正文

【TEST】负载/性能测试工具 Grafana K6 (Docker 版)

K6介绍

k6是一个现代化的负载测试工具,建立在我们多年的经验,在性能和测试行业。它被构建为强大的、可扩展的和全功能的。关键的设计目标是提供最佳的开发人员体验。

特性

  • 可配置的负载生成。即使是低端的机器也可以模拟大量的流量。
  • Tests as code 重用脚本、模块化逻辑、版本控制,并将测试集成到CI中。

  • 功能齐全的API。脚本API包含许多特性,可以帮助您模拟真实的应用程序流量。

  • 多协议支持。HTTP, WebSockets, gRPC,浏览器等。

  • 丰富生态系统。您可以扩展k6以支持您的需求。许多人已经在社区中分享了他们的扩展!
  • 灵活的度量存储和可视化。
  • 原生集成Grafana Cloud。

K6环境搭建

使用dokcer容器搭建相关服务.

Services Diagram

Deploy

  • 启动个wiremock模拟你的应用。 这边使用wiremock-random 来模拟接口。
# 拉代码
git clone https://github.com/wiremock/wiremock-docker.git
# 制作随机数镜像
docker build -t wiremock-random wiremock-docker/samples/random
# 启动wiremock查看日志,查看是否正常工作
docker run -it --rm -p 8080:8080 wiremock-random
# 启动服务
docker run -it  -p 8000:8080 --name random-service -d wiremock-random:latest

请求 http://localhost:8000/random

{"randomInteger": "890215917"}
  • docker container grafana

docker run -d \
  --name=grafana \
  -p 3000:3000 \
  -v /path/grafana-storage:/var/lib/grafana \
  -v /path/grafana-config/grafana.ini:/etc/grafana/grafana.ini \
  -e GF_SECURITY_ADMIN_PASSWORD=password \
  --link influxdb \
  grafana/grafana:latest

访问http://localhost:3000 看到界面即可 

  • docker container influxdb
docker run -d \
  --name influxdb \
  -p 8086:8086 \
  -e INFLUXDB_DB=k6 \
  -e INFLUXDB_ADMIN_USER=admin \
  -e INFLUXDB_ADMIN_PASSWORD=admin123 \
  -e INFLUXDB_USER=k6user \
  -e INFLUXDB_USER_PASSWORD=k6pass \
  influxdb:1.8
  • 配置influxdb 为grafana的数据源

K6 Script 编写

  • 新建Test Root目录 如: performance-test, 在进入performance-test目录新建的scripts目录存放测试脚本结构如下

  • 脚本编写

你只需要懂js即可,对于开发测试人员都很友好。那么来吧编写一个测试脚本。

import http from 'k6/http';
import {check, group} from 'k6';

const API_BASE_URL = 'http://192.168.0.105:8080';


export default function (data) {

    group('XYX Test Group', () => {
        const res = httpGet(API_BASE_URL + "/random", "", "")
        //check
        check(res, {
            '[API] status is 200': (r) => r.status === 200,
        });
    });
}


/**
 * Http get Method.
 * @param url
 * @param headerParams
 * @param queryParams
 * @returns {*}
 */
function httpGet(url, headerParams, queryParams) {
    // Convert query parameters to a query string
    const queryString = Object.keys(queryParams)
        .map(key => `${encodeURIComponent(key)}=${encodeURIComponent(queryParams[key])}`)
        .join('&');

    // Append query string to the URL
    const fullUrl = `${url}?${queryString}`;

    const res = http.get(fullUrl, headerParams);
    const prettyJsonString = JSON.stringify(res.json(), null, 2); // Pretty print with 2 spaces indentation
    console.log(prettyJsonString); // Outputs readable JSON
    return res
}


K6测试

Local启动脚本测试

docker run -i --rm \
  --name k6_local \
  -v $(pwd)/scripts:/scripts \
  grafana/k6:latest run  /scripts/script.js

结果大致如下:

     █ XYX Test Group

     data_received..............: 0 B     0 B/s
     data_sent..................: 0 B     0 B/s
     group_duration.............: avg=7.48ms min=7.48ms med=7.48ms max=7.48ms p(90)=7.48ms p(95)=7.48ms
     http_req_blocked...........: avg=0s     min=0s     med=0s     max=0s     p(90)=0s     p(95)=0s    
     http_req_connecting........: avg=0s     min=0s     med=0s     max=0s     p(90)=0s     p(95)=0s    
     http_req_duration..........: avg=0s     min=0s     med=0s     max=0s     p(90)=0s     p(95)=0s    
     http_req_failed............: 100.00% 1 out of 1
     http_req_receiving.........: avg=0s     min=0s     med=0s     max=0s     p(90)=0s     p(95)=0s    
     http_req_sending...........: avg=0s     min=0s     med=0s     max=0s     p(90)=0s     p(95)=0s    
     http_req_tls_handshaking...: avg=0s     min=0s     med=0s     max=0s     p(90)=0s     p(95)=0s    
     http_req_waiting...........: avg=0s     min=0s     med=0s     max=0s     p(90)=0s     p(95)=0s    
     http_reqs..................: 1       113.088066/s
     iteration_duration.........: avg=8.46ms min=8.46ms med=8.46ms max=8.46ms p(90)=8.46ms p(95)=8.46ms
     iterations.................: 1       113.088066/s


running (00m00.0s), 0/1 VUs, 1 complete and 0 interrupted iterations

字段说明

http_req_duration: 每个HTTP请求的响应时间。

http_req_failed: 失败的HTTP请求数量。

http_req_received: 每秒接收到的HTTP请求数量。

http_req_status_200: 返回状态码200的HTTP请求数量。

http_req_status_404: 返回状态码404的HTTP请求数量。

iteration: 当前的迭代或者说测试的轮数。

vus: 虚拟用户数的数量。

data_received: 接收到的数据总量。

group: 如果使用了k6 group功能,这里会显示分组名称。

check: 如果使用了k6 check功能,这里会显示检查名称。

启动脚本输出到IndluxDB

 运行

docker run -i --rm \
  --name k6_bff \  
  --link influxdb \           
  -v $(pwd)/scripts:/scripts \                                   
  grafana/k6:latest run --out influxdb=http://influxdb:8086/k6 /scripts/script.js \
  --vus 30 --duration 350s

 查看influxdb 日志,没有报错即一切正常。

K6 在Grafana的可视化

打开grafana 新建dashboard并且添加panel,这边以‘http_req_duration’指标简单介绍。

  • 选择Time Series类型图标

Metric 填入

SELECT mean("value") FROM "autogen"."http_req_duration" WHERE $timeFilter GROUP BY time($__interval) fill(null)

  • 保存查看效果

结语

谢谢大家! 欢迎订阅,点赞!

周末愉快!!!!!!

周末愉快!!!!!!

周末愉快!!!!!!


http://www.kler.cn/a/371858.html

相关文章:

  • jenkins搭建及流水线配置
  • YOLO即插即用模块---CAA
  • Java面试经典 150 题.P26. 删除有序数组中的重复项(003)
  • 关于我的数据结构与算法——初阶第二篇(排序)
  • Nginx配置基于端口的 Web 服务器
  • 尚硅谷 | Nginx | 学习笔记
  • 【系统架构设计师】案例分析预测试卷一(3道材料题)
  • 小满OKKICRM与钉钉数据集成方案解析
  • 扶贫工作数字化:SpringBoot精准扶贫系统
  • Python实现的简单时钟
  • 探索自动化数据清洗技术的前沿趋势
  • java项目使用HttpServletRequest request接参,怎么获取参数的值,怎么获取form值,怎么获取body值
  • HTML入门教程17:HTML块
  • 深度|谁在为OpenAI和Anthropic的AI编程竞赛提供“军火”?已赚得盆满钵满
  • Javaweb 实验6 JSP内置对象
  • 文心一言 VS 讯飞星火 VS chatgpt (380)-- 算法导论24.4 12题
  • Oracle 19c OCM技术培训课程深度解析
  • 刷代随有感(134):单调栈——下一个更大元素I(难点涉及哈希表与单调栈的结合)
  • jenkins搭建及流水线配置
  • 求助帖:ubuntu22.10 auto install user-data配置了为何还需要选择语言键盘(如何全自动)
  • python通过translate库实现中英文翻译
  • 【libGL error】Autodl云服务器配置ACT的conda虚拟环境生成训练数据时,遇到了libGL相关错误,涉及swrast_dri.so
  • 数据采集(全量采集和增量采集)
  • 三方接口调用设计方案
  • 3. STM32之TIM实验--输出比较(PWM输出,电机,四轴飞行器,智能车,机器人)--(实验1:PWM驱动LED呼吸灯)
  • sparksql建临时表的几种方式