如何通过Prometheus查询计算Jenkins作业构建时间增加率

40次阅读
没有评论

问题描述

使用Prometheus Metrics插件从Jenkins中提取统计信息。他创建了一个PromQL查询,以检查Jenkins作业的构建时间是否相对于平均成功构建时间增加了50%:

default_jenkins_builds_last_build_duration_milliseconds > 1.5 * (avg_over_time(default_jenkins_builds_last_build_duration_milliseconds[180d]) and default_jenkins_builds_last_build_result_ordinal == 0)

然而,这个查询存在一个问题。随着时间的推移,结果会因为查询不断将时间序列中的每个值添加到总平均结果中而变得稀释。可能存在一些值没有变化,但它们不断累加。

用户原本希望创建一个查询,该查询计算当前成功构建时间与上一次成功构建时间之间的“增量”,但似乎没有一个表示上一次构建的度量标准(或者他找不到)。因此,他使用了average_over_time

用户还尝试了使用偏移修饰符来计算上一分钟的增量(因为Prometheus每1分钟抓取一次Jenkins导出器),但问题是有时时间序列会返回NaN结果,无法计算每个构建的时间增量。用户原本期望在图表中看到一个有些波动的线,以反映构建时间的增加或减少,但NaN值破坏了这个图表。

用户想知道如何重构这个查询,以便得到预期的结果。

解决方案

在解决这个问题之前,请确保你已经理解了PromQL的基本概念和语法。以下是可能的解决方案:

方案1:使用irate函数

要计算增加率,可以使用Prometheus内置的irate函数。irate函数计算两个时间序列样本之间的增长速率。使用这个函数,你可以计算当前成功构建时间与前一次成功构建时间之间的增长速率。

以下是如何使用irate函数重构查询的示例:

irate(default_jenkins_builds_last_build_duration_milliseconds{default_jenkins_builds_last_build_result_ordinal == 0}[1h]) > 0.5

在上面的示例中,我们使用irate函数计算了一个时间范围为1小时的时间序列的增长速率,并将其与0.5比较,以检查是否超过了50%的增长。

方案2:使用delta函数

类似地,你也可以使用delta函数来计算时间序列之间的差异。delta函数计算两个时间序列样本之间的差值。这将帮助你计算当前成功构建时间与前一次成功构建时间之间的差异。

以下是如何使用delta函数重构查询的示例:

delta(default_jenkins_builds_last_build_duration_milliseconds{default_jenkins_builds_last_build_result_ordinal == 0}[1h]) > 0.5

在上面的示例中,我们使用delta函数计算了一个时间范围为1小时的时间序列的差值,并将其与0.5比较,以检查是否超过了50%的增长。

方案3:使用changes函数

如果你只关心值是否发生了变化,可以使用changes函数。changes函数计算在指定时间范围内值发生变化的次数。

以下是如何使用changes函数重构查询的示例:

changes(default_jenkins_builds_last_build_duration_milliseconds{default_jenkins_builds_last_build_result_ordinal == 0}[1h]) > 0

在上面的示例中,我们使用changes函数计算了一个时间范围为1小时的时间序列中值发生变化的次数,然后将其与0比较,以确保至少发生了一次变化。

总结

通过使用iratedeltachanges函数,你可以重新构造查询,以计算Jenkins作业构建时间的增加率。根据你的需求和预期结果,选择合适的函数和时间范围进行查询。同时,记得始终监控你的查询结果,以确保获得准确的结果。

正文完