Prometheus — это мощный инструмент, используемый для сбора метрик с различных устройств. PromQL — это язык запросов, используемый для получения необходимых данных, используемых для анализа и графического представления с использованием таких инструментов, как Grafana.

Данные

Prometheus хранит данные в виде временных рядов. Каждая запись в Prometheus состоит из имени метрики, набора меток, временной метки UNIX и выборки, собранной с этой временной меткой.

В приведенном выше примере у нас есть метрика, которая отражает общее количество HTTP-запросов, выполненных к определенной конечной точке, и называется:

prometheus_http_requests_total

Эта метрика имеет список меток, одна из которых указывает код ответа HTTP, а другая — конечную точку (обработчик). Отметка времени указывает, что эта метрика выбиралась каждые 30 секунд.

Тип метрики

Теперь нам нужно понять, как Prometheus собирает данные. С точки зрения сервера Prometheus не существует различных типов метрик, и сервер использовал все данные как нетипизированные временные ряды. По крайней мере, на данный момент помните, что это может измениться в функции.

Различие существует только в клиентских библиотеках, используемых для сбора метрик. Итак, клиентские библиотеки имеют 4 типа метрик.

Счетчики, как следует из названия, используются для подсчета некоторых событий. Этот тип следует использовать для метрики, которая только увеличивается или может быть сброшена до нулевого значения. Например, счетчики запросов какой-либо конечной точки, сообщения, отправленные в очередь или тему, и т. д.

Датчик похож на счетчик, так как представляет собой одно числовое значение, но может увеличиваться и уменьшаться. Этот тип используется для представления использования ресурсов компьютера, например, процента памяти или процента использования ЦП в любой момент времени. Его можно использовать для представления количества экземпляров контейнера или количества потоков в определенный период времени. В этом случае он может подниматься и опускаться.

Гистограмма выборочные наблюдения, обычно продолжительность какого-либо события, например HTTP-запроса и ответа. Он выбирает их по частоте или количеству, помещая собранные значения в заранее определенные сегменты. Клиентская библиотека Prometheus использует набор сегментов по умолчанию (например, для клиентской библиотеки Go используются .005, .01, .025, .05, .1, .25, .5, 1, 2.5, 5, 10). Если требуются пользовательские значения для сегментов, их можно переопределить. Сегменты используются для отслеживания распределения атрибута по ряду событий.

На гистограмме собраны наблюдения (обычно такие, как продолжительность запроса или размер ответа), и они подсчитываются в настраиваемых сегментах. Он также предоставляет сумму всех наблюдаемых значений.

Сводка работает аналогично гистограмме, но вдобавок предоставляет некоторые дополнительные параметры. Например, общее количество наблюдений и сумма всех наблюдаемых значений. И он вычисляет настраиваемые квантили по скользящему временному окну.

Типы данных PromQL

Язык запросов Prometheus (PromQL) — это язык запросов, используемый для выбора и агрегирования данных, хранящихся в Prometheus, в режиме реального времени.

При запросе данных с помощью PromQL Prometheus будет представлять данные в 4 различных форматах: String, Scalar, Instant и Range векторы.

Тип Sstring представляет собой текст и в настоящее время не используется. Тип Scalar представляет числовые значения.

вектор с точки зрения Прометея — это набор связанных временных рядов. И вы помните, что Prometheus хранит все свои данные в виде временных рядов.

Мгновенный вектор представляет собой набор временных рядов, где каждая временная метка соответствует одной точке данных в этот «момент».

вектор диапазона не представляет только одно значение, как мгновенный вектор, он представляет собой набор значений, измеренных между двумя временными метками. Квадратные скобки используются для указания временного диапазона (длительности).

Запустите Prometheus локально

Самый простой способ узнать, как работает PromQL, — это создать экземпляр Prometheus на локальном компьютере с помощью Docker и Docker Compose.

Файл docker-compose приведен ниже:

