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

时间:2021-04-26 20:46:05

标签: monitoring prometheus prometheus-alertmanager cadvisor

我在使用 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 个答案:

答案 0 :(得分:1)

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

Element                                 Value
{instance="instance-id", name="foo"}    135.38819037447163

如果您只想在标签为 env=production 的容器超过阈值时收到警报,请将 env 添加到分组列表中。但通过这种方式,您将获得每个环境每个名称每个实例的 CPU 利用率。

可能有更好的方法,具体取决于您的监控设置和目标,也许您可​​以处理警报规则的静态值(连同 severity),甚至 external_labels { {3}},或者您可能需要修改 alertmanager 过滤警报的方式,以便即使没有丢失 env 或其他标签也能收到警报。