Напиши на 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
  1. count(up == 1) > 1: Эта часть запроса проверяет, что количество инстансов, у которых значение метрики up равно 1, больше одного. Если это условие выполняется, результат будет булевым значением true.

  2. and on(instance): Оператор and используется для комбинирования двух выражений. on(instance) указывает, что объединение должно происходить по метке instance, что позволяет объединить результаты двух частей запроса на основе метки instance.

  3. up == 1: Эта часть запроса проверяет, что значение метрики up равно 1 для каждого инстанса.

Однако, в PromQL не поддерживается прямое объединение булевых значений и метрик. Поэтому исправленный запрос будет таким:

up == 1 and ignoring(instance) count(up == 1) > 1

Этот запрос работает следующим образом:

  1. up == 1: Проверяет, что значение метрики up равно 1 для каждого инстанса.
  2. count(up == 1) > 1: Проверяет, что количество инстансов, у которых значение метрики up равно 1, больше одного.
  3. ignoring(instance): Указывает, что при объединении результатов нужно игнорировать метку instance.

В результате, запрос возвращает значение метрики up для каждого инстанса, у которого значение up равно 1, если общее количество таких инстансов больше одного.

Запрос верный.
Спасибо

Пожалуйста, рад был помочь! Если у тебя возникнут еще вопросы по PromQL или другим темам, не стесняйся обращаться. Удачи!