失踪警报 series/data
Alert on missing series/data
我想了解当指标不再被抓取时如何让 Grafana 提醒我。
我在这个例子中使用的指标是 mongodb_instance_uptime_seconds
。当实例关闭时,不再生成指标,导致 Prometheus 中缺少指标。目前警报在 when last() query(A, 1m, now) < 600
触发。如您所见,目标是在正常运行时间低于 5 分钟时发出警报。这意味着我想提醒重启和停止,但是当一个实例出现故障时 Grafana 不会发出警报,因为 last()
值实际上并不存在,当实例出现故障超过 5 分钟时,它甚至不再报告。
关于如何前进的任何线索?
通常用于确定实例是否被成功抓取的指标是 up
。它由所有抓取作业自动生成,因此如果您想要对任何已关闭的抓取端点发出警报,只需使用查询 up == 0
,它将显示最后一次抓取不成功的所有端点。如果您只想针对此特定端点发出警报,请使用像 up{instance="mongodb.foo.com",job="mongo"} == 0
这样的标签
如果您有兴趣为此使用 Alertmanager 而不是 Grafana,规则如下:
groups:
- name: General
rules:
- alert: Endpoint_Down
expr: up == 0
for: 5m
labels:
severity: critical
annotations:
summary: "Exporter is down: {{ $labels.instance }}"
description: "The endpoint {{ $labels.instance }} is not able to be scraped by Prometheus."
如果你事先知道监控时间序列的所有标签,那么可以使用absent_over_time函数进行告警。例如,当指标 mongodb_instance_uptime_seconds{instance="foo",job="bar"}
在过去 5 分钟内没有新样本时,以下查询 returns non-empty 结果(例如警报):
absent_over_time(mongodb_instance_uptime_seconds{instance="foo",job="bar"}[5m])
不幸的是,如果一些匹配的时间序列消失,absent 和 absent_over_time 函数都不能 return 多个结果。例如,如果有两个时间序列:
mongodb_instance_uptime_seconds{instance="foo"}
mongodb_instance_uptime_seconds{instance="bar"}
并且这些时间序列中只有一个停止接收新样本(假设,mongodb_instance_uptime_seconds{instance="foo"}
不再接收新样本,而 mongodb_instance_uptime_seconds{instance="bar"}
继续接收新样本),则以下查询不会 return mongodb_instance_uptime_seconds{instance="foo"}
的预期警报:
absent(mongodb_instance_uptime_seconds)
absent_over_time(mongodb_instance_uptime_seconds[5m])
Prometheus 还没有提供这个问题的解决方案,而 VictoriaMetrics provides lag() 功能,可以在这种情况下用于警报。例如,当至少一个具有 mongodb_instance_uptime_seconds
名称的时间序列在过去一小时内停止接收新样本超过 5 分钟时,以下 MetricsQL 查询警报(例如 returns non-empty 结果) :
lag(mongodb_instance_uptime_seconds[1h]) > 5m
此警报在时间序列停止接收新样本后一小时内保持活动状态。可以通过更改方括号中的值来调整活动警报的持续时间。
我想了解当指标不再被抓取时如何让 Grafana 提醒我。
我在这个例子中使用的指标是 mongodb_instance_uptime_seconds
。当实例关闭时,不再生成指标,导致 Prometheus 中缺少指标。目前警报在 when last() query(A, 1m, now) < 600
触发。如您所见,目标是在正常运行时间低于 5 分钟时发出警报。这意味着我想提醒重启和停止,但是当一个实例出现故障时 Grafana 不会发出警报,因为 last()
值实际上并不存在,当实例出现故障超过 5 分钟时,它甚至不再报告。
关于如何前进的任何线索?
通常用于确定实例是否被成功抓取的指标是 up
。它由所有抓取作业自动生成,因此如果您想要对任何已关闭的抓取端点发出警报,只需使用查询 up == 0
,它将显示最后一次抓取不成功的所有端点。如果您只想针对此特定端点发出警报,请使用像 up{instance="mongodb.foo.com",job="mongo"} == 0
如果您有兴趣为此使用 Alertmanager 而不是 Grafana,规则如下:
groups:
- name: General
rules:
- alert: Endpoint_Down
expr: up == 0
for: 5m
labels:
severity: critical
annotations:
summary: "Exporter is down: {{ $labels.instance }}"
description: "The endpoint {{ $labels.instance }} is not able to be scraped by Prometheus."
如果你事先知道监控时间序列的所有标签,那么可以使用absent_over_time函数进行告警。例如,当指标 mongodb_instance_uptime_seconds{instance="foo",job="bar"}
在过去 5 分钟内没有新样本时,以下查询 returns non-empty 结果(例如警报):
absent_over_time(mongodb_instance_uptime_seconds{instance="foo",job="bar"}[5m])
不幸的是,如果一些匹配的时间序列消失,absent 和 absent_over_time 函数都不能 return 多个结果。例如,如果有两个时间序列:
mongodb_instance_uptime_seconds{instance="foo"}
mongodb_instance_uptime_seconds{instance="bar"}
并且这些时间序列中只有一个停止接收新样本(假设,mongodb_instance_uptime_seconds{instance="foo"}
不再接收新样本,而 mongodb_instance_uptime_seconds{instance="bar"}
继续接收新样本),则以下查询不会 return mongodb_instance_uptime_seconds{instance="foo"}
的预期警报:
absent(mongodb_instance_uptime_seconds)
absent_over_time(mongodb_instance_uptime_seconds[5m])
Prometheus 还没有提供这个问题的解决方案,而 VictoriaMetrics provides lag() 功能,可以在这种情况下用于警报。例如,当至少一个具有 mongodb_instance_uptime_seconds
名称的时间序列在过去一小时内停止接收新样本超过 5 分钟时,以下 MetricsQL 查询警报(例如 returns non-empty 结果) :
lag(mongodb_instance_uptime_seconds[1h]) > 5m
此警报在时间序列停止接收新样本后一小时内保持活动状态。可以通过更改方括号中的值来调整活动警报的持续时间。