Серия захватов Prometheus, где метка соответствует сегодняшней дате

#prometheus #prometheus-alertmanager #promql

#prometheus #prometheus-alertmanager #promql

Вопрос:

У меня есть серия, которая выглядит следующим образом.

 events{batch=20200818-00, stage=1} 10
events{batch=20200818-10, stage=1} 10
events{batch=20200818-20, stage=1} 10
events{batch=20200818-10, stage=2}  9
events{batch=20200818-20, stage=2}  8
events{batch=20200818-30, stage=2} 10
  

Где у нее есть метка batch , состоящая из даты и часа. Я хочу установить оповещение, которое срабатывает, если общее количество событий на сегодняшний день на этапе 2 больше, чем на этапе 1

Как я могу отфильтровать серию на основе time ()? В Grafana это выглядит просто, когда вы можете интерполировать дату и использовать регулярное выражение для сопоставления метки. Но настройка и оповещение о таком состоянии выглядят нетривиальными. Пожалуйста, помогите.

Ответ №1:

В настоящее время в Prometheus нет способа пересечь метку / значение. Но у вас где-то есть метрика, указывающая дату дня в метке, и используйте ее для фильтрации ваших данных.

Использование показателя «сегодня»

Ее создание зависит от ваших существующих компонентов: это может быть сделано в текстовом файле node_exporter или в правиле записи, которое вы обновляете каждый день:

 today{date="20200818"} 1
  

И использование повторной маркировки метрик (либо в конфигурации, либо с помощью label_replace()),

 label_replace(events, "date", "$1", "batch", "([0-9] )-.*")
  

вы получаете аналогичную метку, связанную с вашей метрикой:

 events{batch=20200818-00, date=20200818, stage=1} 10
  

Затем вы можете отфильтровать серию с помощью :

 label_replace(events, "date", "$1", "batch", "([0-9] )-.*") AND ON(date) today
  

Избегайте дублирования показателей

В полночь следует учесть небольшой нюанс: предыдущая today метрика исчезнет только через 5 минут, когда она станет устаревшей. Вы можете обойти это, создав вчерашнюю метку, но с другим значением:

 today{date="20200817"} 0
today{date="20200818"} 1
  

И выражение становится:

 label_replace(events, "date", "$1", "batch", "([0-9] )-.*") AND ON(date) today == 1
  

ПРИМЕЧАНИЕ: если у вас есть метрика, указывающая временную метку события, вы можете использовать ее для определения того, что происходит сегодня (это то, что обычно делается с помощью пакета)

Комментарии:

1. Спасибо за ваш подробный ответ. У меня есть другая метрика, которую я выбираю на основе скаляра (day_of_month (vector (time()))) и скаляра (year (vector (time()))), который дает мне ту же метку, а затем использует label_join для захвата событий. Которая пока работает нормально. Но выражение выглядит очень загадочным.