Примеры запросов к метрикам Prometheus

Thank you for reading this post, don't forget to subscribe!

Ариф­ме­ти­че­ские операции
Вре­мя рабо­ты системы
Тем­пе­ра­ту­ра
Про­цес­сор
Опе­ра­тив­ная память
Сеть
Дис­ко­вый накопитель

 

Синтаксис запросов

Рас­смот­рим син­так­сис неко­то­рых функ­ций, кото­рые мы будем исполь­зо­вать в нашей инструк­ции. Про­ве­рять все наши запро­сы мож­но в веб-интер­фей­се про­ме­те­уса на стра­ни­це /graph.

irate или rate

В Prometheus зна­че­ния для счет­чи­ков все­гда воз­рас­та­ют, но как пра­ви­ло, нам нуж­но знать изме­не­ние зна­че­ния за опре­де­лен­ный момент вре­ме­ни. Запрос будет выгля­деть так:

irate(<запрос на выбор­ку метрики>[интервал вре­ме­ни, на про­тя­же­нии кото­ро­го про­ис­хо­дят изме­не­ния метрики])

avg by

Сред­нее зна­че­ние по усло­вию, например:

avg by (instance)

… сред­нее для каж­до­го инстанса.

avg_over_time

Сред­нее зна­че­ние всех зна­че­ний для мет­рик в ука­зан­ном интервале.

avg_over_time(<запрос на выбор­ку метрики>[интервал])

sum

Функ­ция сум­ми­ру­ет полу­чен­ные результаты:

sum(<запрос на полу­че­ние значений>)

time

Отоб­ра­жа­ет вре­мя в фор­ма­те UNIX TIME.

time()

count

Счи­та­ет коли­че­ство значений:

count(<запрос на полу­че­ние значений>)

Вме­сте с by зна­че­ния могут фильтроваться:

count(<запрос на полу­че­ние зна­че­ний>) by (<по како­му показателю>)

Арифметические операции

1. С полу­чен­ны­ми чис­ло­вы­ми дан­ны­ми мож­но выпол­нять раз­лич­ные мате­ма­ти­че­ские опе­ра­ции. Напри­мер, если мы полу­чим зна­че­ния вре­ме­ни в секун­дах, то мож­но его пере­ве­сти в часы:

<полу­чен­ное вре­мя> / 60

Или наобо­рот

<полу­чен­ное вре­мя> * 60

2. Полу­чен­ный оста­ток от про­цент­но­го пока­за­те­ля вычис­ля­ет­ся по формуле:

100 - <полу­чен­ный процент>

Системная информация

Для нача­ла рас­смот­рим при­ме­ры полу­че­ния общих систем­ных показателей.

Время работы системы

Рас­чет ведет­ся отно­си­тель­но пока­за­те­ля node_boot_time_seconds (вре­мя послед­не­го вклю­че­ния системы).

1. Общее вре­мя для всех узлов:

sum(time() - node_boot_time_seconds{})

sum(time() - node_boot_time_seconds{}) / 60

* пер­вый запрос в секун­дах, вто­рой — в минутах.

2. Для неко­то­рых узлов:

sum(time() - node_boot_time_seconds{instance=~"192.168.0.15:9100|192.168.0.20:9100"})

* в дан­ном при­ме­ре мы полу­чим сум­му зна­че­ний для узлов 192.168.0.15 и 192.168.0.20.

3. Для всех узлов по отдельности:

time() - node_boot_time_seconds{}

* дан­ный запрос выве­дет на экран несколь­ко зна­че­ний для каж­до­го из узлов.

Температура

Дан­ная мет­ри­ка под­дер­жи­ва­ет­ся не всем обо­ру­до­ва­ни­ем или сред­ства­ми виртуализации.

1. Для всех нод:

node_hwmon_temp_celsius

2. Для конкретных:

node_hwmon_temp_celsius{instance=~'192.168.0.15:9100|192.168.0.20:9100'}

Процессор

Для полу­че­ния нуж­ных нам пока­за­те­лей будем исполь­зо­вать мет­ри­ку node_cpu_seconds_total.

Количество процессоров

1. Общее коли­че­ство всех про­цес­со­ров всех узлов:

sum(count(node_cpu_seconds_total{mode='system'}) by (cpu))

2. Для неко­то­рых инстансов:

sum(count(node_cpu_seconds_total{instance=~'192.168.0.15:9100|192.168.0.20:9100',mode='system'}) by (cpu))

* для 192.168.0.15 и 192.168.0.20.

3. По отдельности:

count(node_cpu_seconds_total{mode='system'}) by (instance)

Нагрузка

1. На все ядра всех узлов:

(irate(node_cpu_seconds_total{job="node_exporter_clients",mode="idle"}[5m])) * 100

100 - ((irate(node_cpu_seconds_total{job="node_exporter_clients",mode="idle"}[5m])) * 100)

* пер­вый запрос для отоб­ра­же­ния про­цен­та сво­бод­но­го про­цес­сор­но­го вре­ме­ни, вто­рой — про­цент утилизации.

При­мер ответа:

2. Сред­няя вели­чи­на по ядрам для всех узлов:

avg by (instance)(irate(node_cpu_seconds_total{job="node_exporter_clients",mode="idle"}[5m])) * 100

