Образовательный проект «SnakeProject» Михаила Козлова

Навигация

⇒ FreeBSD and Nix ⇐

CISCO

Voice(Asterisk\Cisco)

Microsoft

Powershell

Python

SQL\T-SQL

Общая

WEB Разработка

ORACLE SQL \ JAVA

Мото

Стрельба, пневматика, оружие

Саморазвитие и психология


Prometheus и типовые задачки


Prometheus и типовые задачки


PromQL (Prometheus Query Language)

Язык запросов в Prometheus для выборки и агрегирования данных

Значения временного ряда, хранящиеся в бд Prometheus — слева, справа - отметки времени:
1 @[111.11]
1 @[112.22]
1 @[113.33]
1 @[114.44]

Пример разбора полученного значения указанной метрики:
node_cpu_seconds_total{cpu="0", instance="node-exporter:9100", job="node-exporter", mode="idle"} => 1211.2
где:

  • node_cpu_seconds_total - имя метрики
  • cpu\instance\job\mode - лэйблы (labels)

Типы данных в PromQL:

  • Instant Vector – мгновенный вектор, только одно значение на момент времени выполнения запроса
  • Range Vector – диапазонный вектор, значения за интервал времени
  • Scalar – скаляр, единственное число, без лейблов и временного ряда (редко используется)
  • String – строка (редко используется)

В основном используются перве два типа

Простейший запрос

Запросы выполняются командой promtool:
promtool query instant http(s)://<ip_адрес_сервера_prometheus>:<порт> <запрос>

Вывести метрику up типа instant vector:
# promtool query instant https://localhost:9090 up
up{instance="node-exporter:9100", job="node-exporter"} => 1 @[111.222]

Вывести метрику up типа range vector, доступные единицы измерения:
s - секунда
m - минута
h - час
d - день
w - неделя
y - год
# promtool query instant https://localhost:9090 'up[1m]'
1 @[111.11]
1 @[112.22]
1 @[113.33]
1 @[114.44]

Типы метрик:

  • Counter - счетчик, только увеличивается или обнуляется при перезапуске
  • Gauge - счетчик, может расти или уменьшаться
  • Histogram - собирает наблюдения по bucket, хранит счетчики попаданий в интервалы, сумму и общее число
  • Summary - аналдог Histogram + считает процентили

Функции счетчиков

rate(<range vector>) - вычисляет среднюю скорость увеличения значения счетчика за интервал
Т.е. показывает среднее увеличения счетчика в секунду за указанный интервал
Применяется к типу Counter

Принцип работы rate:
Получаем все точки из диапазона
Вычитаем первое значение временного ряда из последнего, значение метрики, за последнюю минуту
Делим полученное значение на время

Пример запроса к метрике node_network_receive_bytes_total(общее число полученных байт сетевого интерфейса)

Вернет среднюю скорость увеличения за последние 8 минут(~1.22 байт в секунду (в среднем) за указанный период):
# promtool query instant https://localhost:9090 rate(node_network_receive_bytes_total[8m])
{device="eth0", instance="node-exporter:9100", job="node-exporter"} => 1.22 @[1.2]
            
irate(<range vector>) вычисляет мгновенное изменение счетчика
Применяется к типу Counter

rate - усредняет полученное значение за интервал времени, irate берет последнее и предпоследнее значения:
11 @[12.01]
22 @[13.01]
33 @[14.01]
44 @[15.01]

Предпоследняя точка вычитается из последней 44 - 33, получая мгновенное изменение = 11

increase(<range vector>) общий прирост за указанный интервал
Т.е. суммирует, на сколько вырос счетчик за указанный интервал
Применяется к типу Counter

Функции по диапазону времени

Применяются к range vector, вычисляют статистику по каждому отдельному временному ряду

avg_over_time(<range vector>) рассчитывает среднее значение в указанном интервале

Например, метрика node_memory_MemAvailable_bytes предоставляет объем доступной памяти

