【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)
  • 保存查看效果

结语

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

周末愉快!!!!!!

周末愉快!!!!!!

周末愉快!!!!!!

相关推荐
心动啊1219 小时前
镜像和容器的管理
docker·容器
noravinsc10 小时前
docker compose ps 命令
docker
溜达的大象11 小时前
docker创建一个centOS容器安装软件(以宝塔为例)的详细步骤
运维·docker·容器
powerfulzyh14 小时前
Docker中运行的Chrome崩溃问题解决
chrome·docker·容器
慢一点会很快14 小时前
【网络分析工具】网络工具wireshark、TCPdump、iperf使用详解
测试工具·wireshark·tcpdump
onkel in blog16 小时前
【Docker】Docker Compose方式搭建分布式内存数据库(Redis)集群
数据库·redis·分布式·docker
跪下,大胆刁民16 小时前
CentOS 7 基础环境安装脚本
docker·centos·bash
Kookoos18 小时前
基于 PostgreSQL 的 ABP vNext + ShardingCore 分库分表实战
数据库·docker·postgresql·c#·.net
TianJinZi18 小时前
linux环境安装docker
linux·运维·docker
前端小崔19 小时前
从零开始学习three.js(15):一文详解three.js中的纹理映射UV
前端·javascript·学习·3d·webgl·数据可视化·uv