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

Навигация

⇒ FreeBSD and Nix ⇐

CISCO

Voice(Asterisk\Cisco)

Microsoft

Powershell

Python

SQL\T-SQL

Общая

WEB Разработка

ORACLE SQL \ JAVA

Мото

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

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


Prometheus часть 4 типы данных и язык запросов PromQL


Prometheus часть 4 типы данных и язык запросов PromQL 

В продолжение к статье:

http://snakeproject.ru/rubric/article.php?art=prometheus_3_09072024

Кратко на примерах попробуем проанализировать метрики
В будущем он пригодится для настройки правил оповещения alert


Типы данных prometheus

Выводим метрики прометея и ранее установленного node_exporter:
# curl localhost:9090/metrics

# curl localhost:9100/metrics
...
# HELP ...
# TYPE node_disk_reads_completed_total counter
node_disk_reads_completed_total{device="vda"} 325190
...

HELP - комментарий к метрике
TYPE - тип метрики (аналог - тип переменной)

Prometheus имеет 4 типа метрик

Counter - счетчик
Значение метрики не может уменьшаться
При запросе будет увеличиваться на единицу
Примеры метрик:

  • http_requests_total{url="/"} 5
  • http_errors{status="404", url="/admin"} 15

Gauge - счетчик
Может увеличиваться и уменьшаться
Примеры метрик:

  • disk_free_bytes{path="/var/log/"} 4657678
  • disk_free_bytes{path="/tmp/"} 135673

Histogram - гистограммы
Несколько данных метрики - общее количество значений, сумма, разбивка по группам
Значения рассчитываются на стороне сервера
le - лейбл, который генерируется из бакетов, "less than or equal", т.е. <=
_bucket с различными группами - {le} - показывает сколько измерений попало в ту или иную группу
Пример: http_duration_bucket{url="/", le="10"} 140
# HELP http_request_duration_секунды Гистограмма длительности запроса
В группу le=10 (то есть время длительности запроса 10 секунд или менее) попало 140 запросов
Примеры метрик:

  • http_duration_bucket{url="/", le="0.1"} 100
  • http_duration_bucket{url="/", le="1"} 120
  • http_duration_bucket{url="/", le="10"} 140
  • http_duration_bucket{url="/", le="+Inf"} 152
  • http_duration_sum{url="/"} 362.523  # сумма всех измерений
  • http_duration_count{url="/"} 7  # кол-во значений +1 каждого обновления гистограммы

Summary - аналогично гистограммам
Значения рассчитываются на стороне клиента
Метрика с quantile="0.95" говорит нам, что 95% запросов выполнялись быстрее, чем за 2.2 сек
Метрика с quantile="0.99" говорит нам, что 99% запросов выполнялись быстрее, чем за 4.3 сек
Метрика с quantile="0.5" говорит нам, что 5% запросов выполнялись быстрее, чем за 0.4 сек
Метрика с quantile="0.1" говорит нам, что 5% запросов выполнялись быстрее, чем за 0.1 сек
Примеры метрик:

  • http_duration_summary{quantile="1"} 100
  • http_duration_summary{quantile="0.99"} 4.301
  • http_duration_summary{quantile="0.95"} 2.203
  • http_duration_summary{quantile="0.5"} 0.432
  • http_duration_summary{quantile="0.1"} 0.101
  • http_duration_summary_sum 288.345  # сумма всех значений
  • http_duration_summary_count 25  # кол-во значений +1 каждого обновления гистограммы


Фильтры по данным

Общий синтаксис:
metric_name{tag_1="data_1", tag_2="data_2"} X

Где:

  • имя метрики - metric_name
  • в скобках {} указываются теги - tag_1="data_1", tag_2="data_2"
  • значение метрики - X

Вывести крайнее значение любой метрики по имени (на примере метрики up):
# ./promtool query instant http://localhost:9090/ up
up{instance="localhost:8080", job="app"} => 1 @[111.111]
up{instance="localhost:9090", job="prometheus"} => 1 @[222.222]

Вывести по тегу __name__, который содержит имя метрики (применен regexp):
# ./promtool query instant http://localhost:9090/ "{__name__=~'^up$'}"
up{instance="localhost:8080", job="app"} => 0 @[111.111]
up{instance="localhost:9090", job="prometheus"} => 1 @[222.222]

Отфильтровать значения по тегам:
# ./promtool query instant http://localhost:9090/ "up{job='app'}"
up{instance="localhost:8080", job="app"} => 1 @[111.111]

Отфильтровать значения по тегам с отрицанием:
# ./promtool query instant http://localhost:9090/ "up{job!='prometheus'}"
up{instance="localhost:8080", job="app"} => 1 @[111.111]

Отфильтровать значения по тегам с regexp:
# ./promtool query instant http://localhost:9090/ "up{job=~'^a.p$'}"
up{instance="localhost:8080", job="app"} => 1 @[111.111]

Отфильтровать по значениям (в примере все метрики up, у которых значение равно 1):
# ./promtool query instant http://localhost:9090/ "up == 1"
up{instance="localhost:8080", job="app"} => 1 @[111.111]
up{instance="localhost:9090", job="prometheus"} => 1 @[222.222]

Выше мы увидели, что возможность добавлять теги можно использовать в качестве разделения на среды:
env="dev" или env="prod"
Это очень удобно и гибко с точки зрения анализа данных и правил оповещения


