Как сравнить серию метрик с одинаковым числом в названии метрики

Представьте, что у нас есть следующие 6 показателей:

metric1-value      metric1-value-expected
metric2-value      metric2-value-expected
metric3-value      metric3-value-expected

И мы хотим создать выражение для сравнения этих показателей на основе номера имени. Это следующее:

metric1-value == metric1-value-expected
metric2-value == metric2-value-expected
metric3-value == metric3-value-expected

Что-то вроде этого:

 {__name__=~"metric.*-value"} == {__name__=~"metric.*-value-expected"}

Но я получил следующую ошибку:

Ошибка при выполнении запроса: соответствие "многие ко многим" запрещено: соответствующие метки должны быть уникальными с одной стороны.

Есть ли способ сделать это в файле правил Prometheus?


person arodrprope    schedule 30.07.2019    source источник


Ответы (2)


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

Канонический способ сделать это - использовать конфигурацию metric_relabel_configs.

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

Извлечение идентификатора будет

label_replace({__name__=~"metric.*-value"},"id","$1","__name__","(metric.*)-value")

Затем вы можете указать, по каким критериям выполняется сравнение.

label_replace({__name__=~"metric.*-value"},"id",...) == on(id) label_replace({__name__=~"metric.*-expected"},"id",...)
person Michael Doubez    schedule 30.07.2019

На самом деле проблема была больше, есть метрики с таким же названием, но с разными ярлыками:

metric1-value{host="host1"}      metric1-value-expected{host="host1"}
metric1-value{host="host2"}      metric1-value-expected{host="host2"}

metric2-value {host="host1"}     metric2-value-expected{host="host1"}
metric2-value {host="host2"}     metric2-value-expected{host="host2"}

metric3-value {host="host1"}     metric3-value-expected{host="host1"}
metric3-value{host="host2"}      metric3-value-expected{host="host2"}

Поскольку создание метки «id» с первой частью метрики, например: «metric1», вызовет ту же ошибку из-за определения нескольких имен метрик.

Ошибка при выполнении запроса: соответствие "многие ко многим" запрещено: соответствующие метки должны быть уникальными с одной стороны.

Я создал внешнюю метку с именем «id» с первой частью метрики и именем хоста, например: «metric1_host2». Для этого я вложил label_join в label_replace.

label_join(label_replace({__name__=~"metric.*-value"}, "id", "$1", "__name__", "(metric.*)-value"), "id", "_", "id", "host") != label_join(label_replace({__name__=~"metric.*-expected"}, "id", "$1", "__name__", "(metric.*)-expected"), "id", "_", "id", "host")

Следовательно, метрика будет такой и будет уникальной:

metric1-value{host="host2" id="metric1_host2"}
person arodrprope    schedule 31.07.2019
comment
Обратите внимание, что предложение ON может принимать более одной метки. == on(id,host) должен достичь того, что вы ищете. - person Michael Doubez; 31.07.2019
comment
Я могу добиться того же поведения, но не вижу имени показателя (name), если использую оператор «on». Следовательно, результат использования оператора 'on' будет: {id="metric1", host="host2"} И я хотел бы получить следующий результат: metric1-value{id="metric1", host="host2"} - person arodrprope; 01.08.2019