计算与特定模式匹配的给定时间范围内的 Prometheus 指标

Count Prometheus metrics of a given time frame matching a certain pattern

考虑一个任务运行器的 Prometheus Exporter,它将成功的重复作业的指标输出为

sometool_jobs_succeeded{job_name="joba-123456"} 1
sometool_jobs_succeeded{job_name="joba-987654"} 1
sometool_jobs_succeeded{job_name="jobx-411235"} 1

如果 joba 类型的作业在过去 2 小时内没有成功,我想设置 Prometheus 警报。

我的第一个方法是使用 Alert 表达式

sum(increase(sometool_jobs_succeeded{job_name=~"^joba-.+"}[2h])) < 1

但是由于从来没有 sometool_jobs_succeeded 类型的指标具有 1 以外的值,因此 increase 无法正常工作(如果指标只是 出现).

如何实现我的查询?是否有可能 count 范围向量的结果度量(独立于它们的 value)?

你可以试试这样的东西:

count( 
  sometool_jobs_succeeded{job_name=~"joba-.+"} unless (sometool_jobs_succeeded{job_name=~"joba-.+"} offset 2h)                                                                                                                                                                   
)

这将 return 现在 2 小时前不存在的 joba 实例计数

我会考虑是否可以修改导出器或应用程序,以便它们发出类似

的内容
sometool_jobs_succeeded{job_type="joba"} 8

所以每个工作类型一个普通计数器。这在 Prometheus 中使用会更自然(并且更适合其数据模型)。它可以通过 increase 调用进行处理,它会处理任何重置等。

请注意,将唯一 ID 作为标签值不符合建议。 具有大基数的标签可能会导致问题(尽管除非规模真的很大,否则它可能可以处理)。