失踪警报 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])

不幸的是,如果一些匹配的时间序列消失,absentabsent_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

此警报在时间序列停止接收新样本后一小时内保持活动状态。可以通过更改方括号中的值来调整活动警报的持续时间。