Эквивалент оператора PromQL if then

У меня есть простой запрос PromQL, который выполняет подсчет:

sum(up{container_name="my-container",environment_name="$env"})

Это часть панели управления Grafana, позволяющая выбрать $ {env} из раскрывающегося меню.

Я хотел бы выполнять разные запросы в зависимости от среды.

Как мне построить что-то подобное в PromQL:

if ${env} == 'dev' or ${env} == 'integration':
  if sum(up{container_name="my-container",environment_name="$env"}) == 1:
    sum(up{container_name="my-container",environment_name="$env"}) + 1
  else:
    sum(up{container_name="my-container",environment_name="$env"})
else:
  sum(up{container_name="my-container",environment_name="$env"})

Цель состоит в том, чтобы ложно завышать счетчик, чтобы активировать порог работоспособности на панели состояния RAG в средах, в которых работают отдельные контейнеры.


person SnazzyBootMan    schedule 05.03.2021    source источник


Ответы (1)


Вы можете запросить это так:

(
   sum(up{container_name="my-container", environment_name=~"dev|integration", environment_name="$env"}) + 1 
   AND
   (sum(up{container_name="my-container", environment_name=~"dev|integration", environment_name="$env"} == 1)
)
OR
sum(up{container_name="my-container", environment_name=~"dev|integration", environment_name="$env"}) != 1
OR
sum(up{container_name="my-container", environment_name="prod", environment_name="$env"})
OR
on() vector(0)

это вернет количество экземпляров, увеличенное на единицу, когда количество экземпляров равно 1 (это то, что делает and) и пользователь выбрал среду разработки или интеграции. or будет означать сразу три метрики, но из-за запроса и выбора пользователей может быть возвращена только одна метрика.

person Jens Baitinger    schedule 08.03.2021
comment
Это действительно интересно - это ~ a содержит специальный символ? Кажется, выдает ошибку синтаксического анализа в Grafana. - person SnazzyBootMan; 08.03.2021
comment
извини, я только что починил. оператор = ~, а не ~ =. это означает, что соответствует регулярному выражению - person Jens Baitinger; 08.03.2021
comment
Пожалуйста, не извиняйтесь, без набора данных для проверки это так сложно. Ваша помощь была неоценимой и позволила мне заставить запрос работать, но у меня есть пара вопросов. env = следует читать environment_name, поскольку $ env - это переменная Grafana, поэтому не может использоваться в PromQL (извините, я не понял этого). В строке 7 отсутствуют некоторые детали в начале (я предполагаю, что это {container_name = my-container,). И какова цель строки 7? Наконец, в последней строке нужно было добавить сумму для нескольких возвратов, но требуется ли это единственная сумма разряда, может быть, также и строка 7? - person SnazzyBootMan; 09.03.2021
comment
в строке 7 отсутствует селектор container_name, это правда, исправляя это. его цель - это часть else в первых двух строках, поэтому создание метрики, когда первая не работает (потому что ее значение не равно 1), поэтому это может быть 0 или 2 и более. - person Jens Baitinger; 12.03.2021
comment
если у вас есть переменная env, объявленная в grafana, вы можете объявить use $ env в своих запросах, ссылаясь на ее значение - person Jens Baitinger; 12.03.2021
comment
Очень содержательные комментарии, спасибо. У меня была возможность внести некоторые незначительные изменения, которые решают проблемы, которые я обнаружил в связи с многократным возвратом результатов за период времени. Я добавлю их в качестве редактирования к вашему отличному ответу. - person SnazzyBootMan; 16.03.2021
comment
да, я думаю, что они все еще могут ошибаться. Это сложно, если вы не можете протестировать запросы и посмотреть, возвращают ли они ожидаемые результаты. - person Jens Baitinger; 16.03.2021
comment
К сожалению, я не могу добавить свое редактирование, так как очередь редактирования заполнена, но изменение, которое я собирался внести, было env = $ env в environment_name = $ env. Я также заключил каждый запрос в sum (). - person SnazzyBootMan; 25.03.2021