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)
* первый запрос для отображения процента свободного процессорного времени, второй — процент утилизации.
Пример ответа:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
{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)
* первый запрос для отображения процента свободного процессорного времени, второй — процент утилизации.
Пример ответа:
1 2 |
{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]))
Пример ответа:
1 2 |
{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
* для конкретного сервера / диска и для всех серверов и всех дисков.