背景
我们最近在对 Jenkins 的构建做一些监控,包括 build 时长、队列排队时长、构建结果(成功/失败/abort)等数据。
我们在 Jenkins Shared Library 中获取这些数据,然后通过 HTTP 请求的方式,回调给另外一个监控 Server。
Build 时长、构建结果(成功/失败/abort)等数据,相对好获取,在 Jenkins 的全局变量参考中,有相应的说明:
- 访问链接如下:http://localhost/job/test-job/pipeline-syntax/globals
- 注意,将 ${your-job} 替换成任意的 job 名,即可看到 Jenkins 自带的全局变量参考页面
全局变量中的 currentBuild 中,有 duration 和 result 字段,分别代表构建时长和构建结果。
但是对于排队时长,却没有找到相应的字段。于是这个监控数据一时半会儿还不好拿。
Metrics 插件
对于这个问题,Google 了下,在 Stack Overflow 上找到了答案:https://stackoverflow.com/a/31156114 。
如果你的 Jenkins 安装了Metrics 插件,那么这个数据是相对容易获取的。
这个插件是安装 Jenkins 时推荐安装的,如果你的 Jenkins 没有安装,可以参考插件首页:https://plugins.jenkins.io/metrics/ 。
安装这个插件后,可以在 build 的详情页中看到排队时间、构建时间等数据,如下图:
其中红框中的 3.3 秒 waiting;
就是队列排队时间。
获取队列排队时间
通过 Metrics 插件,我们能看到队列排队时间了,接下来就是看怎么通过代码的方式获取到这个时间了。
Jenkins 提供了 2 中获取队列排队时间的方式:
- rest api 方式
- groovy script 方式
下面将分别介绍。
Rest Api 方式
访问构建详情页的 /api/json,接口,比如:http://localhost/job/test-job/14/api/json?pretty=true&depth=2 ,就可以看到相关的字段 queuingDurationMillis
:
{
"_class": "jenkins.metrics.impl.TimeInQueueAction",
"queuingDurationMillis": 3334
}
Groovy script 方式
Rest API 方式是可以获取到排队时间,但是这个 json 返回的数据结构比较复杂,而且返回的数据也很多。
Jenkins 提供了Groovy script 方式,而我们的 shared library 中,正好写的是 Groovy Script,所以我们用这种方式。
代码如下:
def build = currentBuild.rawBuild
def action = build.getAction(jenkins.metrics.impl.TimeInQueueAction.class)
def queuingDurationMillis = action.getQueuingDurationMillis()
println("queuingDurationMillis: " + queuingDurationMillis)
可以看到, Groovy Script 的方式,也是去 metrics 插件中获取的数据。
结束语
好了,以上就是 Jenkins 获取构建队列排队时间 queueDuration 的方法,如果想探讨更多关于 Java 和 Jenkins 的技术,欢迎与我联系。
我是梅小西,最近在某东南亚电商公司做 DevOps 的相关事情。从本期开始,将陆续分享基于 Jenkins 的 CI/CD 工作流,包括 Jenkins On k8s 等。
如果你对 Java 或者 Jenkins 等感兴趣,欢迎与我联系,微信:wxweven(备注 DevOps)
本文由博客群发一文多发等运营工具平台 OpenWrite 发布