注意
这是一个实验模块。虽然我们希望尽可能保持实验模块稳定,但仍可能引入破坏性变更。在模块完全稳定并成为 k6 核心模块之前,未来的 k6 版本可能发生这种情况。有关更多信息,请参阅版本控制和稳定性保证文档。实验模块保持较高的稳定性,并遵循常规维护和安全措施。如有反馈或建议,欢迎提交 issue。
Prometheus remote write 是一种协议,可将数据从发送方可靠地实时传送到接收方。它有多种兼容实现及存储集成。
例如,使用 experimental-prometheus-rw 输出时,k6 可以将测试结果指标发送到远程写入端点,并存储到 Prometheus。
在 k6 run 执行期间,这个输出会取得 k6 指标生成的全部时间序列数据点,再生成等价的 Prometheus 时间序列,并发送到 Prometheus 远程写入端点。
指标映射
所有 k6 指标类型都会转换成等价的 Prometheus 指标类型。该输出将指标映射为带有 Name 标签的时间序列。k6 会尽可能遵循 Prometheus 项目定义的命名最佳实践:
- 所有时间序列都使用 k6_ 命名空间前缀。
- 所有时间序列都以样本值的基本单位作为后缀,前提是 k6 知道这个基本单位。
- Trend 和 Rate 使用相应的后缀,以便更容易发现。
| k6 | Prometheus | Name 标签 |
|---|---|---|
| Counter(计数器) | Counter(计数器) | k6_*_total |
| Gauge(仪表) | Gauge(仪表) | k6_*_<unit-suffix> |
| Rate(比率) | Gauge(仪表) | k6_*_rate |
| Trend(趋势) | Counter 和 Gauge(默认),或原生直方图 | k6_*_<unit-suffix> |
Trend 指标转换
该输出提供两种不同的机制,将 k6 Trend 指标发送到 Prometheus:
- Counter 和 Gauge 指标(默认)
- Prometheus 原生直方图
这两个选项都能高效存储测试结果,并提供高精度查询。
注意,无论使用哪个选项,k6 都会先聚合趋势指标数据,再发送给 Prometheus。聚合的原因如下:
- Prometheus 以毫秒(ms)精度存储数据,而 k6 指标以更高的纳秒(ns)精度收集数据点。
- 负载测试可能生成大量数据点。高精度原始数据的成本和扩展复杂度可能迅速增加,而且分析性能趋势时并不需要如此高的精度。
1. Counter 和 Gauge
默认情况下,Prometheus 支持 Counter 和 Gauge 指标类型。因此,这是该输出的默认选项,它将所有 k6 Trend 指标转换成 Prometheus Counter 和 Gauge 指标。
可以通过 K6_PROMETHEUS_RW_TREND_STATS 选项配置所有 k6 趋势指标的转换方式。它接受以逗号分隔的统计函数列表:count、sum、min、max、avg、med、p(x)。默认值为 p(99)。
根据提供的统计函数列表,k6 将所有趋势指标转换为对应数学函数的 Prometheus 指标。
例如,K6_PROMETHEUS_RW_TREND_STATS=p(90),p(95),max 将每个趋势指标转换成以下三个 Prometheus 指标:
k6_*_p90k6_*_p95k6_*_max
这个选项提供了一种可配置的方案,在 Prometheus 中表示 Trend 指标,但有以下缺点:
- 一个 k6 Trend 指标会转换为多个 Prometheus 指标。
- 某些 Gauge 值无法聚合,尤其是百分位数。
- 它使用的 k6 数据结构消耗较多内存。
2. Prometheus 原生直方图
为解决前一个选项的限制,可以启用 Prometheus 原生直方图,将 k6 趋势指标转换为高保真直方图。
使用此选项时,每个 k6 趋势指标都映射到对应的 Prometheus 直方图指标 k6_*。随后可以使用 histogram_quantile() 等 Prometheus 直方图函数查询。
注意
要了解使用直方图的优势和效果,请观看《High-resolution Histograms in Prometheus》。
注意,原文所述的原生直方图是 Prometheus v2.40.0 发布的实验功能,其他远程写入实现可能尚不支持。原文说明,未来 Prometheus 将该功能稳定后,k6 会考虑将它作为 Trend 指标的默认转换方法。
将测试指标发送到远程写入端点
在 Prometheus 2.x 中使用远程写入,需要启用功能标志 –web.enable-remote-write-receiver。远程写入存储选项请参阅 Prometheus 文档。
-
不使用原生直方图,将 k6 指标发送到远程写入端点:
- 建立运行中的远程写入端点,并确保 k6 可以访问它。
- 使用 –out 标志及 RW 端点 URL,按以下方式运行 k6 脚本:
趋势统计值
K6_PROMETHEUS_RW_SERVER_URL=http://localhost:9090/api/v1/write \ k6 run -o experimental-prometheus-rw script.jsHTTP Basic 身份验证
K6_PROMETHEUS_RW_SERVER_URL=http://localhost:9090/api/v1/write \ K6_PROMETHEUS_RW_USERNAME=USERNAME \ K6_PROMETHEUS_RW_PASSWORD=PASSWORD \ k6 run -o experimental-prometheus-rw script.js- 可选地传入 K6_PROMETHEUS_RW_TREND_STATS,以便查询趋势指标的其他统计值。默认值为 p(99)。
K6_PROMETHEUS_RW_SERVER_URL=http://localhost:9090/api/v1/write \ K6_PROMETHEUS_RW_TREND_STATS=p(95),p(99),min,max \ k6 run -o experimental-prometheus-rw script.js -
使用原生直方图,将 k6 指标发送到远程写入端点:
- 在 Prometheus 2.40.0 或更高版本中启用功能标志 –enable-feature=native-histograms。建立运行中的远程写入端点,并确保 k6 可以访问它。
- 使用 –out 标志,启用 K6_PROMETHEUS_RW_TREND_AS_NATIVE_HISTOGRAM 选项,并按以下方式指定 RW 端点 URL,运行 k6 脚本:
原生直方图
K6_PROMETHEUS_RW_SERVER_URL=http://localhost:9090/api/v1/write \ K6_PROMETHEUS_RW_TREND_AS_NATIVE_HISTOGRAM=true \ k6 run -o experimental-prometheus-rw script.jsHTTP Basic 身份验证
K6_PROMETHEUS_RW_SERVER_URL=http://localhost:9090/api/v1/write \ K6_PROMETHEUS_RW_TREND_AS_NATIVE_HISTOGRAM=true \ K6_PROMETHEUS_RW_USERNAME=USERNAME \ K6_PROMETHEUS_RW_PASSWORD=PASSWORD \ k6 run -o experimental-prometheus-rw script.js
运行前面的 k6 run 命令后,k6 开始向 Prometheus 发送时间序列指标。所有时间序列都有 k6_ 前缀。它们在 Prometheus Web UI 中如下所示:

