Кратко на примерах попробуем проанализировать метрики
В будущем он пригодится для настройки правил оповещения 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 секунд в будущее