K6 壓測

  1. 前言
  2. 環境
  3. 安裝 K6
  4. 安裝 Grafana
  5. 安裝 InfluxDB
  6. 測試的API、壓測 script
  7. 建立 Grafana Dashboard
  8. 模擬壓測
  9. 確認壓測結果
  10. 參考資料

前言

測試一下 新的壓測工具 K6 的用法

K6 文章介紹可參考以下連結
黑暗執行續 - 讓開發人員如沐春風的壓力測試工具 - K6
ithelp - Gary - [Day23][負載測試] K6 基本介紹、安裝及實作,輕鬆上手!
K6 官方網站

本篇紀錄透過 K6 來壓測 API,將結果存到 InfluxDB 並呈現在 Grafana

環境

Linux VM = ubuntu-2004-lts

部屬 Grafana、InfluxDB

Windows 10 (home 20H2)

執行 K6 腳本

安裝 K6

參考 K6 官方網站 - Installation

安裝 Grafana

參考 w4560000 - 透過 Docker 建立 Garfana

安裝 InfluxDB

docker run -it -d --name influxdb -p 8086:8086 influxdb:1.8

備註: K6 目前支援到 influxdb:1.8 版本
influxdb v2 版本以上,因為有些 breaking changes,導致 K6 開發團隊沒有把 K6 相容 influxdb v2版本
而是另外開發了擴充版來支援 influx v2
可參考該擴充專案 Github grafana - xk6-output-influxdb

測試的API、壓測 script

建立一支功能單純的 .Net Core API,用以測試

[Route("/")]
[HttpGet]
public async Task<string> Get(int index)
{
    await Task.Delay(1000);
    string GetTicks = (DateTime.Now.Ticks & 0x11111).ToString("00000");
    return $"index:{index}, Concurrency Limiter {GetTicks}, {DateTime.Now:yyyy/MM/dd HH:mm:ss.fff}";
}

K6 Script

import http from 'k6/http';
import exec from 'k6/execution';

export const options = {
    vus: 10,        //模擬使用者數量
    iterations: 20  //模擬執行次數
  };

export default function () {
  console.log(`exec before ${exec.scenario.iterationInTest}`);
  var res = http.get('http://localhost:4000?index=' + exec.scenario.iterationInTest);
  console.log(res.status, res.body);
  console.log(`exec after ${exec.scenario.iterationInTest}, ${new Date() - new Date(exec.scenario.startTime)}ms`);
}

執行測試,並將結果輸出到 InfluxDB

.\k6 run script.js --out influxdb=http://localhost:8086/k6database

建立 Grafana Dashboard

新增 InfluxDB Data sources

設定 InfluxDB URL

備註: 若是輸入 localhost:8086,Grafana 會一直顯示 InfluxDB Error: Bad Gateway
因目前 Grafana 與 InfluxDB 是在同一台 VM 下透過 Docker 各自建立
沒有特別設定 bridge network,所以會是在預設的 bridge 底下
需要輸入 Influxdb 的內部 IP,Grafana 才呼叫得到

可透過查看 bridge 來確認 Influxdb 目前的 IP Address

docker network inspect bridge

# 輸出
...
"Containers": {
            "0a58ad5b0f4d412eb03572c613a41239273fcafa0167fb044077b15aede1fd82": {
                "Name": "grafana",
                "EndpointID": "31ab29eee04bd83d36e3e078abcd21529bc3fb09c9c2396f397bd51184993a42",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            },
            "b989d245650a467fb0ac0189734d249f1a0398e245c0c2124d02e2a5b8afb346": {
                "Name": "influxdb",
                "EndpointID": "bfbdba5d10dc565d312e183c039d7d5d8f6d3f9ea4d06dd368c4446ff634ae19",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",
                "IPv6Address": ""
            }
        },
...

# 或查看 Influxdb Container IP
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' influxdb

# 輸出
172.17.0.3

匯入 Dashboard

資料來源選擇 InfluxDB

模擬壓測

調整 K6 script,增加測試時間,拉長到60秒

export const options = {
    vus: 10,        //模擬使用者數量
    duration: '60s',
};

執行測試

.\k6 run script.js --out influxdb=http://localhost:8086/k6database

確認壓測結果

k6 Load Testing Results

k6 Load Testing Results

K6 Dashboard

參考資料

knoldus - K6 results with InfluxDB and Grafana
ithelp - 雷N - Grafana K6 - 各種負載測試類型


轉載請註明來源,若有任何錯誤或表達不清楚的地方,歡迎在下方評論區留言,也可以來信至 leozheng0621@gmail.com
如果文章對您有幫助,歡迎斗內(donate),請我喝杯咖啡

斗內💰

×

歡迎斗內

github