У меня есть такое выражение promQL — sum(metric_1) by (label_1)
. Теперь я хочу отфильтровать вывод выражения, используя другую метку label_2
. Примерно так- (sum(metric_1) by (label_1, label_2)){label_2 = "some_value"}
. Но это не работает и выдает ошибку анализа. Как я могу этого добиться?
@markalex спасибо, что указал на это. Я обновил вопрос. Я думаю, что для простого выражения я могу фильтровать перед агрегированием, но для более сложных выражений, как я могу применить фильтр в конце?
Пример в вашем редактировании фактически обрабатывается путем фильтрации перед агрегированием. Я могу получить пример более сложного запроса из головы. Но если мы говорим о фильтрации на основе синтетических меток, представленных label_replace, вы можете использовать конструкцию and on(label)
.
разве для этого не потребуется еще один временной ряд после and on(label)
?
Ранее я видел, как эта операция выполнялась с помощью правил записи. Вы можете создать новую метрику с помощью агрегированного запроса вместе с любыми метками, из которых хотите выбрать.
Я понимаю, что это вариант. Однако мой вопрос направлен на достижение аналогичного результата с использованием одного выражения PromQL.
Prometheus не поддерживает пост-фильтрацию результатов запроса на основе меток, поэтому вся фильтрация на основе меток должна выполняться в фильтрах меток в фигурных скобках перед применением любой функции PromQL. Например, если необходимо вычислить сумму metric_1
временных рядов с меткой label_2 = "value_2"
, можно использовать следующий запрос:
sum(metric_1{label_2 = "value_2"}) by (label_1)
P.S. Если после применения какой-либо функции PromQL, такой как label_replace , необходима дополнительная пост-фильтрация по меткам, то в VictoriaMetrics — подобном Prometheus решении для мониторинга с поддержкой PromQL можно использовать следующие функции MetricsQL:
(Я основной разработчик VictoriaMetrics).
Результат агрегации в вашем примере не имеет
label2
, поэтому не совсем понятно, что вы пытаетесь сделать.