Вывести среднее значение за последние 8 минут:
avg_over_time(node_memory_MemAvailable_bytes[8m])

count_over_time(<range vector>) возвращает количество значений в указанном интервале

Пример, если метрика собирается раз в 30 секунд, за 8 минут набежит 16 значений

Математические функции

abs(<instant vector>) возвращает абсолютные значения
Т.е. превращает отрицательные значения в положительные, положительные оставляет без изменений

Агрегирующие функции

Применяются к instant vector, объединяют несколько временных рядов в меньшее количество серий

  • sum(<instant vector>) - суммирует значения всех временных рядов
  • avg(<instant vector>) - среднее арифметическое
  • min(<instant vector>) - наименьшее значение
  • max(<instant vector>) - наибольшее значение
  • count(<instant vector>) - количество временных рядов


Как поднимаем прометея

Запускать прометея и экспортеры будем в контенерах

# cat docker-compose.yaml
services:
  node-exporter:
    container_name: node-exporter
    image: prom/node-exporter
  prometheus:
    container_name: prometheus
    image: prom/prometheus
    ports:
      - 9090:9090
    configs:
      - source: prometheus
        target: /etc/prometheus/prometheus.yaml
    command:
      - '--config.file=/etc/prometheus/prometheus.yaml'
configs:
  prometheus:
    content: |
      global:
        scrape_interval: 15s
        scrape_timeout: 10s
      scrape_configs:
        - job_name: 'node-exporter'
          static_configs:
            - targets:
                - 'node-exporter:9100'

# docker compose up

Можно и так

# cat docker-compose.yaml
services:
  node-exporter:
    container_name: node-exporter
    image: prom/node-exporter
    ports:
      - 9100:9100
    volumes:
      - '/:/host:ro,rslave'
    command:
      - '--path.rootfs=/host'
    network_mode: host
  prometheus:
    container_name: prometheus
    image: prom/prometheus
    ports:
      - 9090:9090
    volumes:
      - './prometheus.yaml:/etc/prometheus/prometheus.yaml'
    command:
      - '--config.file=/etc/prometheus/prometheus.yaml'
    network_mode: host

# cat prometheus.yaml
global:
  scrape_interval: 15s
  scrape_timeout: 10s
scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets:
          - 'localhost:9090'
  - job_name: 'node-exporter'
    static_configs:
      - targets:
          - 'localhost:9100'

# docker compose up


Типовые задачи

Загрузка процессора (CPU)

node-exporter предоставляет метрику node_cpu_seconds_total
(сколько секунд в каждом режиме работы по каждому ядру процессор провел времени)
Тип метрики - Counter(постоянно увеличивается с момента запуска)

Пример, вывод разных режимов на примере пары ядер:
node_cpu_seconds_total{cpu="0", instance="node-exporter:9100", job="node-exporter", mode="idle"} => 1211.2
node_cpu_seconds_total{cpu="0", instance="node-exporter:9100", job="node-exporter", mode="iowait"} => 121
node_cpu_seconds_total{cpu="0", instance="node-exporter:9100", job="node-exporter", mode="irq"} => 0
node_cpu_seconds_total{cpu="0", instance="node-exporter:9100", job="node-exporter", mode="nice"} => 0
node_cpu_seconds_total{cpu="0", instance="node-exporter:9100", job="node-exporter", mode="softirq"} => 3.2
node_cpu_seconds_total{cpu="0", instance="node-exporter:9100", job="node-exporter", mode="steal"} => 6
node_cpu_seconds_total{cpu="0", instance="node-exporter:9100", job="node-exporter", mode="system"} => 22.01
node_cpu_seconds_total{cpu="0", instance="node-exporter:9100", job="node-exporter", mode="user"} => 111
node_cpu_seconds_total{cpu="1", instance="node-exporter:9100", job="node-exporter", mode="idle"} => 222.2
node_cpu_seconds_total{cpu="1", instance="node-exporter:9100", job="node-exporter", mode="iowait"} => 2.32
node_cpu_seconds_total{cpu="1", instance="node-exporter:9100", job="node-exporter", mode="irq"} => 2
node_cpu_seconds_total{cpu="1", instance="node-exporter:9100", job="node-exporter", mode="nice"} => 2
node_cpu_seconds_total{cpu="1", instance="node-exporter:9100", job="node-exporter", mode="softirq"} => 2.2
node_cpu_seconds_total{cpu="1", instance="node-exporter:9100", job="node-exporter", mode="steal"} => 5
node_cpu_seconds_total{cpu="1", instance="node-exporter:9100", job="node-exporter", mode="system"} => 2.2
node_cpu_seconds_total{cpu="1", instance="node-exporter:9100", job="node-exporter", mode="user"} => 4
...

