【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 来模拟接口。
bash 复制代码
# 拉代码
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

bash 复制代码
{"randomInteger": "890215917"}
  • docker container grafana
bash 复制代码
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
bash 复制代码
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即可,对于开发测试人员都很友好。那么来吧编写一个测试脚本。

javascript 复制代码
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启动脚本测试

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

结果大致如下:

javascript 复制代码
     █ 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

运行

javascript 复制代码
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 填入

javascript 复制代码
SELECT mean("value") FROM "autogen"."http_req_duration" WHERE $timeFilter GROUP BY time($__interval) fill(null)
  • 保存查看效果

结语

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

周末愉快!!!!!!

周末愉快!!!!!!

周末愉快!!!!!!

相关推荐
tellmewhoisi9 小时前
项目部署docker(指令解析和docker-compose基础指令)
docker·容器
dinl_vin9 小时前
FastAPI 系列 ·(十二):生产部署——Docker + 配置管理(系列完结)
docker·容器·fastapi
蠢货爱好者12 小时前
Docker基础操作
运维·docker·容器
山人在山上12 小时前
docker zlmediakit 部署
docker·zlmediakit
hopsky13 小时前
phoenix docker 启动
运维·docker·容器
茉莉清茶LG13 小时前
postman 登录问题
测试工具·postman
Nontee16 小时前
Docker基础
docker·容器·eureka
烟雨江南aabb17 小时前
Docker第一弹 Docker是什么?
运维·docker·容器
Saniffer_SH17 小时前
【每日一题】不只是点亮画面:UniGraf 如何把 HDMI/DP 接口问题拆成可定位、可复现、可自动化验证的测试流程?
运维·人工智能·测试工具·fpga开发·性能优化·自动化·压力测试
ai产品老杨17 小时前
解耦异构算力与多协议接入:基于 Docker 与 GB28181 的企业级 AI 视频管理平台架构演进与源码交付实践
人工智能·docker·音视频