选项
k6 为远程写入输出提供专用选项。
| 名称 | 类型 | 说明 |
|---|---|---|
K6_PROMETHEUS_RW_SERVER_URL |
字符串 |
Prometheus 远程写入实现的端点 URL。默认值为 http://localhost:9090/api/v1/write。 |
K6_PROMETHEUS_RW_HEADERS_<header-key> |
字符串 |
HTTP 请求中附加的标头。可以按所述格式设置,例如 K6_PROMETHEUS_RW_HEADERS_CUSTOM-HEADER-KEY=custom-header-value。 |
K6_PROMETHEUS_RW_HTTP_HEADERS |
逗号分隔的键值列表 | HTTP 请求中附加的标头。K6_PROMETHEUS_RW_HTTP_HEADERS=key1:value1,key2:value2。 |
K6_PROMETHEUS_RW_LABELS |
逗号分隔的键值对列表 | 添加到远程写入时间序列的静态标签,例如 environment=production,server=srv1。默认不添加额外标签。请参阅“添加静态标签”。 |
K6_PROMETHEUS_RW_PUSH_INTERVAL |
字符串 |
指标聚合与上传到端点之间的间隔。默认值为 5s。 |
K6_PROMETHEUS_RW_TREND_AS_NATIVE_HISTOGRAM |
布尔值 |
如果为 true,则将所有定义的趋势指标映射为原生直方图。默认值为 false。 |
K6_PROMETHEUS_RW_TREND_STATS |
字符串列表 | 如果没有启用原生直方图,则此选项定义所有已定义趋势指标的映射统计函数。它是以逗号分隔的统计函数列表,例如 p(90),avg,sum。支持的统计函数列表见趋势指标部分。默认值为 p(99)。 |
K6_PROMETHEUS_RW_INSECURE_SKIP_TLS_VERIFY |
布尔值 |
如果为 true,HTTP 客户端会跳过端点的 TLS 验证。默认值为 false。 |
K6_PROMETHEUS_RW_TLS_MIN_VERSION |
字符串 |
设置 HTTP 客户端使用的最低 TLS 版本。可选值为 1.2 和 1.3。默认值为 1.3。 |
K6_PROMETHEUS_RW_STALE_MARKERS |
布尔值 |
如果为 true,输出会在测试结束时将所有见过的时间序列标记为过时。默认值为 false。 |
K6_PROMETHEUS_RW_USERNAME |
字符串 |
用于 Prometheus 远程写入端点 HTTP Basic 身份验证的用户名。 |
K6_PROMETHEUS_RW_PASSWORD |
字符串 |
用于 Prometheus 远程写入端点 HTTP Basic 身份验证的密码。 |
K6_PROMETHEUS_RW_CLIENT_CERTIFICATE |
字符串 |
PEM(Privacy-Enhanced Mail)格式客户端证书的路径。 |
K6_PROMETHEUS_RW_CLIENT_CERTIFICATE_KEY |
字符串 |
PEM 格式客户端私钥的路径。 |
K6_PROMETHEUS_RW_BEARER_TOKEN |
字符串 |
设置 Authorization Bearer Token 标头。 |
K6_PROMETHEUS_RW_SIGV4_REGION |
字符串 |
设置工作区所在的 AWS 区域。与其他 K6_PROMETHEUS_RW_SIGV4_* 配置一起启用请求签名。 |
K6_PROMETHEUS_RW_SIGV4_ACCESS_KEY |
字符串 |
设置 AWS 访问密钥。 |
K6_PROMETHEUS_RW_SIGV4_SECRET_KEY |
字符串 |
设置 AWS 秘密密钥。 |
添加静态标签
多个 k6 进程向同一个 Prometheus 端点发送指标时,可以使用 server 或 job_id 等标签区分时间序列。为每个需要独立标识的进程或任务设置不同的值。这样可以在部署或 CI 任务中配置标签,而无需修改测试脚本。
设置 K6_PROMETHEUS_RW_LABELS,为发送到远程写入端点的每个时间序列添加静态标签。使用逗号分隔的 key=value 对列表:
K6_PROMETHEUS_RW_LABELS="environment=production,server=srv1" \
k6 run -o experimental-prometheus-rw script.js
将 script.js 替换成你的测试脚本,并按照“将测试指标发送到远程写入端点”配置远程写入端点。
也可以在 JSON 配置文件中设置 collectors.experimental-prometheus-rw.labels:
{
"collectors": {
"experimental-prometheus-rw": {
"labels": {
"environment": "production",
"server": "srv1"
}
}
}
}
将它保存为 config.json,然后运行测试:
k6 run --config config.json -o experimental-prometheus-rw script.js
如果两个位置配置了同一个标签,K6_PROMETHEUS_RW_LABELS 的优先级高于 JSON 配置。
这些标签仅应用于远程写入输出。已有的时间序列标签,包括来自脚本 tags 的标签,优先于同名静态标签。k6 会忽略名称或值为空的标签,也会忽略保留标签 __name__。
过时的趋势指标
这个 k6 输出可以在测试结束时将时间序列标记为过时。要启用此选项,将环境变量 K6_PROMETHEUS_RW_STALE_MARKERS 设置为 true。
默认情况下,指标在最后一个样本被刷新后保持活跃 5 分钟,此后会自动标记为过时。有关过时状态的详细信息,请参阅 Prometheus 文档。
时间序列可视化
使用 Grafana 可视化时间序列时,可以使用 Explore UI,或导入已有的预构建仪表板:
- Grafana k6 提供的 k6 Prometheus 仪表板
- Grafana k6 提供的 k6 Prometheus(原生直方图)仪表板
- 社区提供的其他公开仪表板
如果你使用 Grafana Cloud,请参阅 Grafana Cloud Prometheus 文档。
对于本地环境,xk6-output-prometheus-remote 仓库包含一个 docker-compose 配置,用来创建 k6 Prometheus 和 k6 Prometheus(原生直方图)仪表板:

