如何忽略 PromQL 查询中丢失的数据点?

How to ignore missing datapoints in PromQL query?

我正在尝试执行复杂的 promql 查询。 基本上我想将过去 1 小时的平均值与过去 3 天的同一小时(平均值)进行比较:

rate(processing_time_sum[1h]) / rate(processing_time_count[1h]) / (
rate(processing_time_sum[1h] offset 1d) / rate(processing_time_count[1h] offset 1d) +
rate(processing_time_sum[1h] offset 2d) / rate(processing_time_count[1h] offset 2d) +
rate(processing_time_sum[1h] offset 3d) / rate(processing_time_count[1h] offset 3d) +
)/3

我的问题是,如果前几天(周六、周日和节假日)中有一天(或多天)没有数据,那么整个查询都会出现 "No data points found" 错误。 我希望能够忽略缺失的日期,或者使用具有数据点的最后一天。

一般来说,在 PromQL 中做类似 a + b 的事情时,其中 b 可能会丢失一些 a 的标签组合,您可以将其写为:

a + (b or a * 0)

或者,在您的情况下,由于您使用的是除法和多个 b 指标(实际上):

a / ((b1 or a) + (b2 or a) + (b3 or a)) * 3

但是缺少的 b 指标越多,"normal" 您的 a 指标就会更像。 (例如,如果前 3 天中的任何一天都没有值,则结果将为 1。)

或者,如果您只是想要最后一天的数据点(同样,如果所有 b 都缺失,则回退到 a):

a / (b1 or b2 or b3 or a)

此任务可以使用 MetricsQL 完成,因为它允许将多个参数传递给聚合函数,例如求和 - 参见 these docs。如果某些参数为空,则跳过它们:

rate(processing_time_sum[1h]) / rate(processing_time_count[1h]) / sum(
  rate(processing_time_sum[1h] offset 1d) / rate(processing_time_count[1h] offset 1d),
  rate(processing_time_sum[1h] offset 2d) / rate(processing_time_count[1h] offset 2d),
  rate(processing_time_sum[1h] offset 3d) / rate(processing_time_count[1h] offset 3d),
) without() /3

如您所见,a + b + c 已替换为 sum(a, b, c) without()。需要 without() 修饰符才能保留 abc 时间序列的原始标签。