version: "3.8"

services:
  prometheus:
    container_name: prometheus
    image: prom/prometheus:v2.44.0
    user: root
    volumes:
      - ./prometheus:/etc/prometheus
    command:
      - --config.file=/etc/prometheus/prometheus-config.yaml
      - --log.level=debug
    ports:
      - "9090:9090"
    networks:
      - prometheus-network

networks:
 prometheus-network:

Этот файл определяет один контейнер на основе образа Prometheus Docker версии 2.44. В этом контейнере сопоставлен один том, содержащий файл конфигурации Prometheus. Файл конфигурации ниже:

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'prometheus'
    scrape_interval: 5s
    static_configs:
      - targets: ['localhost:9090']

Этот файл определяет конфигурацию очистки. На его основе Prometheus будет собирать собственные метрики. Используя эти показатели, мы можем выполнять различные запросы.

Чтобы создать контейнер, выполните следующую команду из каталога, где находится файл docker-compose:

docker compose up

Теперь доступ к пользовательскому интерфейсу Prometheus можно получить с помощью браузера по адресу:

http://localhost:9090

Селекторы временных рядов

Чтобы выбрать конкретный мгновенный вектор, проще всего ввести его имя в приглашении:

Как видите, этот запрос вернул более одного результата. Для выбора необходимой информации мы можем использовать селекторы меток. Эти селекторы заключаются в фигурные скобки, добавляемые после имени метрики.

prometheus_http_requests_total{l1=v1,ln=vn}

Например, если требуется выбрать метрику с меткой «обработчик», равной «/metrics», мы используем следующий синтаксис:

prometheus_http_requests_total{handler="/metrics"}

К селекторам меток можно применять следующие операторы:

                   | Operator | Meaning              |
                   | -------- | -------------------- |
                   | =        | equals               |
                   | !=       | not equals           |
                   | =~       | regex matches        |
                   | !~       | regex does not match |

Когда нам нужно выбрать все метрики, кроме одной, собранной из обработчика метрик, мы используем следующий запрос:

prometheus_http_requests_total{handler!="/metrics"}

Мы можем выбрать метрики по нескольким меткам, разделенным запятой. Рассмотрим такой запрос как запрос с оператором AND:

prometheus_http_requests_total{handler!="/metrics"}

Очень полезным оператором является оператор регулярного выражения, он позволяет создавать гибкие запросы, как показано ниже:

prometheus_http_requests_total{handler=~"/metrics|/graph"}

В этом запросе используется вертикальная черта (|), и он ведет себя как оператор ИЛИ.

Подстановочный знак можно использовать в выражениях регулярных выражений следующим образом:

prometheus_http_requests_total{handler=~".*v1.*"}

Этот запрос выбирает метрики, содержащие «v1» внутри обработчика меток. Подстановочный знак «.*» может быть применен спереди и сзади значения или и там, и там.

Все вышеперечисленные запросы относятся к векторам диапазонов, единственная дополнительная вещь, которую мы должны добавить, — это продолжительность, которая заключена в квадратные скобки. В скобках мы указываем число, за которым следует единица измерения времени.

                   | Unit     | Meaning       |
                   | -------- | --------------|
                   | ms       | milliseconds  |
                   | s        | seconds       |
                   | m        | minutes       |
                   | h        | hours         |
                   | d        | days (24h)    |
                   | w        | weeks (7d)    |
                   | y        | years (365d)  |

Единицы времени можно комбинировать следующим образом:

prometheus_http_requests_total{handler="/metrics"} [1m30s]

Модификатор смещения

Модификатор смещения используется для сдвига смещения времени для отдельных моментов и векторов диапазона в запросе.

prometheus_http_requests_total{handler="/metrics"} offset 10m

Этот запрос возвращает образец, сделанный на 10 минут раньше относительно текущего времени.

