怀念夏天 发表于 2024-10-27 13:39:30

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

K6先容

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



[*]可配置的负载生成。纵然是低端的呆板也可以模拟大量的流量。
[*] Tests as code 重用脚本、模块化逻辑、版本控制,并将测试集成到CI中。
[*] 功能齐备的API。脚本API包含许多特性,可以帮助您模拟真实的应用程序流量。
[*] 多协议支持。HTTP, WebSockets, gRPC,欣赏器等。



[*]丰富生态体系。您可以扩展k6以支持您的需求。许多人已经在社区中分享了他们的扩展!
[*]机动的度量存储和可视化。
[*]原生集成Grafana Cloud。
K6环境搭建

利用dokcer容器搭建相关服务.
Services Diagram

https://i-blog.csdnimg.cn/direct/7a6b8bdbcb4e4e92a5de94f7f46ad9d8.png
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的数据源
https://i-blog.csdnimg.cn/direct/f0ab7db06d68459d94f8ed8ef49bf155.png
https://i-blog.csdnimg.cn/direct/da3d36f2f43e4a99bfa51073226b0802.png
https://i-blog.csdnimg.cn/direct/64506eeda1654ed4a6a210180008259f.pnghttps://i-blog.csdnimg.cn/direct/5e0f3fb191fc454e8b93e6ce4cf760c3.png
K6 Script 编写



[*]新建Test Root目次 如: performance-test, 在进入performance-test目次新建的scripts目次存放测试脚本结构如下
https://i-blog.csdnimg.cn/direct/fe5e0f91225f4caca145932671b4b028.png


[*]脚本编写
你只必要懂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, {
            ' 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)}`)
      .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 日记,没有报错即一切正常。
https://i-blog.csdnimg.cn/direct/d0c5cef385504f94872e7bef9e19dfd1.png
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) https://i-blog.csdnimg.cn/direct/2f76c265918f48b588553b730cc7005e.png


[*]生存查察效果
https://i-blog.csdnimg.cn/direct/d2b09e22f1f94efaa88a3f0102ea28f6.png
结语

谢谢大家! 接待订阅,点赞!
周末愉快!!!!!!
周末愉快!!!!!!
周末愉快!!!!!!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【TEST】负载/性能测试工具 Grafana K6 (Docker 版)