Как рассчитать нормализованный%CPU на процесс с помощью Prometheus wmi_exporter с использованием wmi_process_cpu_time_total и wmi_cs_logical_processors

#wmi #promql

#wmi #promql

Вопрос:

  1. Используя следующий promql, мне удалось получить% CPU для каждого процесса:

    sum by (process, process_id) (rate(wmi_process_cpu_time_total{instance=»my_instance», process=»my_process»}[5m]))* 100/(amount_of_cores)

Это возвращает правильный вектор, если amount_of_cores является жестко заданным скалярным (в моем случае — 32). К сожалению, я не могу использовать здесь жестко заданные значения, потому что у меня много экземпляров с разным количеством ядер…

  1. С другой стороны, следующий запрос возвращает правильное количество ядер в экземпляре:

    wmi_cs_logical_processors{экземпляр=»my_instance»}

К сожалению, когда я использую этот запрос в качестве разделителя, он ничего не возвращает. Насколько я понимаю, проблема в том, что первый запрос имеет несколько меток, а второй — только один «экземпляр», поэтому прямое деление ничего не возвращает.

Что я могу здесь сделать?

Ответ №1:

Во время написания вопроса я нашел ответ. Итак, на случай, если кому-то интересно… Чтобы разделить один вектор на другой с разными метками, вы должны использовать игнорирование (labels_not_existing_in_divider), group_left и некоторый агрегатор на делителе (я использовал sum).

     ((sum by (process, process_id) (rate(wmi_process_cpu_time_total{instance=~"$hostname.*"}[5m]))*100))
/
ignoring(process, process_id) group_left sum (wmi_cs_logical_processors{instance=~"$hostname.*"})