根据标签值沉默普罗米修斯警报/忽略标签中的警报

F. *_*dro 6 monitoring prometheus promql

太长了;博士

我在普罗米修斯中有一个名为“ignore”的标签,其值为“yes”:

metric_test{label1="label1",ignore="yes"} 1
Run Code Online (Sandbox Code Playgroud)

我想禁用带有此标签的任何指标的警报。我不想手动编辑 500 多个警报。警报不应出现在 prometheus GUI 中。

有没有一个解决方案可以本地执行此操作?


我有各种机器和服务,其指标是通过 kubernetes_exporter 或 node_exporter 等导出器收集的。

我有一个警报“正常运行时间”,当机器出现故障时会触发该警报。

所有机器都有此警报,警报如下:

- alert: Uptime
  expr: up{} == 0
  for: 2m
  labels:
    severity: critical
Run Code Online (Sandbox Code Playgroud)

有些机器我不关心。它们会在计划外的时间持续关闭,并且通常并不重要,因此我想将此类机器从上述警报中排除。

我发现有效的是修改上面的表达式,添加被忽略的机器:

- alert: Uptime
  expr: up{ignore!="yes"} == 0
  for: 2m
  labels:
    severity: critical
Run Code Online (Sandbox Code Playgroud)

假设我有一个我不关心的 kubernetes 命名空间,我可以添加namespace!="test",Prometheus 仍然会收集指标,但不会触发警报。

我发现它也可以通过在 expr 末尾添加来使用AND up{ignore!="yes"},同时保持表达式的其余部分不变。

惊人的!

此处讨论以下方法:禁用对特定主机的警报,同时对所有其他主机发出警报

但这种方法有一个问题,那就是随着添加的忽略规则越多,您必须添加的条件就越多。当然,您可以像上面讨论的那样将事物分组在一起,添加标签,enableAlert="true"以便每台机器都enableAlert="false"被忽略。这可以工作,但仍然需要手动工作,并且还需要为每个警报进行手动配置。

那么,让我们看看其他可能的解决方案:

重新贴标签

正如此处讨论的Prometheus 配置忽略 Kubernetes 中特定命名空间的指标抓取,当存在某个标签的值(例如 kubernetes 命名空间)时,可以删除指标。

请参阅上述讨论中的一个示例:

  relabel_configs:
  # This will ignore scraping targets from 'ignored_namespace_1', 
  # 'ignored_namespace_2', and 'ignored_namespace_N'.
  - source_labels: [__meta_kubernetes_namespace]
    action: drop
    regex: ignored_namespace_1|ignored_namespace_2|ignored_namespace_N
Run Code Online (Sandbox Code Playgroud)

这种方法的问题是这些指标将会丢失,这就是为什么这对于我的用例来说不是一个可行的解决方案。

另一个类似的线程在这里,官方文档在这里

空接收器

此解决方案在此讨论如何使用配置文件使 Prometheus Alertmanager 静音? 本质上,这涉及定义一个receiver: "null"警报管理器,并将警报路由到无。

这实际上起到了警报经理沉默的作用

类似的解决方案是在警报管理器上定义无限沉默并使用抑制规则(仍在上面的线程中讨论,此处的示例https://github.com/prometheus/alertmanager/blob/main/doc/examples/simple.yml

基于警报管理器的解决方案的缺点是警报仍然出现在 prometheus 中。这对我来说是一个主要的“禁忌”,因为我仍然经常查看 Web GUI 以查看是否一切正常,并且看到大量未发送的火灾并不容易处理。

自定义工具,prometheus-alert-overrider

现在,虽然我找不到其他解决方案,但这个问题已在这篇文章中进行了讨论,其中作者展示了一种在 dev kubernetes 环境中消除警报的不同方法。

他们编写了一个自定义预处理器来自动添加忽略规则,并继续使用本问题开头所示的原始方法,但将启用和覆盖关键字添加到普罗米修斯,这允许他们编写如下内容:

- alert: DisableKubeDev
  override: ["K8S.*"]
  enabled: false
  expr: '{kubernetes_cluster="kube-dev"}'
Run Code Online (Sandbox Code Playgroud)

以比以前更干净的方式禁用 kube-dev 集群上以 K8S 开头的所有警报。

该解决方案的缺点是它需要维护另一个项目,以及它自己的依赖项和更新。

上面的现在似乎是最好的解决方案,但是有没有可以直接在 Prometheus 中使用的本地解决方案或替代方案?我在官方文档上找不到任何内容。

上述工具看起来非常简单和紧凑,但寻求可以提供更高简单性或不同方法的本机或替代解决方案是有意义的。

谢谢!

mar*_*lex 0

由于您既不想丢失测试环境的指标,也不想看到使用它们创建的警报,因此您有一种选择:配置 Prometheus 不创建这些警报。

手动重写和使用 prometheus-alert-overrider 都会给出相同的结果:您会得到一组修改后的规则,稍后由 Prometheus 使用。

手动重写

如果,正如您在tl;drignore中所描述的,您在每个指标(或至少每个被忽略端点的指标)中都有一个标签,我认为手动重写是正确的方法。

只需运行

sed -z -r \
  's/(- alert:[^\n]+\n\s+expr: [^\n]+)/\1 unless on(ignore) up{ignore="yes"}/g' \
  rules.yml
Run Code Online (Sandbox Code Playgroud)

90%的重写工作已经完成。检查一些过度聚合的规则,这些规则在任何情况下都没有标签ignore- 手动重写它们,然后就可以开始了。

普罗米修斯警报覆盖者

如果您有一组更复杂的规则来忽略警报中的端点,您可能需要使用此项目。

可维护性

就您的愿望而言,这两种选择都不是很理想,并且将来都需要注意:

  • 如果您选择手动重写:您需要在添加新规则时不断意识到需要从规则中排除某些端点。但更糟糕的是可能发生的事情 - 您会收到一些过多的警报。
  • 如果您选择 prometheus-alert-overrider,您仍然需要编写规则(编写简单一点)并考虑到异常。您需要信任它产生的输出,因为在最坏的情况下,您无法在需要时获得警报。