Типы данных promql

Instant Vector - несколько time series метрик, значение за определенное время:
# ./promtool query instant http://localhost:9090/ up
up{instance="localhost:8080", job="app"} => 1 @[111.111]
up{instance="localhost:9090", job="prometheus"} => 1 @[222.222]
Значение метрики up - timestamp - 111.111 и 222.222

Range Vector - несколько time series метрик, несколько значений за определенный интервал времени:
# ./promtool query instant http://localhost:9090/ "up[1m]"
up{instance="localhost:8080", job="app"} =>
1 @[110.110]
1 @[111.111]
up{instance="localhost:9090", job="prometheus"} =>
1 @[221.221]
1 @[222.222]
Значение метрики up за последнюю минуту (указываете временной промежуток в квадратных скобках)
Перед квадратными скобками можно использовать фильтрацию по тегам:
# ./promtool query instant http://localhost:9090/ "up{job='app'}[1]"
up{instance="localhost:8080", job="app"} =>
1 @[110.110]
1 @[111.111]

Scalar - числа с плавающей запятой
Используйте их, например, прибавляя к метрикам или умножая на них, см. ниже


Операторы promql

Работают со скалярными величинами и между instant vector:

  • + сложение
  • - вычитание
  • * умножение
  • / деление
  • % модуль
  • ^ возведение в степень

Пример со скалярными величинами:
# ./promtool query instant http://localhost:9090/ "6 + 3"
scalar: 9 @[111.222]

Пример с добавлением значения метрике:
# ./promtool query instant http://localhost:9090/ "up + 1"
{instance="localhost:8080", job="app"} => 2 @[111.111]
{instance="localhost:9090", job="prometheus"} => 2 @[222.222]

Пример со складыванием двух instant vector:
# ./promtool query instant http://localhost:9090/ "up + up"
{instance="localhost:8080", job="app"} => 2 @[111.111]
{instance="localhost:9090", job="prometheus"} => 2 @[222.222]

Пример запроса, выводящего процент свободного места в разделе корня:
# node_filesystem_avail_bytes{mountpoint="/"} / (node_filesystem_size_bytes{mountpoint="/"} / 100)

Операторы агрегирования - позволяют агрегировать значения одного instant vector по тегам:

  • sum - суммирование
  • min - минимальное значение
  • max - максимальное значение
  • avg - среднее значение
  • count - количество элементов в векторе

Сумма всех значений всех метрик с именем up:
# ./promtool query instant http://localhost:9090/ "sum(up)"
{} => 2 @[333.333]

Взяли метрики с именем up, сгруппировали их по тегу job, просуммировали значения в каждой из групп:
# ./promtool query instant http://localhost:9090/ "sum by (job) (up)"
{job="app"} => 1 @[111.111]
{job="prometheus"} => 1 @[222.222]


функции promql

Функций довольно много в prometheus, разберем пару примеров

Функция rate:
- принимает на вход range vector
- берет разность последнего и первого значения
- делит их на количество секунд в интервале
- таким образом получаем скорость роста счетчика
- работает только с типом данных counter
Пример, среднее количество запросов за последние две минуты:
# ./promtool query instant http://localhost:9090/ "rate(prometheus_http_requests_total{}[3m])"
- prometheus взял текущее значение метрики prometheus_http_requests_total
- после вычел значение метрики prometheus_http_requests_total, которое было 2 минуты назад
- после поделил полученное значение на 180 секунд (3 минуты)
- так мы получили среднее количество запросов в секунду
- функция irate - делает все то же самое, но берет разность последнего и предпоследнего значения
- интервал для irate указывать нет смысла
- пример запроса, выводящего суммарный процент использования cpu в режиме user, просуммированный по instance:
(sum by (instance) (irate(node_cpu_seconds_total{mode='user'}[1m])) * 100)

Функция sum:
- проссуммируем количество запросов по одинаковым instance:
# ./promtool query instant http://localhost:9090/ "sum by (instance) (rate(prometheus_http_requests_total{}[3m]))"
- получили предыдущим примером с помощью rate количество запросов в секунду
- после этого сложили наши метрики по тегу instance - все у кого он совпадал были сложены
- так, примером выше мы вывели количество запросов в секунду по instance

Функция delta:
- работает только с типом метрик gauge
- рассчитывает разность первого и последнего значения в range vector, пример:
# ./promtool query instant http://localhost:9090/ "delta(prometheus_http_requests_total[3m])"
{instance="localhost:9090", job="prometheus"} => 0 @[33.22]
- delta возьмет последнее значение метрики prometheus_http_requests_total
- после вычтет из него значение метрики prometheus_http_requests_total 3х минутной давности

Функция predict_linear:
- работает только с типом метрик gauge
- "предсказывает" значение метрики на заданное количество секунд вперед, используя линейную регрессию
- создается прямая по средним значениям из прошлого, на ее основе "предсказываются" будущие значения:
# ./promtool query instant http://localhost:9090/ "predict_linear(prometheus_tsdb_blocks_loaded[60m], 3600)"
- predict_linear взяла значение метрики prometheus_tsdb_blocks_loaded за последние 60 минут
- попробовала предсказать значение на 3600 секунд в будущее

Больше функций для работы с 4 типами выше см. в документации:
https://prometheus.io/docs/prometheus/latest/querying/functions/

 


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

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

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

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

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





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