Используемые термины: Prometheus.
Данную инструкцию можно использовать как шпаргалку для работы с Prometheus в части, касающейся выборки данных. Мы попробуем описать процесс получения данных, а также будут приведены примеры извлечения наиболее значимых показателей.
Рассмотрим синтаксис некоторых функций, которые мы будем использовать в нашей инструкции. Проверять все наши запросы можно в веб-интерфейсе прометеуса на странице /graph.
В Prometheus значения для счетчиков всегда возрастают, но как правило, нам нужно знать изменение значения за определенный момент времени. Запрос будет выглядеть так:
irate(<запрос на выборку метрики>[интервал времени, на протяжении которого происходят изменения метрики])
Среднее значение по условию, например:
avg by (instance)
… среднее для каждого инстанса.
Среднее значение всех значений для метрик в указанном интервале.
avg_over_time(<запрос на выборку метрики>[интервал])
Функция суммирует полученные результаты:
sum(<запрос на получение значений>)
Отображает время в формате UNIX TIME.
Считает количество значений:
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)
* первый запрос для отображения процента свободного процессорного времени, второй — процент утилизации.
Пример ответа:
{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
Для наших запросов мы будем использовать метрики:
Рассмотрим примеры.
1. Для всех узлов:
sum(node_memory_MemTotal_bytes{})
2. Для некоторых:
sum(node_memory_MemTotal_bytes{instance=~»192.168.0.15:9100|192.168.0.20:9100″})
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
Мы будем использовать метрики:
Примеры ниже.
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
Используемые метрики:
Переходим к примерам.
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.
Продолжая использовать данный сайт вы принимаете политику конфиденциальности и cookies