📌 回顾一下流程
E2E 测试 (Cypress / Playwright)
↓
自定义脚本 pushMetric() 推送指标
↓
Prometheus PushGateway (暂存指标)
↓
Prometheus 定时抓取 PushGateway 的数据
↓
Prometheus 存储数据(时间序列数据库)
↓
Grafana 展示 Prometheus 中的数据
PushGateway 的作用和数据存储原理
🔄 PushGateway 的定位
PushGateway 是 中转站,用于 主动推送(push) 的监控数据。
它 不会持久化数据 —— 所有数据都是驻留在内存中。
Prometheus 会定期来拉取(scrape)这些驻留的数据。
🧯 数据生命周期
数据存在于 PushGateway 的内存里,直到:
被 Prometheus 抓取到。
被新的指标(用相同 job+instance 标签)覆盖。
被手动或程序调用 DELETE API 清理。
🗃️ Prometheus 的数据存储位置
Prometheus 是一个 时间序列数据库,
当它从 PushGateway 抓取到数据后,会将其存入本地存储(磁盘)。
默认路径:/prometheus(在容器中)
如果你挂载 volume,如:
prometheus:
volumes:
- ./prometheus-data:/prometheus
那数据会保存在宿主机的 ./prometheus-data 目录中。
📥 PushGateway 的抓取方式
Prometheus 配置中:
scrape_configs:
- job_name: ‘pushgateway’
static_configs:- targets: [‘pushgateway:9091’]
表示 Prometheus 会 定时拉取 PushGateway 上的 /metrics 页面。
举例:推送数据之后发生了什么
你运行测试并执行:
pushMetric({ job: ‘e2e_test’, value: 1 });
PushGateway 在 /metrics 暂存如下内容:
HELP e2e_test_success …
TYPE e2e_test_success gauge
e2e_test_success{job=”e2e_test”} 1
Prometheus 每 5s 来抓取一次:
GET http://pushgateway:9091/metrics
Prometheus 存入自己的本地数据库(时间戳+值)。
Grafana 读取 Prometheus 的时间序列数据库来画图。
❗️注意事项
项目 | 注意点 |
---|---|
持久化 | PushGateway 不会持久化数据(重启就没了)。Prometheus 会保存。 |
标签覆盖 | 再次推送同一 job+instance 会覆盖旧值 |
推送时机 | 推送完必须在 Prometheus 抓取前不要清理,否则 Prometheus 抓不到 |
清理 | 推送完成后可以用 HTTP DELETE 请求清理 job(可选) |
✅ 推荐实践
把 PushGateway 和 Prometheus 放在一个局域网 Docker 网络中。
每次测试完成后再推送指标,不用持续推。
使用 job=test_job 和 instance=test_suite_name 区分不同来源。
保证 Prometheus 的 scrape_interval 足够频繁(默认 15s,可设为 5s)。
✅ 数据流全链路复盘
1 | E2E 测试 (Cypress / Playwright) |
💡 重点澄清与易混概念解析
概念 | 说明 |
---|---|
PushGateway | 仅在内存中暂存指标,无持久化;供 Prometheus 抓取;重启即清。 |
Prometheus | 周期性抓取(pull model);抓取后存储到本地 TSDB。 |
抓取 vs 推送 | PushGateway 由客户端主动推送数据,Prometheus 负责拉取(scrape)。 |
🚨 注意事项补充
风险点 | 说明 |
---|---|
❌ 抓取前清理指标 | 会导致 Prometheus 抓不到数据。务必保证抓取后再清理。 |
❌ 多次推送覆盖数据 | 同一个 job + instance 会被覆盖,非叠加。 |
❌ PushGateway 重启 | 数据全失,除非 Prometheus 已抓取保存。 |
🔧 推荐实践补充建议
设置 Prometheus 的
scrape_interval
为 5s(适配瞬时 E2E 测试)。使用明确的标签组合区分测试来源:
1
2
3
4
5
6
7
8
9
10pushMetric({
job: 'e2e_test',
instance: 'cypress_suite_1',
labels: {
env: 'staging',
branch: 'feature-x',
build_id: 'build-789'
},
value: 1
});定义一个专用清理脚本(可选):
1
curl -X DELETE http://pushgateway:9091/metrics/job/e2e_test/instance/cypress_suite_1
✅ 完整的 Demo 示例,包括:
- 一个最小可运行的 Prometheus + PushGateway Docker Compose 配置
pushMetric()
的 Node.js 脚本(或支持 TypeScript)- Prometheus 的
prometheus.yml
配置 - Grafana 面板 JSON(展示
e2e_test_success
相关数据)
若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