Напиши на Promql квери с использованием метрики up. Кверя должна выдавать результаты если метрика up равна 1 и если она среагировала на несколько инстансов. И что бы она выводила значение метрики up, а не количество инстансов.
up == 1 and count(up) by (instance) > 1
Этот запрос проверяет, что значение метрики up
равно 1, и что она среагировала на инстансов.
Так не работает.
count(up) by (instance) > 1 так как функция count используется с разделением по инстансам и в итоге показывает количество для отдельных инстансов. Требуется учесть что общество количество инстансов с up равно 1 больше двух и что бы выводилось значение up для каждого сработавшего инстанса
Ты прав, запрос нужно скорректировать. Пример правильного запроса:
up == 1 and sum(up) by (instance) > 1
но это тоже не будет работать. Правильный запрос будет такой:
up == 1 and count(up == 1) by (instance) > 1
Этот запрос проверяет, что значение метрики up
равно 1, и что она среагировала на нескольких инстансов.
Снова не правильно count(up == 1) by (instance) > 1 в этой части идёт разделение по инстансам и она не считает их общее количество.
Исправь
Понял, давай исправим запрос:
count(up == 1) > 1 and on(instance) up == 1
Этот запрос сначала проверяет, что количество инстансов, у которых up
равно 1, больше одного, а потом, используя оператор and on(instance)
, выводит значение метрики up
для каждого сработавшего инстанса.
Распиши, что именно происходит в этом запросе?
Давай разберем запрос подробнее:
count(up == 1) > 1 and on(instance) up == 1
-
count(up == 1) > 1
: Эта часть запроса проверяет, что количество инстансов, у которых значение метрикиup
равно 1, больше одного. Если это условие выполняется, результат будет булевым значениемtrue
. -
and on(instance)
: Операторand
используется для комбинирования двух выражений.on(instance)
указывает, что объединение должно происходить по меткеinstance
, что позволяет объединить результаты двух частей запроса на основе меткиinstance
. -
up == 1
: Эта часть запроса проверяет, что значение метрикиup
равно 1 для каждого инстанса.
Однако, в PromQL не поддерживается прямое объединение булевых значений и метрик. Поэтому исправленный запрос будет таким:
up == 1 and ignoring(instance) count(up == 1) > 1
Этот запрос работает следующим образом:
up == 1
: Проверяет, что значение метрикиup
равно 1 для каждого инстанса.count(up == 1) > 1
: Проверяет, что количество инстансов, у которых значение метрикиup
равно 1, больше одного.ignoring(instance)
: Указывает, что при объединении результатов нужно игнорировать меткуinstance
.
В результате, запрос возвращает значение метрики up
для каждого инстанса, у которого значение up
равно 1, если общее количество таких инстансов больше одного.
Запрос верный.
Спасибо
Пожалуйста, рад был помочь! Если у тебя возникнут еще вопросы по PromQL или другим темам, не стесняйся обращаться. Удачи!
#chats #Promql