必须通过 Pushgateway 中转,因为 Prometheus 是拉模式,不支持外部直接推送指标;Pushgateway 接收 CI 上报的 deployment_timestamp 指标并持久化,Prometheus 定期拉取,实现变更可观测。

在 GitLab CI 流水线末端注入 Webhook 脚本,向 Prometheus 打入变更时钟(Deployment Clock),核心不是直接“打点”到 Prometheus,而是通过 Pushgateway 暴露一个带时间戳和元数据的指标,再由 Prometheus 定期拉取。整个过程全自动、可追溯、与发布强绑定。
为什么不能直接写入 Prometheus?
Prometheus 是拉模式(pull-based),不支持外部主动推送指标(除 Pushgateway 外)。直接 HTTP POST 到 Prometheus /metrics 接口会失败。所以必须借助:
- Pushgateway:一个临时中转服务,接收并持久化短生命周期作业(如 CI)上报的指标;
- 指标需含明确语义:比如
deployment_timestamp{env="prod",service="api",git_sha="abc123"}; - Prometheus 配置 job 拉取 Pushgateway 的 /metrics,实现“变更即可见”。
GitLab CI 中注入 Webhook 脚本的实操步骤
在 .gitlab-ci.yml 的最终 stage(如 deploy 或 notify)里添加脚本,用 curl 向 Pushgateway 提交指标:
after_script:
- |
if [ "$CI_PIPELINE_SOURCE" = "pipeline" ] && [ "$CI_ENVIRONMENT_SLUG" = "prod" ]; then
echo "Reporting deployment to Pushgateway..."
echo "deployment_timestamp{env=\"$CI_ENVIRONMENT_SLUG\",service=\"$CI_PROJECT_NAME\",git_sha=\"$CI_COMMIT_SHORT_SHA\",branch=\"$CI_DEFAULT_BRANCH\"} $(date +%s)" | \
curl --data-binary @- http://pushgateway.example.com:9091/metrics/job/deployment/env/$CI_ENVIRONMENT_SLUG
fi
- 用
echo ... | curl --data-binary @-方式提交,符合 Pushgateway 文本格式要求; - 指标名固定为
deployment_timestamp,标签携带环境、服务名、提交哈希、分支,便于后续在 Grafana 中按维度过滤; - URL 中的
/job/deployment/env/prod是 Pushgateway 的 grouping key,确保同环境多次部署不会覆盖,而是保留最新值(默认行为); - 建议加
if条件判断,只在生产环境或特定触发源下上报,避免测试流水线污染指标。
Prometheus 与 Grafana 联动配置要点
Pushgateway 上报后,还需让指标真正“活起来”:
-
Prometheus 配置新增 job:
- job_name: 'pushgateway-deployments' static_configs: - targets: ['pushgateway.example.com:9091'] metric_relabel_configs: - source_labels: [__name__] regex: 'deployment_timestamp' action: keep -
Grafana 中创建变更时钟面板:用
time()函数或timestamp(deployment_timestamp)转换为可读时间;叠加max by (env, service, git_sha) (deployment_timestamp)防止重复; - 推荐搭配
ALERTS{alertstate="firing", alertname="DeploymentTooOld"}做变更健康度告警,比如 2 小时无新部署则触发检查。
安全与可靠性加固建议
生产环境需避免裸 URL 和明文调用:
- Pushgateway 地址建议通过 GitLab 变量管理(
PUSHGATEWAY_URL),并设为 protected & masked; - 若 Pushgateway 开启 Basic Auth,curl 加
-u "$PUSHGATEWAY_USER:$PUSHGATEWAY_PASS"; - 添加简单重试逻辑(如
curl -f --retry 3),防止网络抖动导致漏报; - 定期清理 Pushgateway 中过期 job(例如用
curl -X DELETE http://.../job/deployment配合定时任务),避免堆积。











