Как получить минимум две метрики в PromQL?

Я ищу что-то похожее на функцию SQL LEAST ().
Поскольку существуют бинарные операторы (и четко определенное поведение сопоставления), можно было бы ожидать, что будет также min / max, но не удалось найти такие функции .

Я знаю, что это достижимо с использованием регулярного выражения (т.е. min(__name__=~"a|b")), но хотел бы по возможности избежать подобных взломов.


person Paul Oyster    schedule 02.05.2019    source источник
comment
С помощью MetricsQL это можно сделать с помощью min(a, b). Я не уверен, возможно ли это с помощью PromQL.   -  person valyala    schedule 27.05.2021


Ответы (2)


Я почти уверен, что это наиболее эффективный способ сделать это. Если вы хотите избежать регулярных выражений, вы можете написать его как:

a < b or b

Но вычисления таким образом могут оказаться более дорогостоящими. (Если, конечно, вы не использовали правила записи вместо min(a) и min(b) напрямую. А может быть, даже тогда. Вам просто нужно будет протестировать это самостоятельно.)

person Alin Sînpălean    schedule 06.05.2019
comment
Я не понимаю, как это выражение дало бы наименьшее (а, б) - person Paul Oyster; 15.05.2019
comment
Извините, выражение было неправильным. Исправлено сейчас. Вам вообще не нужен оператор min. min создаст одно значение из вектора значений, что, вероятно, не то, что вы хотите здесь (если только не существует только один экземпляр каждой из двух ваших метрик, и в этом случае это может сработать). - person Alin Sînpălean; 16.05.2019
comment
Выражение работает так, что для каждой комбинации меток (например, {job="foo",instance="bar"}, {job="foo",instance="baz"} и т. Д.) Оно сравнивает значение a и b. Если a меньше, вы получите его значение. Если b меньше, то выражение a < b не вернет ничего для этой конкретной комбинации меток, но or b вернет значение b. - person Alin Sînpălean; 16.05.2019
comment
Почему a < b возвращает вместо логического? - person Paul Oyster; 21.05.2019
comment
RTFM: prometheus.io/docs/prometheus/latest/querying / операторы / - person Alin Sînpălean; 21.05.2019
comment
Я предполагаю, что вы намеревались сформулировать математическую формулу для минимального значения двух скаляров, и правильное представление таково: синтаксис 1: min {a, b} = {a if a ‹= b, b if a› b} синтаксис 2 : if (a ‹= b) return a else return b синтаксис 3: a‹ = b? а: б - person trinity; 19.05.2021

Здесь необходимо задать вопрос: как вообще сравнить два вектора?

Скаляры сопоставимы, но векторы в целом - нет. Если вы хотите сравнить их, вы должны определить математические показатели, с помощью которых они могут быть измерены.

Нужен массив сопоставимых элементов, чтобы определить среди них минимум. Поэтому функция min в Prometheus имеет не более одного аргумента. Этот единственный аргумент на самом деле представляет собой список сопоставимых элементов.

Например, вы можете попробовать это:

  1. сначала выполните что-нибудь это:
(count(up{squad=~"XYZ"}) by(env))

Для меня набор результатов выглядит так (и, что более важно, они сопоставимы):

{env="dev"}         61
{env="preprod"}     39
{env="prod"}        39

А затем, когда я выполню это:

max((count(up{squad=~"XYZ"}) by(env)))

Получаю результат:

{}              61

Чего и следовало ожидать.

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

person trinity    schedule 19.05.2021