Запрос вернул результат, полученный 10 минут назад. Чтобы лучше понять, как это работает ниже, я выполнил запрос, который вернул вектор диапазона с диапазоном 11 минут. Когда мы получим метку времени и преобразуем ее в дату, это будут дата и время ровно 10 минут назад.

Точно так же смещение можно применить к вектору диапазона:

prometheus_http_requests_total{handler="/metrics"}[1m] offset 10m

Двоичные арифметические операторы

Следующие бинарные операторы могут применяться в PromQL со скалярными и мгновенными векторами.

                   | Operator | Meaning       |
                   | -------- | --------------|
                   | +        | addition      |
                   | -        | substraction  |
                   | *        | multiplication|
                   | /        | division      |
                   | %        | modulo        |
                   | ^        | power         |

При использовании со скалярными значениями это приведет к скалярному значению.

При применении со скалярным значением и мгновенным вектором скалярное значение применяется к каждому элементу мгновенного вектора.

prometheus_http_requests_total{handler=~".*v1.*"}+1

Когда мы применяем бинарный оператор к мгновенным векторам, результатом будет новый вектор, содержащий элементы, присутствующие в обоих векторах.

Операторы сравнения

Могут быть применены следующие операторы сравнения

                   | Operator | Meaning             |
                   | -------- | --------------------|
                   | ==       | equals              |
                   | !=       | not equals          |
                   | >        | grater-than         |
                   | <=       | less-than           |
                   | >=       | grater-than or equal|
                   | <=       | less-than or equal  |

Применение к скалярному значению даст логическое значение (0-ложь, 1-истина). При использовании этих операторов со скалярами мы должны добавить специальный модификатор «bool».

Когда оператор используется со скалярными и мгновенными векторами, результатом запроса будет новый вектор только со значениями, соответствующими примененному оператору.

prometheus_http_requests_total==7

Когда мы применяем оператор сравнения с мгновенными векторами, результатом будет новый вектор, содержащий элементы, которые присутствуют в обоих векторах.

Установить бинарные операторы

Может применяться только к мгновенным векторам:

| Operator|                     Meaning                                       |
| --------| ------------------------------------------------------------------|
| and     | new vector with element that matches in both                      |
| or      | new vector which is the union of all unique elements              |
| unless  | new vector which elements which are not present on the left side  |

При выполнении следующего запроса результат не будет найден, поскольку в обоих векторах нет совпадающих элементов.

prometheus_http_requests_total{handler="/api/v1/query"} AND prometheus_http_requests_total{handler="/metrics"}

При использовании оператора ИЛИ результат будет следующим

Этот запрос возвращает все элементы, присутствующие в обоих векторах. И запрос с оператором Unless возвращает элементы из левого вектора, которых нет в правом векторе.

Операторы агрегации

Prometheus имеет широкий набор операторов агрегирования, которые можно применять к мгновенным векторам. Агрегатор sum вычисляет сумму всех элементов вектора.

sum(prometheus_http_requests_total)

Агрегаторы Min и max вычисляют наименьшее и наибольшее значение в векторе:

min(prometheus_http_requests_total)

max(prometheus_http_requests_total)

avg вычисляет среднее значение вектора:

avg(prometheus_http_requests_total)

Агрегатор count возвращает количество элементов в векторе.

count(prometheus_http_requests_total)

Агрегатор count_values подсчитывает количество элементов в векторе с одинаковым значением.

count_values ("prometheus_http_requests_total", prometheus_http_requests_total)

Агрегатор tork возвращает n наибольших значений из вектора:

topk(2,prometheus_http_requests_total)

А нижний работает наоборот

bottomk(2,prometheus_http_requests_total)

Оператор group делает то, о чем говорит его название, группирует элементы и возвращает 1.

group(prometheus_http_requests_total)

Мы можем агрегировать вектор по определенным меткам, например, добавив модификатор «by».

sum(prometheus_http_requests_total) by (code)

