跳转至

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,
  });
}

验证数据

  1. 查看 K6 控制台,确认测试期间没有 HTTP 错误,并且 Remote Write 输出没有报错。
  2. 在观测云中打开指标查询,选择指标集 k6,按 benchmark_id 和 testid 过滤。
  3. 确认以下指标随测试时间持续上报:请求总数、失败率、平均耗时、P95、P99 和最大 VU。
  4. 请求速率应由累计请求数计算,不能直接把累计总数当作 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"。

参考

文档评价

文档内容是否对您有帮助?