Jenkins 获取构建队列排队时间 queueDuration

背景

我们最近在对 Jenkins 的构建做一些监控,包括 build 时长、队列排队时长、构建结果(成功/失败/abort)等数据。

我们在 Jenkins Shared Library 中获取这些数据,然后通过 HTTP 请求的方式,回调给另外一个监控 Server。

Build 时长、构建结果(成功/失败/abort)等数据,相对好获取,在 Jenkins 的全局变量参考中,有相应的说明:

全局变量中的 currentBuild 中,有 duration 和 result 字段,分别代表构建时长和构建结果。

但是对于排队时长,却没有找到相应的字段。于是这个监控数据一时半会儿还不好拿。

Metrics 插件

对于这个问题,Google 了下,在 Stack Overflow 上找到了答案:https://stackoverflow.com/a/31156114

如果你的 Jenkins 安装了Metrics 插件,那么这个数据是相对容易获取的。

这个插件是安装 Jenkins 时推荐安装的,如果你的 Jenkins 没有安装,可以参考插件首页:https://plugins.jenkins.io/metrics/

安装这个插件后,可以在 build 的详情页中看到排队时间、构建时间等数据,如下图:
file

其中红框中的 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 发布

posted @ 2022-05-21 11:49  wxweven  阅读(576)  评论(0编辑  收藏  举报