K6 負載測試完整指南:搭配 Grafana 與 InfluxDB 實現即時監控

K6 負載測試完整指南:搭配 Grafana 與 InfluxDB 實現即時監控

專案概述

本專案展示如何使用 K6 進行 API 負載測試,並透過 InfluxDB 儲存測試數據,最後在 Grafana 上建立視覺化儀表板,實現即時監控測試結果。

架構說明

1
2
3
4
┌─────────┐      ┌──────────────┐      ┌─────────┐
│ K6 │─────>│ InfluxDB │─────>│ Grafana │
│ (測試器) │ │ (時序資料庫) │ │ (視覺化) │
└─────────┘ └──────────────┘ └─────────┘

核心元件

  1. K6: 開源負載測試工具,使用 JavaScript 編寫測試腳本
  2. InfluxDB: 時序資料庫,儲存測試過程中產生的指標數據
  3. Grafana: 資料視覺化平台,建立即時監控儀表板

一、測試腳本生成器

腳本自動生成

專案使用 Node.js 動態生成 K6 測試腳本,主要優勢:

  • 參數化測試: 自動組合多個商店、日期區間和 API 端點
  • 批量生成: 一次生成所有測試場景組合
  • 易於維護: 集中管理測試配置

核心配置

1
2
3
4
5
6
7
8
9
10
11
// 測試目標配置
const stores = ["店鋪A", "店鋪B", "店鋪C"];
const dates = [
{ start: "2025-11-14", end: "2025-11-15" },
// ... 更多日期區間
];
const endpoints = [
"/api/inventory",
"/api/status",
// ... 更多端點
];

測試場景組合

透過三層迴圈自動生成所有測試組合:

1
2
3
4
5
6
7
8
9
10
11
12
stores.forEach((store) => {
dates.forEach((range) => {
endpoints.forEach((ep) => {
USERS.push({
store,
endpoint: ep,
start: range.start,
end: range.end
});
});
});
});

計算範例: 4 個店鋪 × 3 個日期區間 × 3 個端點 = 36 種測試場景


二、K6 負載測試配置

測試策略

專案採用 恆定到達率 (Constant Arrival Rate) 策略:

1
2
3
4
5
6
7
8
9
10
11
12
export const options = {
scenarios: {
load_test: {
executor: 'constant-arrival-rate',
rate: 200, // 每秒 200 個請求
timeUnit: '1s', // 時間單位
duration: '30s', // 測試持續 30 秒
preAllocatedVUs: 50, // 預分配 50 個虛擬用戶
maxVUs: 500, // 最多 500 個虛擬用戶
}
}
};

關鍵指標

自定義指標追蹤

1
2
3
const errorCounter = new Counter('custom_errors');      // 錯誤計數
const successCounter = new Counter('custom_success'); // 成功計數
const responseTime = new Trend('custom_response_time'); // 響應時間趨勢

測試邏輯

每個虛擬用戶執行流程:

  1. 隨機選擇場景: 從 36 種組合中隨機選擇一個測試場景
  2. 發送請求: 向目標 API 發送 GET 請求
  3. 驗證響應: 檢查狀態碼和響應內容
  4. 記錄指標: 追蹤響應時間和成功/失敗次數
1
2
3
4
5
6
7
8
9
10
11
12
13
export default function () {
const user = USERS[Math.floor(Math.random() * USERS.length)];
const url = `${BASE_URL}${user.endpoint}/${user.store}?startDate=...`;

const response = http.get(url, { headers: HEADERS });

check(response, {
'status = 200': r => r.status === 200,
'body not empty': r => r.body && r.body.length > 0,
});

responseTime.add(response.timings.duration);
}

三、Docker 環境配置

Docker Compose 架構

使用 Docker Compose 快速啟動監控環境:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
version: '3.7'
services:
influxdb:
image: influxdb:1.8
ports:
- "8086:8086"
environment:
- INFLUXDB_DB=k6
- INFLUXDB_ADMIN_ENABLED=true
volumes:
- ./influxdb:/var/lib/influxdb

grafana:
image: grafana/grafana
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
volumes:
- ./grafana:/var/lib/grafana

服務說明

服務 端口 用途 資料持久化
InfluxDB 8086 儲存測試指標數據 ./influxdb
Grafana 3000 視覺化儀表板 ./grafana

四、執行流程

1. 啟動監控環境

1
2
chmod +x start-dashboard.sh
./start-dashboard.sh

輸出結果:

1
2
3
4
5
6
Starting k6 local dashboard (Grafana + InfluxDB)...

=========================================
Grafana → http://localhost:3000 (admin/admin)
InfluxDB → http://localhost:8086
=========================================

2. 生成測試腳本

1
node generate-test.js

生成 load-test.js 文件,包含所有測試場景。

3. 執行負載測試

1
k6 run --out influxdb=http://localhost:8086/k6 load-test.js

參數說明

  • --out influxdb: 將測試數據輸出到 InfluxDB
  • http://localhost:8086/k6: InfluxDB 連接字串(資料庫名稱為 k6)

4. 查看測試結果