Функция rate() - превращает счетчики в скорость

Пример, доля времени, когда CPU простаивает (idle), за последние 8 минут:
rate(node_cpu_seconds_total{mode="idle"}[8m])
                
Результат доли простоя каждого ядра:
{cpu="0", instance="node-exporter:9100", job="node-exporter", mode="idle"} => 0.971 @[1.2]
{cpu="1", instance="node-exporter:9100", job="node-exporter", mode="idle"} => 0.974 @[1.2]

Значения 0.971 и 0.974 за последние 8 минут - "простой" ядер процессора составил около 97% времени

Ниже пример - процент простоя CPU за последние 8 минут

Нагрузка CPU для каждого экземпляра, вычислим с промощью функции выше avg (пример):
avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[8m]))

Умножим на 100, чтоб получить %:
avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[8m])) * 100

Ниже пример - процент загруженности CPU за последние 8 минут

100 - avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[8m])) * 100

Ниже пример - процент использования CPU в каждом режиме за последние 8 минут

avg by (instance, mode) (rate(node_cpu_seconds_total[8m])) * 100

Показатель iowait в CPU + низкая скорости диска вместе являются показателем, что диск - узкое место

Загрузка диска

Метрики:

  • node_filesystem_size_bytes - размер раздела
  • node_filesystem_avail_bytes - доступно для записи для обычных учеток
  • node_filesystem_free_bytes - доступно для записи включая root

Пример:
node_filesystem_size_bytes{device="/dev/vda1", fstype="ext4", mountpoint="/"} => 20971520000
node_filesystem_avail_bytes{device="/dev/vda1", fstype="ext4", mountpoint="/"} => 16777216000
node_filesystem_free_bytes{device="/dev/vda1", fstype="ext4", mountpoint="/"} => 16800000000

Примеры

Процент заполнения диска:
(1 - (node_filesystem_avail_bytes / node_filesystem_size_bytes)) * 100

Скорость ввода-вывода:
node_disk_read_bytes_total: Сколько байт всего прочитано с диска
node_disk_written_bytes_total: Сколько байт всего записано

Пример, скорость чтения в байтах в секунду за последние 8 минут:
rate(node_disk_read_bytes_total[8m])

Пример, значение 1048576 = с диска считывается ~1024 КБ/с

Пример, скорость записи в байтах в секунду за последние 8 минут:
rate(node_disk_written_bytes_total[8m])

Пример, значение 524288 = с диска считывается ~512 КБ/с

Показатель iowait в CPU + низкая скорости диска вместе являются показателем, что диск - узкое место

Загрузка оперативной памяти

Примеры метрик для анализа памяти:

  • node_memory_MemTotal_bytes - всего памяти
  • node_memory_MemAvailable_bytes - доступно памяти на данный момент
  • node_memory_MemFree_bytes - доступно памяти на данный момент без учета кешей и буферов

  
