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

Обновлено Обновлено: Опубликовано Опубликовано:

Используемые термины: Prometheus.

Данную инструкцию можно использовать как шпаргалку для работы с Prometheus в части, касающейся выборки данных (использование PromQL). Мы попробуем описать процесс получения данных, а также будут приведены примеры извлечения наиболее значимых показателей.

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

Рассмотрим синтаксис некоторых функций, которые мы будем использовать в нашей инструкции. Проверять все наши запросы можно в веб-интерфейсе прометеуса на странице /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 - <полученный процент>

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

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

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

Расчет ведется относительно показателя 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)

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

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

{cpu="0", instance="192.168.0.15:9100", job="node_exporter_clients", mode="idle"} 0.6000000238418579
{cpu="0", instance="192.168.0.20:9100", job="node_exporter_clients", mode="idle"} 0.9999999403953552
{cpu="1", instance="192.168.0.15:9100", job="node_exporter_clients", mode="idle"} 0.6000000238418579
{cpu="1", instance="192.168.0.20:9100", job="node_exporter_clients", mode="idle"} 1.5999999642372131
{cpu="2", instance="192.168.0.15:9100", job="node_exporter_clients", mode="idle"} 0.8000000193715096
{cpu="2", instance="192.168.0.20:9100", job="node_exporter_clients", mode="idle"} 0.8000001311302185
{cpu="3", instance="192.168.0.15:9100", job="node_exporter_clients", mode="idle"} 1.0000000149011612
{cpu="3", instance="192.168.0.20:9100", job="node_exporter_clients", mode="idle"} 0.6000000238418579
{cpu="4", instance="192.168.0.15:9100", job="node_exporter_clients", mode="idle"} 0.19999999552965164
{cpu="4", instance="192.168.0.20:9100", job="node_exporter_clients", mode="idle"} 0.2000001072883606
{cpu="5", instance="192.168.0.15:9100", job="node_exporter_clients", mode="idle"} 0.40000002831220627
{cpu="5", instance="192.168.0.20:9100", job="node_exporter_clients", mode="idle"} 0.3999999165534973
{cpu="6", instance="192.168.0.15:9100", job="node_exporter_clients", mode="idle"} 0.6000000238418579
{cpu="6", instance="192.168.0.20:9100", job="node_exporter_clients", mode="idle"} 0.2000001072883606
{cpu="7", instance="192.168.0.15:9100", job="node_exporter_clients", mode="idle"} 0.19999999552965164
{cpu="7", instance="192.168.0.20:9100", job="node_exporter_clients", mode="idle"} 0.3999999165534973

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)

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

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

{instance="192.168.0.15:9100"} 0.7999999960884452
{instance="192.168.0.20:9100"} 0.9500000253319598

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]))

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

{instance="192.168.0.15:9100", job="node_exporter_clients"} 41.96494651116369
{instance="192.168.0.20:9100", job="node_exporter_clients"} 10.573695601658944

Сеть

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

  • 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

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

Читайте также

Другие инструкции по Prometheus:

1. Создание графиков в Grafana на основе данных из Prometheus.

2. Установка Prometheus + Alertmanager + node_exporter на Linux.

# DevOps # Мониторинг # Серверы
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет