Запрос PromQL, чтобы найти процессор и память, использованные за последнюю неделю

Я пытаюсь написать запрос Prometheus, который может сказать мне, сколько в процентах ЦП (и еще один для памяти и сети) каждое пространство имен использовало за определенный период времени, скажем, за неделю.

Я пытаюсь использовать метрики container_spec_cpu_shares и container_memory_working_set_bytes, но я не могу понять, как их суммировать с течением времени. Что бы я ни попробовал, он либо возвращает 0, либо ошибки.

Любая помощь о том, как написать запрос для этого, была бы принята с благодарностью.


person Steve    schedule 07.07.2020    source источник
comment
Здравствуйте, скажите, проверяли ли вы эту ветку: serverfault.com/questions/978932/   -  person Dawid Kruk    schedule 07.07.2020
comment
Привет, Давид, я видел эту ветку. Это очень полезный и подробный ответ, который отлично подходит для мониторинга кластера. Проблема в том, что я пытаюсь создать запросы, которые находят процент использования ЦП и памяти за период времени, который немного отличается   -  person Steve    schedule 09.07.2020


Ответы (1)


Чтобы проверить процент памяти, используемый каждым пространством имен, вам понадобится запрос, аналогичный приведенному ниже:

sum( container_memory_working_set_bytes{container="", namespace=~".+"} )|
by (namespace) / ignoring (namespace) group_left 
sum( machine_memory_bytes{}) * 100 

Вышеуказанный запрос должен создать график, подобный этому:

ГРАФАНА ИМИДЖ

Отказ от ответственности !:

  • Снимок экрана выше взят из Grafana для лучшей наглядности.
  • Этот запрос не подтверждает изменения в доступной оперативной памяти (изменения узлов, автоматическое масштабирование узлов и т. д.).

Чтобы получить метрику за определенный период времени в PromQL, вам нужно будет использовать дополнительную функцию, например:

  • avg_over_time(EXP[time]).

Чтобы вернуться в прошлое и рассчитать ресурсы с определенного момента времени, вам нужно будет использовать:

  • offset TIME

При использовании вышеуказанных указателей запрос должен сочетаться с:

avg_over_time( sum(container_memory_working_set_bytes{container="", namespace=~".+"} offset 45m) by (namespace)[120m:])  / ignoring (namespace) group_left 
sum( machine_memory_bytes{}) 

Вышеупомянутый запрос вычислит средний процент памяти, используемый каждым пространством имен, и разделит его на всю память в кластере в промежутке от 120 минут до настоящего времени. Он также начнется на 45 минут раньше текущего времени.

Пример:

  • Время выполнения запроса: 20:00
  • avg_over_time(EXPR[2h:])
  • offset 45 min

Вышеупомянутый пример начнется в 17:15 и запустит запрос до 19:15. Вы можете изменить его, чтобы включить всю неделю :).

Если вы хотите рассчитать использование ЦП по пространству имен, вы можете заменить эту метрику следующей:

  • container_cpu_usage_seconds_total{} - проверьте rate() функцию при использовании этой метрики (счетчика)
  • machine_cpu_cores{}

Вы также можете посмотреть на эти сетевые показатели:

  • container_network_receive_bytes_total - проверьте rate() функцию при использовании этой метрики (счетчика)
  • container_network_transmit_bytes_total - проверьте rate() функцию при использовании этой метрики (счетчика)

Я включил более подробное объяснение ниже с примерами (память), методологией тестирования и анализа используемых запросов.


Предположим:

  • Kubernetes cluster 1.18.6 (Kubespray) with 12GB of memory in total:
    • master node with 2GB of memory
    • узел worker-one с 8GB памяти
    • узел worker-two с 2GB памяти
  • Prometheus и Grafana установлены с помощью: Github.com: Coreos: Kube-prometheus
  • Namespace kruk with single ubuntu pod set to generate artificial load with below command:
    • $ stress-ng --vm 1 --vm-bytes <AMOUNT_OF_RAM_USED> --vm-method all -t 60m -v

Искусственная нагрузка была сгенерирована stress-ng два раза:

  • 60 минут - используется 1 ГБ памяти
  • 60 минут - используется 2 ГБ памяти

Процент памяти, используемой пространством имен kruk в этот промежуток времени:

  • 1 ГБ, что составляет около 8,5% всей памяти в кластере (12 ГБ)
  • 2 ГБ, что составляет около 17,5% всей памяти в кластере (12 ГБ)

Загрузка из запроса Prometheus для пространства имен kruk выглядела так:

Использование памяти пространства имен kruk

Расчет с использованием avg_over_time(EXPR[time:]) / memory in the cluster показал использование в среднем около 13% ((17.5+8.5)/2) при запросе времени создания искусственной нагрузки. Это должно указывать на то, что запрос был правильным:

«Среднее


Что касается используемого запроса:

avg_over_time( sum( container_memory_working_set_bytes{container="", namespace="kruk"} offset 1380m )
by (namespace)[120m:]) / ignoring (namespace) group_left 
sum( machine_memory_bytes{}) * 100 

Вышеупомянутый запрос действительно похож на тот, что был в начале, но я внес некоторые изменения, чтобы показать только пространство имен kruk.

Я разделил объяснение запроса на 2 части (делимое / делитель).

Дивиденды

container_memory_working_set_bytes{container="", namespace="kruk"}

Эта метрика выводит записи об использовании памяти в пространстве имен kruk. Если вам нужно было запросить все пространства имен, посмотрите дополнительное объяснение:

  • namespace=~".+" ‹- это регулярное выражение будет соответствовать только тогда, когда значение внутри ключа пространства имен содержит 1 или более символов. Это сделано для того, чтобы избежать пустого результата в пространстве имен с агрегированными метриками.
  • container="" ‹- часть используется для фильтрации метрики. Если бы вы выполняли запрос без него, вы бы получили несколько показателей использования памяти для каждого контейнера / модуля, как показано ниже. container="" будет соответствовать только тогда, когда значение контейнера пусто (последняя строка в приведенной ниже цитате).
container_memory_working_set_bytes{container="POD",endpoint="https-metrics",id="/kubepods/podab1ed1fb-dc8c-47db-acc8-4a01e3f9ea1b/e249c12010a27f82389ebfff3c7c133f2a5da19799d2f5bb794bcdb5dc5f8bca",image="k8s.gcr.io/pause:3.2",instance="192.168.0.124:10250",job="kubelet",metrics_path="/metrics/cadvisor",name="k8s_POD_ubuntu_kruk_ab1ed1fb-dc8c-47db-acc8-4a01e3f9ea1b_0",namespace="kruk",node="worker-one",pod="ubuntu",service="kubelet"} 692224
container_memory_working_set_bytes{container="ubuntu",endpoint="https-metrics",id="/kubepods/podab1ed1fb-dc8c-47db-acc8-4a01e3f9ea1b/fae287e7043ff00da16b6e6a8688bfba0bfe30634c52e7563fcf18ac5850f6d9",image="ubuntu@sha256:5d1d5407f353843ecf8b16524bc5565aa332e9e6a1297c73a92d3e754b8a636d",instance="192.168.0.124:10250",job="kubelet",metrics_path="/metrics/cadvisor",name="k8s_ubuntu_ubuntu_kruk_ab1ed1fb-dc8c-47db-acc8-4a01e3f9ea1b_0",namespace="kruk",node="worker-one",pod="ubuntu",service="kubelet"} 2186403840
container_memory_working_set_bytes{endpoint="https-metrics",id="/kubepods/podab1ed1fb-dc8c-47db-acc8-4a01e3f9ea1b",instance="192.168.0.124:10250",job="kubelet",metrics_path="/metrics/cadvisor",namespace="kruk",node="worker-one",pod="ubuntu",service="kubelet"} 2187096064

Вы можете узнать больше о контейнере паузы здесь:

sum( container_memory_working_set_bytes{container="", namespace="kruk"} offset 1380m )
by (namespace)

Этот запрос суммирует результаты по соответствующим пространствам имен. offset 1380m используется, чтобы вернуться в прошлое, поскольку тесты проводились в прошлом.

avg_over_time( sum( container_memory_working_set_bytes{container="", namespace="kruk"} offset 1380m )
by (namespace)[120m:])

Этот запрос будет вычислять среднее значение по метрике памяти по пространствам имен в указанное время (с 120 мин до настоящего времени), начиная с 1380 м до настоящего времени.

Вы можете узнать больше о avg_over_time() здесь:

Делитель

sum( machine_memory_bytes{})

Эта метрика суммирует объем памяти, доступный на каждом узле кластера.

EXPR / ignoring (namespace) group_left 
sum( machine_memory_bytes{}) * 100 

Сфокусироваться на:

  • / ignoring (namespace) group_left ‹- это выражение позволит вам разделить каждую запись в делимом (каждое пространство имен с их средним объемом памяти по времени) на делитель (всю память в кластере). Подробнее об этом можно прочитать здесь: Prometheus.io: Vector соответствие
  • * 100 не требует пояснений и умножает результат на 100, чтобы он выглядел как проценты.

Дополнительные ресурсы:

person Dawid Kruk    schedule 03.08.2020