Перевод в гигабайты(примеры):
(node_memory_MemTotal_bytes) / (1024*1024*1024)
(node_memory_MemAvailable_bytes) / (1024*1024*1024)
(node_memory_MemFree_bytes) / (1024*1024*1024)
(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / (1024*1024*1024)

# node_memory_MemTotal_bytes
{instance="node-exporter:9100", job="node-exporter"} => 7.8 @[1.2]
# node_memory_MemAvailable_bytes
{instance="node-exporter:9100", job="node-exporter"} => 2.0 @[1.2]
# node_memory_MemFree_bytes
{instance="node-exporter:9100", job="node-exporter"} => 0.512 @[1.2]
# node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes
5.8
# (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100
65,517241379310344827586206896552
# ceil((1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100)
66
            
Где:
Всего памяти — ~ 8 ГБ
Доступно памяти — 2 ГБ
Свободно памяти без учета кеша — 512 МБ
Используемая память - 5.8 ГБ
Процент использования памяти - ~ 65,5%
Процент использования памяти округленно - 66%

Сеть

node_network_receive_bytes_total - всего байт принято сетевым интерфейсом
node_network_transmit_bytes_total - всего байт отправлено сетевым интерфейсом

Примеры

Средняя скорость приема и отправки данных в килобайтах (КБ/с) за последние 8 минут:
rate(node_network_receive_bytes_total[8m]) / 1024        
rate(node_network_transmit_bytes_total[8m]) / 1024
                
HTTP запросы

Все обработанные HTTP запросы - метрика prometheus_http_requests_total
Тип метрики — Counter

Пример, количество HTTP запросов:
prometheus_http_requests_total{app="prometheus", code="200", handler="/", instance="localhost:9090", job="prometheus"} => 22 @[1.1]
prometheus_http_requests_total{app="prometheus", code="200", handler="/rubric/1", instance="localhost:9090", job="prometheus"} => 11 @[1.1]

Пример, сколько пришло запросов за последние 8 минут:
rate(prometheus_http_requests_total[8m])

Результат:                
RPS (requests per second) запросов в секунду
Пример, для url / получилось 8.1, т.е в среднем сервер обрабатывал ~ 8 запросов в секунду

prometheus_http_requests_total имеет лейбл code (HTTP-коды)

Пример, процент ошибок 4xx от всех запросов:
rate(prometheus_http_requests_total{code=~"4.."}[8m]) / rate(prometheus_http_requests_total[8m]) * 100

Конструкция =~ позволяет использовать регулярное выражение             

Пример, значение 25.2, значит, около 25,2% всех запросов закончились ошибками 4ХХ

Пример, процент успешных 2ХХ\3ХХ запросов:
rate(prometheus_http_requests_total{code=~"2..|3.."}[8m]) / rate(prometheus_http_requests_total[8m]) * 100

Метрика prometheus_http_request_duration_seconds_* хранит тип Histogram по времени отклика

Функция histogram_quantile() поможет вычислить, например, 50-й перцентиль времени ответа:
histogram_quantile(0.50, sum by(le) (rate(prometheus_http_request_duration_seconds_bucket[8m])))
                
Результат:
{} => 0.051230076 @[1.2]
Т.е. 50% запросов обрабатываются за ~ 0.05 сек.

 


Комментарии пользователей

Эту новость ещё не комментировалиНаписать комментарий
Анонимам нельзя оставоять комментарии, зарегистрируйтесь!

Контакты Группа ВК Сборник материалов по Cisco, Asterisk, Windows Server, Python и Django, SQL и T-SQL, FreeBSD и LinuxКод обмена баннерами Видео к IT статьям на YoutubeВидео на другие темы Смотреть
Мои друзья: Советы, помощь, инструменты для сис.админа, статическая и динамическая маршрутизация, FreeBSD

© Snakeproject.ru создан в 2013 году.
При копировании материала с сайта - оставьте ссылку.
Весь материал на сайте носит ознакомительный характер,
за его использование другими людьми, автор ответственности не несет.

Рейтинг@Mail.ru
Рейтинг@Mail.ru Яндекс.Метрика





Поддержать автора и проект