在 Prometheus 中,有没有一种方法可以仅使用一个查询来检测主机是否停止发出特定指标?

In Prometheus, is there a way to detect if a particular metric stops being emitted broken down by host using just one query?

我的用例是我有一堆设备,我只想创建一个警报,在设备突然离线时通知我。如果我为每台设备创建一个警报,我可以使用 absent(),但我只想要一个警报来告诉我哪个设备离线。

在 prometheus 中,您只能使用存在的指标,而不能使用不存在的指标。不过,您可以时移查询并使用它。

您可以尝试以下方法

(
   someMetric{} 
   unless
   (someMetric{} - 100000) offset 3m
) < 50000

括号中的表达式将 return 只有一个值,如果只有一个部分 return 是一个值。因此只有当指标出现时它才会 return 值(在这种情况下只有第一部分 return 是一个值而第二部分没有)或指标消失(这里第二部分存在)。通过减去一个任意值,您可以区分这两种情况,因此如果您 return 一个值在 'normal' 值范围内,您就知道该指标出现了。当你得到一个非常小的数字时,你就知道指标消失了。基于此,您可以在该表达式上创建一个警报 returning 一个非常小的值(如果需要,调整该值)。

注意:此警报只会持续 3 分钟(在此示例中),因为表达式将不再 return 3 分钟后的值。但是,如果您将偏移量增加到 1h,该指标将保持更长的时间,您可能会检测到某个指标仅在一段时间后消失,并且警报只会持续到该指标存在为止。

情况 1:指标存在时间长于偏移量

metric             ---------------------

offsetted metric               ---------------------           

alert                                   xxxxxxxxxxxx  

情况 2:指标仅存在很短的时间

metric             -----

offsetted metric               -----           

alert                          xxxxx