Язык запросов в 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>) - количество временных рядов
Как поднимаем прометея
Запускать прометея и экспортеры будем в контенерах
node-exporter предоставляет метрику node_cpu_seconds_total
(сколько секунд в каждом режиме работы по каждому ядру процессор провел времени)
Тип метрики - Counter(постоянно увеличивается с момента запуска)
Где:
Всего памяти — ~ 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 сек.
Комментарии пользователей
Эту новость ещё не комментировалиНаписать комментарий
Анонимам нельзя оставоять комментарии, зарегистрируйтесь!