100 - (avg by (instance)(irate(node_cpu_seconds_total{job="node_exporter_clients",mode="idle"}[5m])) * 100)

* пер­вый запрос для отоб­ра­же­ния про­цен­та сво­бод­но­го про­цес­сор­но­го вре­ме­ни, вто­рой — про­цент утилизации.

При­мер ответа:

3. Сред­няя вели­чи­на по ядрам для кон­крет­но­го узла:

avg by (instance)(irate(node_cpu_seconds_total{instance="192.168.0.15:9100",job="node_exporter_clients",mode="idle"}[5m])) * 100

100 - (avg by (instance)(irate(node_cpu_seconds_total{instance="192.168.0.15:9100",job="node_exporter_clients",mode="idle"}[5m])) * 100)

* пер­вый запрос для отоб­ра­же­ния про­цен­та сво­бод­но­го про­цес­сор­но­го вре­ме­ни, вто­рой — про­цент утилизации.

При­мер ответа:

{instance="192.168.0.15:9100"} 1.100000003352747

Время ожидания

Запрос пока­зы­ва­ет зна­че­ние в про­цент­ном экви­ва­лен­те для вре­ме­ни ожи­да­ния про­цес­со­ра. На прак­ти­ке, иде­аль­но, когда он равен нулю.

1. Сред­нее зна­че­ние за 30 минут для всех узлов:

avg(irate(node_cpu_seconds_total{mode="iowait"}[30m])) * 100

2. Для кон­крет­но­го узла:

avg(irate(node_cpu_seconds_total{instance=~"192.168.0.15:9100|192.168.0.20:9100",mode="iowait"}[30m])) * 100

3. Отдель­но по каж­дой ноде:

irate(node_cpu_seconds_total{mode="iowait"}[30m]) * 100

Оперативная память

Для наших запро­сов мы будем исполь­зо­вать метрики:

  • node_memory_MemTotal_bytes.
  • node_memory_MemFree_bytes.
  • node_memory_Cached_bytes.
  • node_memory_Buffers_bytes.

Рас­смот­рим примеры.

Объем памяти

1. Для всех узлов:

sum(node_memory_MemTotal_bytes{})

2. Для некоторых:

sum(node_memory_MemTotal_bytes{instance=~"192.168.0.15:9100|192.168.0.20:9100"})

3. По отдельности:

node_memory_MemTotal_bytes{}

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

1. Сво­бод­но:

100 * (1 - ((avg_over_time(node_memory_MemFree_bytes[5m]) + avg_over_time(node_memory_Cached_bytes[5m]) + avg_over_time(node_memory_Buffers_bytes[5m])) / avg_over_time(node_memory_MemTotal_bytes[5m])))

2. Заня­то:

100 * ((avg_over_time(node_memory_MemFree_bytes[5m]) + avg_over_time(node_memory_Cached_bytes[5m]) + avg_over_time(node_memory_Buffers_bytes[5m])) / avg_over_time(node_memory_MemTotal_bytes[5m]))

При­мер ответа:

 

Сеть

Мы будем исполь­зо­вать метрики:

  • node_network_receive_bytes_total
  • node_network_transmit_bytes_total

При­ме­ры ниже.

Передача данных

1. Вхо­дя­щий тра­фик за послед­ние 5 минут:

rate(node_network_receive_bytes_total[5m]) * 8 / 1024 / 1024

2. Иcхо­дя­щий тра­фик за послед­ние 5 минут:

rate(node_network_transmit_bytes_total[5m]) * 8 / 1024 / 1024

Дисковый накопитель

Исполь­зу­е­мые метрики:

  • node_filesystem_size_bytes.
  • node_filesystem_avail_bytes.
  • node_filesystem_free_bytes.
  • node_disk_read_bytes_total.
  • node_disk_written_bytes_total.

Пере­хо­дим к примерам.

Объемы

1. Объ­ем разделов:

node_filesystem_size_bytes{instance=~'192.168.0.15:9100|192.168.0.20:9100',fstype=~"ext4|xfs"}

node_filesystem_size_bytes{fstype=~"ext4|xfs"}

* для кон­крет­ных нод или всех.

2. Объ­ем доступ­но­го пространства:

node_filesystem_avail_bytes {fstype=~"ext4|xfs"}

3. Объ­ем в процентах.

Исполь­зу­ет­ся:

1 - (node_filesystem_free_bytes{fstype=~"ext4|xfs"} / node_filesystem_size_bytes{fstype=~"ext4|xfs"})

Сво­бод­но:

node_filesystem_free_bytes{fstype=~"ext4|xfs"} / node_filesystem_size_bytes{fstype=~"ext4|xfs"}

Нагрузка

1. Чте­ние в килобайтах:

rate(node_disk_read_bytes_total{instance="Server10:9100", device="sda"}[5m]) / 1024

irate(node_disk_read_bytes_total{}[30m]) / 1024

* для кон­крет­но­го сер­ве­ра / дис­ка и для всех сер­ве­ров и всех дисков.

2. Запись в килобайтах:

rate(node_disk_written_bytes_total{instance="Server10:9100", device="sda"}[5m]) / 1024

irate(node_disk_written_bytes_total{}[30m]) / 1024

* для кон­крет­но­го сер­ве­ра / дис­ка и для всех сер­ве­ров и всех дисков.