Если мы хотим исключить некоторые метки, мы можем добавить специальный модификатор «без»:

sum(prometheus_http_requests_total) without (code)

Мы можем использовать агрегаторы с течением времени для векторов диапазона, таких как

avg_over_time(prometheus_http_requests_total[10s])

Этот агрегатор вычисляет среднее значение вектора в указанном диапазоне.

В Prometheus есть множество агрегаторов, которые можно применять к векторам диапазона. Это sum_over_time, min_over_time, max_over_time, count_over_time и многие другие.

Функции

Prometheus предлагает нам широкий спектр функций. Первая функция, которую мы собираемся проверить, отсутствует. Эта функция проверяет, имеет ли мгновенный вектор какие-либо элементы. Возвращает пустой вектор, если вектор, переданный этой функции, содержит элементы, и возвращает 1, если вектор не имеет значений.

absent(prometheus_http_requests_total)

Если нам нужно получить тот же результат, но для вектора диапазона, мы должны использовать следующую функцию:

В Prometheus есть математические функции, такие как abs, ceil и floor.

Функция clamp преобразует самые низкие значения в значение, указанное в качестве второго параметра, и преобразует самые большие значения, указанные в качестве третьего параметра.

clamp(prometheus_http_requests_total{handler=~"/metrics|/api/v1/labels|/api/v1/format_query"},3,6000)

На экране видно, что эта функция преобразовала самую высокую выборку с 6162 до 6000, а самую низкую — с 2 до 3.

Есть еще 2 версии этой функции clamp_min и clamp_max

clamp_min(prometheus_http_requests_total{handler=~"/metrics|/api/v1/labels|/api/v1/format_query"},3)
clamp_max(prometheus_http_requests_total{handler=~"/metrics|/api/v1/labels|/api/v1/format_query"},6000)

Эти функции сделают графику немного приятнее за счет удаления экстремальных пиков.

В Prometheus есть набор функций для работы с датой и временем, таких как день_месяца, день_недели,и другие.

День месяца возвращает день месяца (1–31) для каждой метки времени в формате UTC. И день недели возвращает день недели (1–7) для каждой метки времени в формате UTC.

Функция time возвращает значение, близкое к текущей отметке времени.

Функция timestamp возвращает метку времени, когда был выбран каждый элемент вектора.

timestamp(prometheus_http_requests_total)

Если нам нужно отсортировать мгновенный вектор, мы можем использовать функции sort и sort_desc. Первый сортирует вектор в порядке возрастания, а второй — в порядке убывания.

sort(prometheus_http_requests_total{handler=~"/metrics|/api/v1/labels|/api/v1/format_query"})
sort_desc(prometheus_http_requests_total{handler=~"/metrics|/api/v1/labels|/api/v1/format_query"})

Полный проект можно найти здесь:



Заключение

Это руководство посвящено PromQL, инструменту, который может помочь вам извлечь важную информацию из показателей вашей системы. Это также помогает создать визуализацию метрик и определить сигналы тревоги, которые предупредят вас о проблеме в вашей системе.

Спасибо за чтение! Пожалуйста, поставьте лайк и подпишитесь. Если у вас есть какие-либо вопросы или предложения, пожалуйста, не стесняйтесь писать в разделе комментариев или в моем аккаунте LinkedIn.

Станьте членом для полного доступа к контенту Medium.

Повышение уровня кодирования

Спасибо, что являетесь частью нашего сообщества! Перед тем, как ты уйдешь:

  • 👏 Хлопайте за историю и подписывайтесь на автора 👉
  • 📰 Смотрите больше контента в публикации Level Up Coding
  • 💰 Бесплатный курс собеседования по программированию ⇒ Просмотреть курс
  • 🔔 Подписывайтесь на нас: Twitter | ЛинкедИн | "Новостная рассылка"

🚀👉 Присоединяйтесь к коллективу талантов Level Up и найдите прекрасную работу