You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

借助Jenkins、Grafana和Prometheus追踪PR部署时长

问题

我需要统计PR合并到主分支后部署至预发布(stage)环境的时长。当前流程是:PR合并主分支后触发第一个Job,第一个Job触发第二个Job,第二个Job触发负责部署的第三个Job。为了计算真实部署时长,得获取第一个Job的开始时间和第三个Job的结束时间,我现在是通过参数传递的方式把第一个Job的开始时间和PR名称依次传给后续Job,代码示例如下:

build job: 'job2Parameter', wait: false, parameters: [
                [$class: 'StringParameterValue', name: 'PR', value: "PR-1234"],
                [$class: 'StringParameterValue', name: 'firstStart', value: "${job1Timestamp}"]
            ]

我想用Grafana面板展示指定PR的部署时长,但没找到包含Job启停时间的Prometheus指标。于是在第三个部署Job后新增了summaryTime Job,传递第一个Job开始时间、PR名称和第三个Job结束时间,但查询Prometheus得到的指标是:

default_jenkins_builds_build_duration_milliseconds{jenkins_job="summaryTime", parameters="PR=PR-1234;thirdStop=1691752401187;firstStart=1691752322966"}

没办法单独提取firstStart和thirdStop来计算时长,想问有没有简便的修复方法,还是得彻底换方案?

解决方法

不需要彻底更换现有方案,有几个简便的修复思路:

1. 拆分参数生成独立标签(推荐)

修改summaryTime Job的参数传递逻辑,确保Jenkins Prometheus插件将每个参数单独作为指标标签:

  • 检查Jenkins Prometheus插件配置,开启Expose build parameters as labels选项(新版插件默认支持该功能)
  • 保持参数传递的独立性,不需要额外拼接,插件会自动将PR、firstStart、thirdStop分别拆解为指标标签,最终指标格式会变成:
    default_jenkins_builds_build_duration_milliseconds{jenkins_job="summaryTime", PR="PR-1234", firstStart="1691752322966", thirdStop="1691752401187"}
    
    这样在Grafana中就能直接用thirdStop数值减去firstStart数值计算部署时长。

2. 在PromQL中直接提取参数值

如果暂时无法修改Jenkins插件配置或Job参数逻辑,可以通过PromQL的字符串函数拆分parameters标签内容:

  • 提取firstStart:
    label_replace(default_jenkins_builds_build_duration_milliseconds{jenkins_job="summaryTime"}, "firstStart", "$1", "parameters", ".*firstStart=([0-9]+).*")
    
  • 提取thirdStop:
    label_replace(default_jenkins_builds_build_duration_milliseconds{jenkins_job="summaryTime"}, "thirdStop", "$1", "parameters", ".*thirdStop=([0-9]+).*")
    
  • 计算时长:将两个提取出的标签转为数值后相减,示例:
    (label_replace(default_jenkins_builds_build_duration_milliseconds{jenkins_job="summaryTime"}, "thirdStop", "$1", "parameters", ".*thirdStop=([0-9]+).*") != 0)
    - (label_replace(default_jenkins_builds_build_duration_milliseconds{jenkins_job="summaryTime"}, "firstStart", "$1", "parameters", ".*firstStart=([0-9]+).*") != 0)
    
    注意:这种方式依赖参数格式的稳定性,若参数顺序或格式变更会导致查询失效。

3. 在summaryTime Job中主动推送自定义指标

如果以上两种方式都不适用,可以在summaryTime Job里用脚本直接向Prometheus Pushgateway推送自定义部署时长指标:

# 计算毫秒转秒的部署时长
duration=$(( (thirdStop - firstStart) / 1000 ))
# 推送到Pushgateway
echo "pr_deployment_duration_seconds{pr=\"$PR\", job=\"summaryTime\"} $duration" | curl --data-binary @- http://pushgateway:9091/metrics/job/summaryTime/pr/$PR

这样就能在Prometheus中直接获取到pr_deployment_duration_seconds指标,更灵活可控。

内容的提问来源于stack exchange,提问作者Frendom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 00:03:27