如何重构Prometheus查询以准确计算Jenkins任务构建时长增幅
解决方案
修复“成功构建平均时长”计算的稀释问题
原查询的核心错误是先对全量样本计算平均,再过滤成功构建的时间序列,导致平均结果包含非成功构建的无效数据。正确逻辑是先过滤成功构建的时长指标,再计算时间范围内的平均值:
最终查询(检测当前成功构建时长超180天平均50%)
default_jenkins_builds_last_build_duration_milliseconds{default_jenkins_builds_last_build_result_ordinal="0"} > 1.5 * avg_over_time(default_jenkins_builds_last_build_duration_milliseconds{default_jenkins_builds_last_build_result_ordinal="0"}[180d])
实现“当前与上一次成功构建时长差值”并解决NaN问题
如果需要对比当前与上一次成功构建的时长差,同时避免NaN导致的图表断裂,可结合last_over_time(获取最近成功构建时长)和keep_last_value(填充NaN)实现:
1. 获取当前最近一次成功构建时长(自动补全NaN)
keep_last_value(last_over_time(default_jenkins_builds_last_build_duration_milliseconds{default_jenkins_builds_last_build_result_ordinal="0"}[24h]))
2. 获取上一次成功构建时长(补全NaN)
keep_last_value(last_over_time(default_jenkins_builds_last_build_duration_milliseconds{default_jenkins_builds_last_build_result_ordinal="0"}[24h] offset 24h))
3. 计算时长差值(无历史数据时按0处理)
keep_last_value(last_over_time(default_jenkins_builds_last_build_duration_milliseconds{default_jenkins_builds_last_build_result_ordinal="0"}[24h])) - (keep_last_value(last_over_time(default_jenkins_builds_last_build_duration_milliseconds{default_jenkins_builds_last_build_result_ordinal="0"}[24h] offset 24h)) or vector(0))
关键细节
keep_last_value:Prometheus 2.27+版本支持,自动用最近的非NaN值填充缺失样本,保障图表连续性。- 时间范围
[24h]和偏移量offset 24h可根据你的Jenkins构建频率调整(比如高频构建可改为[1h] offset 1h)。 - 全程通过
default_jenkins_builds_last_build_result_ordinal="0"过滤成功构建样本,确保计算数据的有效性。
内容的提问来源于stack exchange,提问作者Thanos Mourtzoukos
相关产品推荐
相关产品推荐

