#prometheus #promql
#prometheus #promql
Вопрос:
Я вижу PromQL, который был запущен против экспортера узлов в системе Linux, как показано ниже:
avg without(cpu, mode)(rate(node_cpu_seconds_total{mode="idle"}[1m]))
Я могу легко понять, что делает следующее :
rate(node_cpu_seconds_total{mode="idle"}[1m]
Но я не понял, что
avg without(cpu, mode)
выполняет. Какая польза от
без (процессор, режим)
Можете ли вы, пожалуйста, помочь с этим?
Спасибо
Ответ №1:
В документации здесь содержится подробная информация об этом without
предложении:
without
удаляет перечисленные метки из результирующего вектора`
В вашем случае запрос действительно должен быть avg (rate(node_cpu_seconds_total{mode="idle"}[1m])) without (cpu, mode)
( without
идет после avg()
).
Он удалит обе метки cpu
и mode
(кстати, режим всегда idle
в любом случае) и вычислит среднее количество незанятого процессора, доступное для каждого экземпляра.
к вашему сведению, то же самое также может быть достигнуто с помощью by (instance)
вместо использования without(cpu, mode)
.
Комментарии:
1.
without
может находиться междуavg
(или чем бы ни было агрегирование) и его круглой скобкой. Некоторые люди (включая меня) предпочитают именно так. И вот как Prometheus форматирует его при выводе (например, на своей/rules
странице):count without(instance) (up)
.2.
by (instance)
эквивалентно толькоwithout(cpu, mode)
ifinstance
,cpu
иmode
являются единственными присутствующими метками. Если какая-либо метка добавлена с помощью конфигурации очистки (например,env="prod"
), то они больше не эквивалентны, и используете ли вы ту или иную, зависит от того, чего вы хотите достичь: агрегировать только по экземпляру или агрегировать толькоcpu
метку (и удалятьmode
в процессе).