Отсутствующие ярлыки в предупреждениях Prometheus

У меня проблемы с правилами оповещения 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, метками являются: имя предупреждения, экземпляр и серьезность - без метки задания, без метки env. Все остальные оповещения от других экспортеров (например, узла-экспортера) работают нормально, и метка присутствует.


person dywan666    schedule 26.04.2021    source источник


Ответы (1)


Это связано с sum функцией, которую вы используете; он собрал все имеющиеся временные ряды и добавил их наощупь BY (instance, name). Если вы запустите тот же запрос в Prometheus, вы увидите, что sum остались только метки группировки:

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

Если вы хотите получать предупреждение только в том случае, если контейнеры с меткой env=production превышают пороговое значение, добавьте env в список группировки. Но таким образом вы получите загрузку ЦП для каждого экземпляра на имя для каждой среды.

Может быть лучший способ, в зависимости от ваших настроек и целей мониторинга, возможно, вы сможете иметь дело со статическим значением правила оповещения (вместе с severity) или даже с external_labels configuration, или, может быть, вам нужно изменить способ фильтрации предупреждений в alertmanager, чтобы вы получали предупреждение даже без отсутствующего env или другого ярлыка.

person anemyte    schedule 26.04.2021
comment
Спасибо! Я изменил свой запрос на это: (sum(rate(container_cpu_usage_seconds_total{name!=""}[3m])) BY (instance, name,env) * 100) > 80, и похоже, что он работает нормально. Это нормально? Честно говоря, я не совсем понимаю это: но таким образом вы получите загрузку ЦП на экземпляр для каждого имени для каждой среды. - почему это проблема? - person dywan666; 27.04.2021
comment
Предположим, у вас есть контейнер с env=prod и еще один с env=dev на одном компьютере (экземпляре). Выполнив запрос, вы получите отчетливую загрузку ЦП для env=dev и env=prod. Поскольку вы сделали так, что только env=prod может вызывать предупреждение, вы не получите уведомление, если env=dev заберет все ресурсы ЦП на машине. Другими словами, загрузка ЦП машины будет разделена между различными значениями меток env. Является ли это проблемой, зависит от того, как все работает в вашей среде, если на производственных машинах не может быть других env, кроме prod, тогда это нормально. - person anemyte; 27.04.2021
comment
@ dywan666 исчерпал лимит символов, см. выше. - person anemyte; 27.04.2021
comment
Спасибо, что объяснили этот вопрос, теперь все ясно. В моей настройке контейнеры в разных окружениях полностью разделены, так что, к счастью, это нормально! Однако я буду иметь это в виду на будущее, если эта настройка изменится. Еще раз спасибо за подробные объяснения! - person dywan666; 27.04.2021
comment
о, еще одна вещь @anemyte, эта метка env прикреплена к конкретной цели (которая является cadvisor), а не к самим контейнерам. Было бы проблемой, если бы я запустил два контейнера cadvisor с разными значениями меток env. По крайней мере, я так понимаю. - person dywan666; 27.04.2021
comment
@ dywan666, если он явно определен в конфигурации задания для производственных экземпляров, тогда, я полагаю, все будет в порядке. - person anemyte; 27.04.2021