借助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分别拆解为指标标签,最终指标格式会变成:
这样在Grafana中就能直接用default_jenkins_builds_build_duration_milliseconds{jenkins_job="summaryTime", PR="PR-1234", firstStart="1691752322966", thirdStop="1691752401187"}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
相关产品推荐
相关产品推荐

