#docker #prometheus #metrics #prometheus-node-exporter #cadvisor
Вопрос:
Я отслеживаю загрузку процессора контейнеров с помощью cAdvisor, используя следующее выражение в prometheus:
(sum(rate(container_cpu_usage_seconds_total[3m])) BY (instance, name) * 100) > 80
Это предупреждение постоянно срабатывает для одного из моих контейнеров, так как на самом деле он использует более 80% процессора, но только на одном ядре. У моего хоста несколько ядер, и я хотел бы разделить этот процент на количество ядер. Я вижу, что cAdvisor экспортирует метрику под названием machine_cpu_cores
, которая, как я думал, поможет мне, но, к сожалению, я не могу заставить ее работать. Я пытался:
(sum(rate(container_cpu_usage_seconds_total[3m])) BY (instance, name) / sum(machine_cpu_cores) * 100) > 0
К сожалению, он возвращает пустой результат запроса. Кроме того, у меня нет никаких ограничений на контейнеры. Что я здесь делаю не так?
Ответ №1:
Может быть сложно понять, что делает PromQL, и одним из отличных способов понимания и отладки запросов является использование PromLens. Если вы подключите там свой запрос и переключитесь на вкладку «Объяснить», вы увидите, что происходит: существует несоответствие меток, которое вы можете устранить с помощью ключевого слова ignoring (), поэтому должно сработать что-то вроде следующего:
sum by(instance,name) (
rate(container_cpu_usage_seconds_total[3m])
)
/ ignoring(job)
machine_cpu_cores
Комментарии:
1. Мне немного стыдно, что я только что узнал о Промленсе. Какой потрясающий инструмент! Тем не менее, я попытался изменить свой запрос, но я все еще не могу разобраться в ярлыках и в том, почему существует несоответствие. Мой запрос в настоящее время выглядит так:
sum by(instance,name) (rate(container_cpu_usage_seconds_total[3m])) * 100 / sum by (instance) (machine_cpu_cores)
на вкладке «Объяснить» я вижу, что левые метки-это экземпляр и имя, а правые метки отсутствуют и совпадения нет. Отображается только один результат, похоже на какую-то совокупность, но я понятия не имею2. Вы пробовали мой запрос выше? Вы смотрели на вкладке «Объяснить» в PromLens? 🙂
3. Да, я сделал это, извините, я просто редактировал комментарий, так как я устроил беспорядок. Я попробовал ваш запрос, но он не возвращает то, что я хочу. В демонстрационном примере он возвращает 9 строк, и только первая строка возвращает результат, и да, он делит левое значение на правое, но это неверно — мне нужны эти значения для каждого отдельного контейнера, работающего на узле, и кажется, что это агрегированный результат или что-то в этом роде, я не уверен.
4. Вас это устраивает, и да, вам нужно будет адаптироваться к вашим данным, но главное, что
ignoring
вы можете по существу указать PromQL, какие метки игнорировать, чтобы он мог сопоставлять левую и правую в значимом смысле. Не уверен насчет совокупности, но лучшая зацепка, которую я получил, это github.com/kubernetes/kube-state-metrics/issues/11015. Да, но в моем случае метка слева отсутствует справа, поэтому я не могу выполнить сопоставление.
machine_cpu_cores
это всего лишь одна метрика с одним значением, в тоcontainer_cpu_usage_seconds_total
время как количество метрик основано на количестве запущенных контейнеров. И у него есть дополнительная метка «имя», которая является именем контейнера. Следовательно, совпадения нет 🙁