4. 数据采集方法:压力测试中的数据采集工具与日志监控
压力测试的特征筛选依赖高质量、多维度的数据。数据采集是特征工程的起点,决定了后续分析的深度与准确性。本章聚焦三大主流采集工具(JMeter、Grafana、Prometheus)以及日志与监控数据的获取方法,帮助你在压测场景中建立完整的数据管道。
4.1 数据采集架构总览
压力测试数据采集通常分为三层:压测引擎层(产生请求与响应数据)、中间件与系统层(产生性能指标与日志)、采集与存储层(汇总、清洗、持久化)。下图展示了典型的数据采集拓扑。
4.2 JMeter:压测引擎数据采集
JMeter 是压力测试中最常用的开源工具,其数据采集能力覆盖请求级响应数据、聚合报告、监听器实时指标。JMeter 原生支持 CSV 日志输出、JDBC 后端存储以及实时监听器推送。
4.2.1 核心数据采集方式
| 采集方式 | 输出格式 | 适用场景 | 关键配置 |
|---|---|---|---|
| CSV 日志文件 | .csv / .jtl | 离线分析、特征提取 | 设置 jmeter.save.saveservice.* 属性 |
| 聚合报告监听器 | 表格 / 图表 | 实时查看吞吐量、错误率 | 添加 Listener → Aggregate Report |
| 后端监听器 | InfluxDB / Graphite | 实时监控、Grafana 展示 | 配置 Backend Listener + InfluxDB URL |
| JDBC 存储 | 数据库表 | 持久化、跨场景对比 | 配置 JDBC Connection Configuration |
4.2.2 CSV 日志配置示例
在 user.properties 中启用全量数据保存,确保特征筛选所需字段完整记录:
# 启用所有保存服务
jmeter.save.saveservice.output_format=csv
jmeter.save.saveservice.response_data=true
jmeter.save.saveservice.samplerData=true
jmeter.save.saveservice.requestHeaders=true
jmeter.save.saveservice.responseHeaders=true
jmeter.save.saveservice.threadName=true
jmeter.save.saveservice.latency=true
jmeter.save.saveservice.connectTime=true
jmeter.save.saveservice.timeStamp=true
jmeter.save.saveservice.successful=true
jmeter.save.saveservice.bytes=true
jmeter.save.saveservice.sentBytes=true
jmeter.save.saveservice.threadCounts=true
jmeter.save.saveservice.hostname=true
latency(延迟)、connectTime(连接时间)、bytes(响应大小)、sentBytes(请求大小)是压力测试特征筛选的核心原始字段。建议在压测前确认这些字段已启用,避免重复压测。
4.3 Prometheus:系统级指标采集
Prometheus 是云原生生态的标准监控工具,通过 Pull 模式从各目标(Target)抓取指标。在压力测试中,Prometheus 负责采集服务器 CPU、内存、磁盘 I/O、网络、JVM、数据库连接池等系统级指标,为特征筛选提供基础设施维度的数据。
4.3.1 常用 Exporter 与指标
| Exporter | 采集目标 | 关键指标示例 | 端口 |
|---|---|---|---|
| node_exporter | Linux 服务器 | node_cpu_seconds_total, node_memory_MemAvailable_bytes |
9100 |
| jmx_exporter | JVM 应用 | jvm_gc_pause_seconds, jvm_memory_bytes_used |
自定义 |
| mysqld_exporter | MySQL 数据库 | mysql_global_status_threads_connected, mysql_global_status_innodb_row_lock_current_waits |
9104 |
| nginx_exporter | Nginx 反向代理 | nginx_http_requests_total, nginx_upstream_response_time |
9113 |
| redis_exporter | Redis 缓存 | redis_memory_used_bytes, redis_connected_clients |
9121 |
4.3.2 PromQL 查询示例
PromQL 是 Prometheus 的查询语言,用于在特征筛选阶段提取特定时间窗口的指标:
# 过去5分钟平均CPU使用率(排除空闲)
100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
# 过去1分钟平均内存使用率
(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100
# 过去5分钟JVM GC暂停时间总和(适用于特征筛选中的GC压力特征)
sum by (instance) (rate(jvm_gc_pause_seconds_sum[5m]))
4.4 Grafana:可视化与数据聚合
Grafana 是数据可视化和告警平台,在压力测试中主要承担实时仪表盘和数据聚合查询两个角色。Grafana 本身不存储数据,而是通过数据源插件连接 Prometheus、InfluxDB、Elasticsearch 等后端。
4.4.1 Grafana 在特征筛选中的用途
- 实时监控仪表盘:将 JMeter 后端监听器推送的请求指标与 Prometheus 系统指标同屏展示,快速定位瓶颈时段。
- 数据导出:通过 Grafana 的 CSV 导出功能,将特定时间范围的聚合指标导出为特征文件。
- 告警规则:设置特征阈值告警(如错误率 > 5%、CPU > 80%),辅助筛选异常特征。
- 变量与模板:使用 Grafana 模板变量动态切换压测场景、服务器实例,便于批量特征提取。
4.4.2 典型仪表盘配置
以下是一个压力测试仪表盘的 Panel 配置示例(JSON Model 片段):
{
"title": "请求延迟与CPU关联",
"type": "graph",
"targets": [
{
"expr": "avg by (instance) (rate(jmeter_latency_seconds_sum[30s]))",
"legendFormat": "平均延迟",
"refId": "A"
},
{
"expr": "100 - (avg by (instance) (rate(node_cpu_seconds_total{mode=\"idle\"}[30s])) * 100)",
"legendFormat": "CPU使用率",
"refId": "B",
"yaxis": 2
}
],
"gridPos": {"h": 8, "w": 12, "x": 0, "y": 0}
}
4.5 日志与监控数据获取
除了结构化指标,日志数据(应用日志、访问日志、慢查询日志)包含大量非结构化特征,如异常堆栈、请求路径、用户代理等。日志采集通常使用 ELK(Elasticsearch + Logstash + Kibana)或 Loki + Grafana 组合。
4.5.1 日志数据采集流程
4.5.2 日志特征提取示例
以下是从 Nginx 访问日志中提取特征的正则表达式示例(Logstash grok 模式):
# Nginx 访问日志格式
# $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"
# Logstash grok 匹配模式
%{IP:client_ip} - %{DATA:remote_user} \[%{HTTPDATE:timestamp}\] "%{WORD:method} %{URIPATHPARAM:request_path} HTTP/%{NUMBER:http_version}" %{NUMBER:status_code} %{NUMBER:bytes_sent} "%{DATA:referer}" "%{DATA:user_agent}"
status_code(状态码分布)、request_path(热点路径)、bytes_sent(响应大小)、user_agent(客户端类型)可直接作为分类特征或数值特征输入筛选模型。例如,5xx 状态码占比超过 1% 的时段通常对应系统瓶颈。
4.6 数据采集工具对比与选型
| 工具 | 数据类型 | 采集模式 | 存储后端 | 特征筛选适配度 |
|---|---|---|---|---|
| JMeter | 请求级响应数据 | Push(CSV / 后端监听器) | 文件 / InfluxDB | 高:直接提供延迟、吞吐量、错误率等核心特征 |
| Prometheus | 系统级时序指标 | Pull(Exporter) | TSDB(本地 / 远端) | 高:CPU、内存、I/O 等基础设施特征 |
| Grafana | 聚合可视化数据 | 查询(数据源代理) | 无(仅展示) | 中:适合特征探索与导出,不直接产生原始特征 |
| ELK / Loki | 非结构化日志 | Push(Agent) | Elasticsearch / 对象存储 | 中高:需额外解析结构化,但异常特征丰富 |
4.7 数据采集最佳实践
- 统一时间戳:所有采集工具使用 NTP 同步时钟,时间戳精度统一到毫秒,避免特征对齐错位。
- 冗余采集:关键指标(如请求延迟、CPU 使用率)同时从 JMeter 和 Prometheus 采集,用于交叉验证数据质量。
- 采样策略:高并发场景下(TPS > 10000),JMeter 可启用
sample_variables采样或使用后端监听器聚合,避免磁盘 I/O 成为瓶颈。 - 元数据标记:在 JMeter 线程组或 Prometheus 标签中加入场景名称、压测批次、服务器角色等元数据,便于特征筛选时分组对比。
- 数据完整性校验:压测结束后,对比 JMeter 聚合报告的总请求数与 Prometheus 中记录的网络流量,确保数据无丢失。