Использование процессора контейнера cAdvisor с несколькими ядрами

#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/1101

5. Да, но в моем случае метка слева отсутствует справа, поэтому я не могу выполнить сопоставление. machine_cpu_cores это всего лишь одна метрика с одним значением, в то container_cpu_usage_seconds_total время как количество метрик основано на количестве запущенных контейнеров. И у него есть дополнительная метка «имя», которая является именем контейнера. Следовательно, совпадения нет 🙁