普罗米修斯警报中缺少标签

Posted

技术标签:

【中文标题】普罗米修斯警报中缺少标签【英文标题】:Missing labels in prometheus alerts 【发布时间】:2021-07-20 05:42:17 【问题描述】:

我在使用 Prometheus 警报规则时遇到问题。我设置了各种 cAdvisor 特定警报,例如:

- alert: ContainerCpuUsage
  expr: (sum(rate(container_cpu_usage_seconds_total[3m])) BY (instance, name) * 100) > 80
  for: 2m
  labels:
    severity: warning
  annotations:
    title: 'Container CPU usage (instance  $labels.instance )'
    description: 'Container CPU usage is above 80%\n  VALUE =  $value \n  LABELS:  $labels '

满足条件时,我可以在 Prometheus 的“警报”选项卡中看到警报,但是缺少一些标签,因此警报管理器无法通过 Slack 发送通知。具体来说,我将自定义“env”标签附加到每个目标:

 
  "targets": [
   "localhost:8080",
  ],
  "labels": 
   "job": "cadvisor",
   "env": "production",
   "__metrics_path__": "/metrics"
  
 

但是当基于 cadvisor 指标的警报触发时,标签是:警报名称、实例和严重性 - 没有工作标签,没有环境标签。 来自其他出口商(例如节点出口商)的所有其他警报都可以正常工作并且标签存在。

【问题讨论】:

【参考方案1】:

这是由于您使用了sum 函数;它收集了所有存在的时间序列并将它们添加到摸索BY (instance, name)。如果您在 Prometheus 中运行相同的查询,您会看到 sum 只留下了分组标签:

instance="foo", name="bar"    135.38819037447163

avgmaxmin 等其他聚合方法以相同的方式工作。要恢复标签,只需将env 添加到分组列表中:by (instance, name, env)

【讨论】:

谢谢!我已将我的查询修改为:(sum(rate(container_cpu_usage_seconds_totalname!=""[3m])) BY (instance, name,env) * 100) > 80,它看起来工作正常。这个查询好吗?老实说,我并不完全理解这一点:“但这样你将获得每个环境每个名称的每个实例的 CPU 利用率。” - 为什么这是个问题? 假设您在一台机器(实例)上有一个带有env=prod 的容器和另一个带有env=dev 的容器。通过运行查询,您将获得env=devenv=prod 的不同CPU 利用率。由于您这样做是为了只有 env=prod 可以触发警报,所以如果 env=dev 占用了机器上的所有 CPU 资源,您将不会收到通知。换句话说,机器 CPU 利用率将在各种env 标签值之间进行分配。这是否是一个问题取决于事情在你的环境中是如何运行的,如果在生产机器上除了prod 之外没有其他env,那么这没关系。 感谢您解释这个问题,现在一切都清楚了。在我的设置中,不同环境中的容器是完全分开的,所以谢天谢地,这没关系!但是,如果此设置发生更改,我会牢记这一点。再次感谢您对此进行彻底的解释! 哦还有一件事@anemyte,此环境标签附加到特定目标(即cadvisor)而不是容器本身。如果我运行两个具有不同 env 标签值的 cadvisor 容器,这将成为一个问题。至少我是这么理解的。 @dywan666 如果它在生产实例的作业配置中明确定义,那么我想应该没问题。

以上是关于普罗米修斯警报中缺少标签的主要内容,如果未能解决你的问题,请参考以下文章

在普罗米修斯的标签中使用标识。标签的最佳实践

普罗米修斯中的警报管理器给出退出代码错误并忽略普罗米修斯中警报管理器的分配

普罗米修斯中的警报管理器未启动

如何在普罗米修斯中对具有高基数的指标发出警报

如何获取警报计数,在普罗米修斯上一周警报触发了多少次

我们如何编写警报规则与普罗米修斯警报规则的先前值进行比较