K6
K6 是用于接口和系统负载测试的命令行工具。本集成通过 K6 的 experimental-prometheus-rw 输出,将压测指标写入 DataKit 的 Prometheus Remote Write 接口,再上报到观测云。K6 本身不需要常驻服务,执行压测的机器只需要能够访问 DataKit。
配置¶
前置条件¶
- 已安装 K6,并确认
k6 version可以正常执行。 - 已安装 DataKit,且压测机可以访问 DataKit 的
9529端口。 - 已在 DataKit 开启
prom_remote_write采集器。 - 为每次压测设置唯一的
benchmark_id和testid,避免不同批次的数据混在一起。
配置 DataKit¶
在 DataKit 安装目录的 conf.d/prom 下创建 prom_remote_write.conf,示例如下:
[[inputs.prom_remote_write]]
path = "/prom_remote_write"
methods = ["PUT", "POST"]
# K6 指标以 k6_ 开头,固定写入 k6 指标集并保留原始指标名。
job_as_measurement = false
measurement_name = "k6"
keep_exist_metric_name = true
配置完成后,重启 DataKit 使配置生效。
配置 K6¶
将 Remote Write 地址指向 DataKit,并使用 experimental-prometheus-rw 输出:
export K6_PROMETHEUS_RW_SERVER_URL="http://<datakit-ip>:9529/prom_remote_write"
export K6_PROMETHEUS_RW_PUSH_INTERVAL="5s"
export K6_PROMETHEUS_RW_TREND_STATS="p(95),p(99),min,max"
k6 run \
-o experimental-prometheus-rw \
--tag benchmark_id="k6-demo-20260917" \
--tag testid="baseline-r300-rep1" \
script.js
如果 DataKit 接口启用了 HTTP Basic Authentication,可同时设置 K6_PROMETHEUS_RW_USERNAME 和 K6_PROMETHEUS_RW_PASSWORD。请通过密钥管理系统注入凭据,不要将真实密码写入脚本或命令历史。
K6 脚本示例¶
下面的脚本以恒定到达率运行 10 分钟;请将目标地址替换为实际测试接口,并根据业务响应能力调整 VU 数量:
import http from 'k6/http';
import { check } from 'k6';
export const options = {
scenarios: {
steady_load: {
executor: 'constant-arrival-rate',
rate: 300,
timeUnit: '1s',
duration: '10m',
preAllocatedVUs: 100,
maxVUs: 300,
},
},
};
export default function () {
const response = http.get(`${__ENV.TARGET_URL}/health`);
check(response, {
'HTTP status is 200': (res) => res.status === 200,
});
}
验证数据¶
- 查看 K6 控制台,确认测试期间没有 HTTP 错误,并且 Remote Write 输出没有报错。
- 在观测云中打开指标查询,选择指标集
k6,按benchmark_id和testid过滤。 - 确认以下指标随测试时间持续上报:请求总数、失败率、平均耗时、P95、P99 和最大 VU。
- 请求速率应由累计请求数计算,不能直接把累计总数当作 RPS。查询窗口应大于
K6_PROMETHEUS_RW_PUSH_INTERVAL,否则速率曲线可能出现空点。
指标¶
K6 指标集名称为 k6。下表列出 K6 常用压测指标、单位及含义。耗时指标以毫秒展示,比例指标的原始值范围为 0 到 1,展示为百分比时乘以 100。
| 指标 | 单位 | 描述 |
|---|---|---|
k6_checks_rate |
%(原始值 0-1) |
check 校验通过比例;展示为百分比时乘以 100。 |
k6_data_received_total |
bytes |
K6 接收的数据量累计值。 |
k6_data_sent_total |
bytes |
K6 发送的数据量累计值。 |
k6_http_req_blocked_avg |
ms |
请求阻塞平均耗时。 |
k6_http_req_blocked_max |
ms |
请求阻塞最大耗时。 |
k6_http_req_blocked_p90 |
ms |
请求阻塞耗时 P90。 |
k6_http_req_blocked_p95 |
ms |
请求阻塞耗时 P95。 |
k6_http_req_blocked_p99 |
ms |
请求阻塞耗时 P99。 |
k6_http_req_connecting_avg |
ms |
TCP 建连平均耗时。 |
k6_http_req_connecting_max |
ms |
TCP 建连最大耗时。 |
k6_http_req_connecting_p90 |
ms |
TCP 建连耗时 P90。 |
k6_http_req_connecting_p95 |
ms |
TCP 建连耗时 P95。 |
k6_http_req_connecting_p99 |
ms |
TCP 建连耗时 P99。 |
k6_http_req_duration_avg |
ms |
HTTP 请求端到端平均耗时。 |
k6_http_req_duration_max |
ms |
HTTP 请求端到端最大耗时。 |
k6_http_req_duration_p90 |
ms |
HTTP 请求端到端耗时 P90。 |
k6_http_req_duration_p95 |
ms |
HTTP 请求端到端耗时 P95。 |
k6_http_req_duration_p99 |
ms |
HTTP 请求端到端耗时 P99。 |
k6_http_req_failed_rate |
%(原始值 0-1) |
HTTP 请求失败比例;展示为百分比时乘以 100。 |
k6_http_req_receiving_avg |
ms |
接收响应数据平均耗时。 |
k6_http_req_receiving_max |
ms |
接收响应数据最大耗时。 |
k6_http_req_receiving_p90 |
ms |
接收响应数据耗时 P90。 |
k6_http_req_receiving_p95 |
ms |
接收响应数据耗时 P95。 |
k6_http_req_receiving_p99 |
ms |
接收响应数据耗时 P99。 |
k6_http_req_sending_avg |
ms |
发送请求数据平均耗时。 |
k6_http_req_sending_max |
ms |
发送请求数据最大耗时。 |
k6_http_req_sending_p90 |
ms |
发送请求数据耗时 P90。 |
k6_http_req_sending_p95 |
ms |
发送请求数据耗时 P95。 |
k6_http_req_sending_p99 |
ms |
发送请求数据耗时 P99。 |
k6_http_req_tls_handshaking_avg |
ms |
TLS 握手平均耗时。 |
k6_http_req_tls_handshaking_max |
ms |
TLS 握手最大耗时。 |
k6_http_req_tls_handshaking_p90 |
ms |
TLS 握手耗时 P90。 |
k6_http_req_tls_handshaking_p95 |
ms |
TLS 握手耗时 P95。 |
k6_http_req_tls_handshaking_p99 |
ms |
TLS 握手耗时 P99。 |
k6_http_req_waiting_avg |
ms |
等待服务端响应平均耗时。 |
k6_http_req_waiting_max |
ms |
等待服务端响应最大耗时。 |
k6_http_req_waiting_p90 |
ms |
等待服务端响应耗时 P90。 |
k6_http_req_waiting_p95 |
ms |
等待服务端响应耗时 P95。 |
k6_http_req_waiting_p99 |
ms |
等待服务端响应耗时 P99。 |
k6_http_reqs_total |
requests |
HTTP 请求累计数;计算请求速率时使用该指标的 RATE。 |
k6_iteration_duration_avg |
ms |
场景迭代平均耗时。 |
k6_iteration_duration_max |
ms |
场景迭代最大耗时。 |
k6_iteration_duration_p90 |
ms |
场景迭代耗时 P90。 |
k6_iteration_duration_p95 |
ms |
场景迭代耗时 P95。 |
k6_iteration_duration_p99 |
ms |
场景迭代耗时 P99。 |
k6_iterations_total |
iterations |
场景迭代次数累计值。 |
k6_vus |
VUs |
当前 VU 数。 |
k6_vus_max |
VUs |
测试期间最大 VU 数。 |
所有 HTTP 指标都带有 scenario、testid、benchmark_id 等标签;请求级指标还可能带有 method、url、name、status、error 和 expected_response。查询时应至少过滤 benchmark_id 和 testid,否则不同压测轮次会被聚合。
K6_PROMETHEUS_RW_TREND_STATS 中未配置的百分位指标不会写入。需要 P90、P95 或 P99 时,请在启动 K6 前显式配置,例如 K6_PROMETHEUS_RW_TREND_STATS="p(90),p(95),p(99),min,max"。