Docker Compose 示例
先克隆仓库,然后按以下步骤使用启动 Prometheus 和 Grafana 的 docker-compose.yml 文件:
-
启动 Docker Compose 环境。
docker compose up -d prometheus grafana# Output Creating xk6-output-prometheus-remote_grafana_1 ... done Creating xk6-output-prometheus-remote_prometheus_1 ... donePrometheus 启动时已启用原生直方图。可以使用同一个 Prometheus 实例,将 k6 趋势指标接收为原生直方图,或多个指标统计值。
-
按照“将测试指标发送到远程写入端点”中的一个选项运行 k6 测试。
趋势统计值
K6_PROMETHEUS_RW_TREND_STATS=p(95),p(99),min,max \ k6 run -o experimental-prometheus-rw script.js原生直方图
K6_PROMETHEUS_RW_TREND_AS_NATIVE_HISTOGRAM=true \ k6 run -o experimental-prometheus-rw script.js可选地将 testid 标签设置为测试全局标签,将指标划分成独立的测试运行,并在预构建 Grafana 仪表板或 PromQL 查询中筛选具体测试结果。testid 可以是任何能够清楚标识测试运行的唯一字符串。
趋势统计值
K6_PROMETHEUS_RW_TREND_STATS=p(95),p(99),min,max \ k6 run -o experimental-prometheus-rw --tag testid=<SET-HERE-A-UNIQUE-ID> script.js原生直方图
K6_PROMETHEUS_RW_TREND_AS_NATIVE_HISTOGRAM=true \ k6 run -o experimental-prometheus-rw --tag testid=<SET-HERE-A-UNIQUE-ID> script.js - 测试运行后,访问 http://localhost:3000。如果启用了原生直方图,选择 k6 Prometheus(Native Histograms)仪表板;否则选择 k6 Prometheus Dashboard。












暂无评论内容