4. 压测工具选型与对比:Locust、k6、wrk、vegeta 的优缺点及与 Prometheus 集成方式

在 Prometheus 数据驱动的容量压测巡检体系中,压测工具是流量注入的核心执行器。选型需综合考虑:脚本灵活性、分布式能力、指标暴露方式以及与 Prometheus 生态的集成成本。本节对 Locust、k6、wrk、vegeta 四款主流工具进行横向对比,并给出集成建议。

4.1 工具概览与核心定位

工具 语言/DSL 协议支持 执行模型 核心定位
Locust Python HTTP / WebSocket / gRPC(插件) 事件驱动 + 协程 可编程、分布式、面向复杂业务场景
k6 JavaScript (ES6) HTTP / gRPC / WebSocket / Browser Go 协程 + JS 运行时 开发者体验、CI/CD 集成、性能测试即代码
wrk Lua(脚本) HTTP / HTTPS 多线程 + 事件循环 高并发、低资源、纯压测引擎
vegeta Go(CLI + 库) HTTP / HTTPS 多 worker 并发 简洁、可组合、管道式压测
选型提示: 如果你的巡检脚本需要复杂的业务逻辑(如登录态保持、动态参数、多步骤事务),优先考虑 Locust 或 k6;如果仅需对单一 API 端点进行高并发压力测试,wrk 或 vegeta 更轻量高效。

4.2 优缺点深度对比

维度 Locust k6 wrk vegeta
脚本编写 Python 原生,生态丰富,学习成本低 JS 语法,内置 HTTP 库,门槛中等 Lua 脚本,功能有限,调试不便 Go 结构体定义,无脚本,仅 CLI 参数
并发模型 协程(gevent),单机可模拟数千用户 Go 协程,单机性能极高 多线程 + epoll,单机性能最优 多 worker,性能稳定
分布式支持 原生支持(Master-Worker) k6-operator(K8s)或 k6-cloud 无原生支持,需外部编排 无原生支持,需外部编排
指标丰富度 内置请求/响应/用户数,可自定义 内置 40+ 指标,支持 Trend/Counter/Gauge 仅延迟/吞吐量/错误率 延迟/吞吐量/状态码分布
CI/CD 集成 需额外配置,CLI 支持 原生支持,CLI 输出 JUnit/JSON 需脚本封装 管道友好,支持 stdout 输出
学习曲线 低(Python 基础) 中(JS + 概念) 中(Lua + 线程模型) 低(CLI 参数)

4.3 与 Prometheus 集成方式

四款工具与 Prometheus 的集成路径差异显著,直接影响巡检脚本的数据采集架构。

压测工具与 Prometheus 集成架构 Locust k6 wrk vegeta 集成方式 方式1: 直接暴露 /metrics Locust (PrometheusExporterPlugin) 方式2: Pushgateway k6 (--out output-prometheus-pushgateway) 方式3: 日志/管道解析 wrk/vegeta → 自定义 Exporter Prometheus Server scrape / push / 自定义 Exporter Grafana 巡检看板 说明:Locust 通过插件直接暴露 /metrics;k6 原生支持 Pushgateway 输出;wrk/vegeta 需通过日志解析或自定义 Exporter 桥接。

4.4 各工具集成详解

4.4.1 Locust + Prometheus(推荐用于复杂巡检)

Locust 通过 prometheus_exporter 插件暴露 /metrics 端点,Prometheus 可直接拉取。支持自定义指标注入。

# 安装插件
pip install locust prometheus-client

# 启动时加载插件
locust -f locustfile.py --web-host 0.0.0.0 \
  --web-port 8089 \
  --prometheus-exporter-port 9646

# Prometheus scrape 配置
scrape_configs:
  - job_name: 'locust'
    static_configs:
      - targets: ['locust-host:9646']

4.4.2 k6 + Prometheus(推荐用于 CI/CD 巡检)

k6 内置 --out output-prometheus-pushgateway 选项,将指标推送到 Pushgateway,再由 Prometheus 拉取。

# 运行 k6 并推送指标
k6 run --out output-prometheus-pushgateway=http://pushgateway:9091 script.js

# k6 脚本示例(自动生成指标)
import http from 'k6/http';
import { check } from 'k6';

export default function () {
  let res = http.get('http://test.k6.io');
  check(res, { 'status is 200': (r) => r.status === 200 });
}

4.4.3 wrk + Prometheus(需自定义 Exporter)

wrk 输出结构化文本到 stdout,需通过自定义 Exporter 解析并转换为 Prometheus 指标。

# wrk 运行示例
wrk -t12 -c400 -d30s http://target:8080/api

# 输出格式(需解析)
Running 30s test @ http://target:8080/api
  12 threads and 400 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    45.67ms   12.34ms 123.45ms   75.00%
    Req/Sec     890.12    45.67   1234.56    80.00%
  26703 requests in 30.00s, 3.45MB read
  Requests/sec:    890.10
  Transfer/sec:    117.67KB

4.4.4 vegeta + Prometheus(管道友好)

vegeta 支持 JSON 输出,可管道传递给自定义 Exporter 或直接写入文件后批量导入。

# vegeta 攻击并输出 JSON
echo "GET http://target:8080/api" | \
  vegeta attack -rate=100 -duration=30s | \
  vegeta report --type=json > results.json

# 自定义 Exporter 解析 results.json 并暴露 /metrics
集成避坑: wrk 和 vegeta 缺乏原生 Prometheus 集成,在巡检脚本中需要额外开发 Exporter 组件,增加维护成本。如果团队资源有限,优先选择 Locust 或 k6。

4.5 选型决策矩阵

场景 推荐工具 理由
复杂业务巡检(多步骤、动态参数) Locust Python 脚本灵活,Prometheus 插件成熟
CI/CD 流水线集成 k6 原生 Pushgateway 输出,JS 脚本可版本管理
单端点高并发压测 wrk 资源占用极低,单机性能最优
管道式批量压测 vegeta CLI 简洁,JSON 输出易于二次处理
分布式压测(多节点) Locust 原生 Master-Worker 架构,无需额外编排

4.6 本章小结

  • Locust 和 k6 是 Prometheus 数据驱动巡检的首选,集成成本低、指标丰富。
  • wrk 和 vegeta 适合作为轻量级补充工具,但需额外开发 Exporter。
  • 在巡检脚本编排中,建议以 Locust 为主力工具,k6 作为 CI/CD 场景的备选,wrk/vegeta 用于特定性能基线验证。
  • 无论选择哪种工具,都应确保压测指标(延迟、吞吐量、错误率、P99)能够被 Prometheus 采集,并纳入统一的巡检看板。