前端analysis | 知其所以然

Prometheus gateway

2025-06-01

📌 回顾一下流程

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
2
3
4
5
6
7
8
9
10
11
E2E 测试 (Cypress / Playwright)

自定义脚本 pushMetric()

PushGateway(内存暂存)

Prometheus(周期抓取)

Prometheus 本地 TSDB(时间序列数据库)

Grafana 展示指标

💡 重点澄清与易混概念解析

概念 说明
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
    10
    pushMetric({
    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 相关数据)

使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