在終端中會即時顯示:

1
2
3
4
5
6
7
8
✓ status = 200
✓ body not empty

checks.........................: 100.00% ✓ 120000
custom_errors..................: 0
custom_success.................: 6000
http_req_duration..............: avg=45.23ms min=12.34ms max=234.56ms
http_reqs......................: 6000 200/s

五、Grafana 儀表板配置

首次登入設定

  1. 訪問 http://localhost:3000
  2. 使用預設帳密登入:admin / admin
  3. 首次登入會要求修改密碼

添加 InfluxDB 數據源

步驟

  1. 點擊左側齒輪圖示 → ConfigurationData Sources
  2. 點擊 Add data source → 選擇 InfluxDB
  3. 配置連接參數:
    1
    2
    URL: http://influxdb:8086
    Database: k6
  4. 點擊 Save & Test 驗證連接

建立監控面板

關鍵指標面板

  1. 請求速率 (Requests Per Second)

    • Query: SELECT mean("value") FROM "http_reqs" WHERE $timeFilter GROUP BY time(1s)
    • 圖表類型: Graph
    • 監控每秒請求數是否達到目標(200 RPS)
  2. 響應時間分佈

    • Query: SELECT mean("value") FROM "http_req_duration" WHERE $timeFilter GROUP BY time(1s)
    • 圖表類型: Graph
    • 顯示 P95, P99 百分位數
  3. 錯誤率

    • Query: SELECT sum("value") FROM "custom_errors" WHERE $timeFilter
    • 圖表類型: Stat
    • 監控失敗請求數量
  4. 成功率

    • Query:
      1
      2
      SELECT (sum("custom_success") / (sum("custom_success") + sum("custom_errors"))) * 100
      FROM "k6" WHERE $timeFilter
    • 圖表類型: Gauge
    • 顯示成功率百分比

進階面板

  1. 虛擬用戶數 (VUs)

    • 監控當前活躍的虛擬用戶數量
    • 驗證是否達到預期並發數
  2. 數據傳輸量

    • 顯示發送/接收的數據量
    • 評估網路頻寬使用

六、測試結果分析

關鍵性能指標 (KPI)

指標 目標值 說明
RPS 200/秒 每秒請求數
P95 延遲 < 100ms 95% 請求的響應時間
錯誤率 < 1% 失敗請求比例
成功率 > 99% 成功請求比例

效能瓶頸識別

透過 Grafana 儀表板觀察:

  1. 響應時間突增 → 可能是資料庫查詢慢或 API 處理邏輯問題
  2. 錯誤率上升 → 檢查錯誤日誌,識別失敗原因(超時、5xx 錯誤等)
  3. VU 數量達到上限 → 系統可能無法承受更高並發
  4. 檢查點失敗 → 特定驗證條件未通過(如響應格式錯誤)

七、最佳實踐建議

測試設計

  1. 漸進式加壓: 先從低負載開始,逐步增加到目標負載
  2. 場景多樣化: 模擬真實用戶行為,混合不同 API 端點
  3. 設定合理閾值: 根據業務需求定義可接受的性能指標

數據保存

1
2
3
4
5
6
7
# 定期備份 InfluxDB 數據
docker exec k6-influxdb influxd backup -database k6 /backup

# 匯出 Grafana 儀表板配置
curl -H "Content-Type: application/json" \
http://admin:admin@localhost:3000/api/dashboards/db/k6-dashboard \
> dashboard-backup.json

持續監控

  • 基線測試: 建立效能基線,用於後續比較
  • 回歸測試: 每次部署後執行負載測試,確保性能未退化
  • 告警設定: 在 Grafana 設定告警規則,當指標異常時自動通知

八、故障排除

常見問題

Q: K6 無法連接到 InfluxDB

1
2
3
4
5
6
# 檢查 Docker 網路
docker network ls
docker network inspect k6_default

# 確認 InfluxDB 運行狀態
docker logs k6-influxdb

Q: Grafana 無法查詢數據

  • 確認數據源配置正確(URL 使用容器名稱 influxdb
  • 檢查資料庫名稱是否為 k6
  • 驗證時間範圍設定

Q: 測試過程中大量錯誤

  • 檢查目標 API 是否可訪問
  • 驗證認證 headers 是否正確
  • 降低負載(減少 rate 參數)重新測試

總結

本專案提供了一套完整的負載測試解決方案:

自動化: 腳本自動生成,減少手動配置
可擴展: 輕鬆添加新的測試場景
即時監控: Grafana 儀表板實時顯示性能指標
數據持久化: InfluxDB 保存歷史數據用於分析
容器化: Docker Compose 一鍵啟動環境

透過這套工具,團隊可以:

  • 在開發階段及早發現性能問題
  • 評估系統在高負載下的穩定性
  • 為容量規劃提供數據支撐
  • 建立持續的性能監控體系

參考資源


K6 負載測試完整指南:搭配 Grafana 與 InfluxDB 實現即時監控
https://shengshengyang.github.io/2025/11/17/k6-test/
作者
Dean Yang
發布於
2025年11月17日
許可協議