#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 для захвата событий. Которая пока работает нормально. Но выражение выглядит очень загадочным.