В современном мире IT инструменты мониторинга стали неотъемлемой частью успешного управления инфраструктурой. Один из таких инструментов – Prometheus, система мониторинга и сбора метрик с открытым исходным кодом. Она завоевала популярность среди пользователей благодаря своей гибкости и мощности. Однако чтобы раскрыть все возможности этой системы, необходимо изучить ее язык запросов – Prometheus Query Language (PromQL). В этом гайде мы погрузимся в основы PromQL, разберем его синтаксис и научимся составлять эффективные запросы для мониторинга и анализа данных.
Понимание PromQL
PromQL, или Prometheus Query Language, представляет собой язык запросов, который был создан специально для работы с метриками в системе Prometheus. В основе PromQL лежит концепция метрики, которая включает в себя ряд функций для обработки агрегированных и усредненных данных. Этот метод обеспечивает баланс между точностью и эффективностью, позволяя обрабатывать данные без строгого привязывания к их математическим значениям.
Вместо того чтобы анализировать каждое значение в больших наборах данных, PromQL позволяет извлекать приблизительные, но информативные показатели из различных источников, таких как файлы проекта. Полученные данные нельзя напрямую использовать в программах из-за их усредненного характера, но они идеально подходят для визуального представления и анализа.
Важность такого подхода проявляется особенно ярко при работе с огромными объемами информации, так как их обработка может привести к задержкам и ошибкам. Поэтому использование агрегированных метрик в PromQL становится ключевым инструментом для обеспечения эффективности и стабильности системы мониторинга.
Запросы и работа с метриками
Метрика в контексте PromQL – это ни что иное, как временной ряд. Он являет собой упорядоченную последовательность данных, которые были зарегистрированы на протяжении определенного временного интервала. Для понимания представьте себе записи значений за каждый день: первый, второй, третий и так далее – все это укладывается в структурированную таблицу. Доступ к этим значениям в любой заданный момент времени можно осуществить через запрос.
Интересно, что содержание данных может колебаться в зависимости от времени и условий. Здесь метрика играет ключевую роль, предоставляя возможность определить усредненное или средневзвешенное значение за интересующий промежуток.
Такое представление данных позволяет легко трансформировать их в графический вид, который демонстрирует динамику изменений значений во времени. А при использовании нескольких метрик одновременно вы можете наблюдать несколько наложенных графиков, что делает динамику и взаимосвязи между различными данными еще более наглядными. С PromQL все эти операции становятся интуитивно понятными и удобными в реализации.
Примеры простых запросов
Начать можно с самого базового запроса:
http_requests_total
На первый взгляд, этот запрос может показаться слишком простым, поскольку он состоит только из имени метрики. Однако не стоит обманываться его краткостью. При выполнении этого запроса Prometheus возвращает все значения, ассоциированные с метрикой http_requests_total. То есть он не только простой, но и эффективный.
Важно понимать, что PromQL ориентирован на операции с данными. Поэтому когда вы выполняете запрос, язык автоматически агрегирует результаты, представляя их в виде удобной таблицы или списка. При желании их можно легко преобразовать в график, демонстрирующий динамику значений в зависимости от времени или других параметров.
Извлечение метрики с определенными метками
http_requests_total{job="prometheus",group="canary"}
В этом запросе job и group не являются какими-то особыми операторами или ключевыми словами в PromQL. Они служат метками, которые помогают уточнить, какие именно данные нам нужны из большой таблицы метрик. В данном контексте job и group указывают на конкретные значения меток, связанные с метрикой http_requests_total. Результат такого запроса в терминологии PromQL называется «мгновенным вектором» (instant vector) – это набор данных, которые представлены в виде таблицы, где каждая строка имеет свой уникальный вектор изменений.
Формат запросов с использованием квадратных скобок
Квадратные скобки в PromQL не являются случайным символом. Они используются для указания временного интервала.
http_requests_total{job="prometheus",group="canary"}[1m]
В представленном запросе интервал [1m] означает «за последнюю минуту». Таким образом, мы не просто извлекаем текущие значения по заданным меткам, но и получаем историю изменений за определенный период времени. Результат этого запроса в терминологии PromQL называется «диапазонным вектором» (range vector). Это срез данных за указанный временной промежуток, представляющий собой часть большой таблицы метрик.
Основные типы данных в PromQL
В PromQL, как и в некоторых классических языках программирования, существует два фундаментальных типа данных:
- строки;
- числа.
В контексте метрик каждая отдельная точка данных представлена единственным числовым значением. С другой стороны, строки в PromQL чаще всего ассоциируются с векторами, которые представляют собой набор данных или, если говорить проще, строку в таблице.
Структурирование выражений и взаимодействие с API
На базе основных типов данных в PromQL можно создавать более сложные, пользовательские структуры. Выше мы уже упоминали один из таких типов – векторы. Еще один ключевой тип – это матрицы, которые представляют собой объемные двумерные массивы данных. Все метрики, с которыми мы работаем в PromQL, базируются на этих матрицах.
Взаимодействие с такими структурами напоминает анализ и составление финансовых отчетов, где каждая ячейка и столбец имеет свою ценность и смысл. Можно сказать, что работа с метриками в PromQL похожа на анализ бухгалтерских таблиц.
Подробнее о типе instant vector
Давайте подробнее рассмотрим тип данных «мгновенный вектор» (instant vector). В сущности, это вектор, который по заданному ключу (key) быстро предоставляет соответствующие значения метрики (value).
Главное преимущество такого подхода заключается в удобстве работы с временными рядами. Каждый мгновенный вектор строго привязан к своему интервалу, что исключает возможность случайного вызова или перепутывания метрик. Вы работаете только с той информацией, которая в данный момент активна и загружена в систему.
Стоит отметить, что принцип работы с мгновенными векторами не уникален только для Prometheus. Аналогичная концепция также применяется в инструментах визуализации данных, таких как Grafana. Эта платформа специализируется на создании наглядных графиков на основе больших наборов данных. По умолчанию, при запросе к метрике, Grafana извлекает данные за последние пять минут, формируя мгновенный вектор.
Пример данных во времени
Давайте рассмотрим представленный набор данных, записанных в разные моменты времени. Важно заметить, что данные зарегистрированы с высокой точностью, практически до долей миллисекунды, что отражает машинное время:
{__name__="http_requests_total",instance="app1"} |
1615973700 |
0 |
{__name__="http_requests_total",instance="app2"} |
1615973700 |
0 |
{__name__="http_requests_total",instance="app1"} |
1615973730 |
0 |
{__name__="http_requests_total",instance="app2"} |
1615973730 |
1 |
{__name__="http_requests_total",instance="app1"} |
1615973760 |
1 |
{__name__="http_requests_total",instance="app2"} |
1615973760 |
4 |
{__name__="http_requests_total",instance="app1"} |
1615973790 |
3 |
{__name__="http_requests_total",instance="app2"} |
1615973790 |
7 |
{__name__="http_requests_total",instance="app1"} |
1615973820 |
4 |
{__name__="http_requests_total",instance="app2"} |
1615973820 |
10 |
Если мы обратимся к данным без указания конкретного приложения (app1 или app2) для временного интервала 1615973760, то система предоставит информацию по обоим приложениям:
http_requests_total |
(1615973760, 1) и (1615973760, 4) |
Однако при желании можно запросить данные только для конкретного приложения:
ttp_requests_total{instance="app1"} |
(1615973790, 3) |
Здесь мы видим значение для времени 1615973790, извлеченное из нашего набора данных. Особенность работы системы заключается в том, что даже при запросе данных для несуществующего временного интервала, система не вернет ошибку. Вместо этого она автоматически выберет наиболее близкий доступный интервал, демонстрируя гибкость и способность к адаптации при работе с данными.
Работа с селекторами мгновенных векторов (instant vectors)
При необходимости в PromQL можно точно настраивать выборку данных, используя разнообразные селекторы для отбора нужных записей метрики:
http_requests_total{environment=~"staging|testing|(dev.*)", method!="GET"}
В этом запросе:
- мы ищем записи, где значение метки environment соответствует одной из строк «staging», «testing» или начинается с «dev»;
- также мы исключаем записи с методом «GET»;
- оператор =~ используется для сравнения по регулярному выражению;
- оператор != означает неравенстёво.
В PromQL доступны и другие операторы, такие как !~, которые позволяют выполнять сравнение как числовых, так и строковых значений.
Подробнее о типе range vector
Выше мы уже писали, что тип range vector представляет собой собрание значений за определенный временной интервал. В сущности, это срез данных из большой метрики, который сгруппирован за конкретный период. Результаты, которые он возвращает, представлены в формате пары ключ-значение, оформленные в виде строковых записей. Эта структура позволяет легко анализировать и интерпретировать динамику изменений в данных на протяжении времени.
Применение понятия производной в анализе данных
Производная показывает скорость изменения функции и рассчитывается как отношение изменения функции к небольшому изменению ее аргумента.
Математическая формула выглядит следующим образом:
( f(x+0.1) - f(x) ) / 0.1
В контексте наших метрических данных, где значения представлены в дискретной форме, уменьшение временного интервала между последовательными значениями не обязательно приводит к увеличению точности. Таким образом, можно использовать фиксированные, небольшие временные интервалы, например, 0.1 секунды.
Для расчета производной нужны всего два значения функции. Но если у нас есть range vector, мы можем вычислить производную для каждой пары последовательных значений, создав таблицу скоростей изменений. Это позволяет также построить график, который отображает, насколько быстро параметр меняется во времени.
Использование селекторов для range vector
Для извлечения диапазонного вектора range vector используется запрос с квадратными скобками в конце:
http_requests_total{job="prometheus"}[5m]
Этот запрос возвращает метрику за указанный интервал времени. Чем меньше вы выбираете интервал, тем более детализированными и точными будут результаты, так как каждое значение за этот период учитывается и вносится в итоговую таблицу. Временной интервал служит шагом для этой таблицы.
Если выбран маленький интервал, график, построенный на основе полученных данных, будет иметь резкие пики и падения, отражая все мельчайшие колебания параметра. Однако при больших интервалах график становится более сглаженным и представляет собой обзорный вид, позволяя увидеть основной тренд, хотя он теряет некоторые детали.
Анализ данных с различными интервалами
Рассмотрим одну и ту же таблицу данных, но извлечем из нее значения с различными временными интервалами (одна минута и две минуты).
При запросе с интервалом в одну минуту:
http_requests_total{instance="app1"}[1m]
Время (unix timestamp) |
Значение (double) |
Предыдущие значения за 1 минуту |
1615973700 |
0 |
[] |
1615973730 |
0 |
[0] |
1615973760 |
1 |
[0, 0] |
1615973790 |
3 |
[0, 1] |
1615973820 |
4 |
[1, 3] |
При запросе с интервалом в две минуты:
http_requests_total{instance="app1"}[2m]
Время (unix timestamp) |
Значение (double) |
Предыдущие значения за 2 минуты |
1615973700 |
0 |
[] |
1615973730 |
0 |
[0] |
1615973760 |
1 |
[0, 0] |
1615973790 |
3 |
[0, 0, 1] |
1615973820 |
4 |
[0, 0, 1, 3] |
Из приведенных таблиц видно, что при увеличении временного интервала, количество значений в колонке «Предыдущие значения» увеличивается. Это подтверждает, что при более широком временном интервале в выборку попадает больше значений (что и ожидалось). Также это подчеркивает тот факт, что диапазонные векторы разных интервалов могут иметь разные размеры.
Настройка интервала данных
В PromQL есть несколько ключевых функций и переменных, которые помогут вам определиться с выбором интервала:
- Если вы проводите ручной анализ данных в ходе экспериментов и хотите получить обобщенный обзор поведения графика, лучше выбрать более продолжительный интервал. Это позволит увидеть общую картину.
- Если ваша цель – наблюдать за динамичными колебаниями значений, выберите более короткий интервал. Но не меньше 1 минуты, учитывая что 2*scrape_interval равен 30 секундам.
- Когда речь идет о создании запросов в Grafana, важно учитывать масштаб дисплея. В таком случае рекомендуется использовать переменную $__rate_interval, но избегать $__interval.
- Если вашей основной системой является Clickhouse, имейте в виду некоторые ограничения из-за ошибок в парсере запросов. В этом случае вместо стандартных графановских интервалов вы можете использовать собственные настройки.
Выбор конкретного интервала зависит от целей вашего анализа и того, как вы хотите визуализировать данные. В некоторых случаях может быть полезно «растянуть» график для детального рассмотрения пиков и колебаний. В других ситуациях для обзорного представления лучше сделать график более компактным и плавным.
Для глубокого погружения в эти аспекты, особенно с учетом специфики работы Grafana, потребуется целая отдельная статья с примерами. Поэтому в данном обзоре мы ограничимся лишь краткими рекомендациями.
Различные типы данных в API и их визуализация
В рамках работы с API Prometheus, основные типы данных подразделяются на те же стандартные векторы (vector) и матрицы (matrix).
Важно отметить, что один и тот же запрос может давать различные результаты в зависимости от того, как вы решите визуализировать данные:
- в табличной форме (Table);
- в виде графика (Graph).
Это различие объясняется тем, что данные могут интерпретироваться и отображаться по-разному в зависимости от выбранного метода визуализации. Одни и те же метрики могут отличаться между собой, если они представлены в виде графика или таблицы. Такое разнообразие форматов нужно для того, чтобы удовлетворить разные потребности пользователей и обеспечить наибольшую наглядность и удобство при работе с данными.
Основы метрики
Когда мы делаем запрос без использования квадратных скобок, результатом будет единственное текущее значение, также известное как instant vector.
Пример такого запроса:
http_requests_total{instance="app1"}
Этот запрос вернет текущее значение запросов для инстанса «app1», предоставляя мгновенный снимок этой метрики.
Работа с матрицами в PromQL
В контексте PromQL, матрица данных обычно представляется как range vector. В отличие от простых векторов, матрицы добавляют дополнительную измерительность, которая часто используется для представления временных рядов. В некоторых других контекстах, например в JavaScript, матрица может быть представлена как структура данных с дополнительными метаданными, такими как заголовки столбцов.
В качестве примера возьмем вектор [2,3,4]. Мы можем добавить дополнительную координату, например «1», чтобы представить его в виде матрицы. В результате получаем (1,[2,3,4]). Однако в системе PromQL, это представление может быть упрощено до [1,2,3,4], где первое число функционирует как метка или заголовок строки.
Такая структура не только улучшает читаемость и обработку данных, но и обеспечивает гибкость при работе с многомерными наборами данных в различных системах анализа.
Построение графика в PromQL
Для визуализации данных в графической форме в PromQL необходимо работать с матрицами, даже если исходный запрос представлен в виде единичного вектора. В ответ на запросы, которые представлены в графической вкладке, результат всегда будет представлен в формате матрицы. В ней каждый элемент являет собой пару значений – момент времени и соответствующее ему значение метрики.
Например:
[(timestamp1, 1), (timestamp2, 10), ...]
В этом контексте значения «timestamp» представляют временные метки, ассоциированные с каждым измеренным значением метрики. Это позволяет создать временной ряд, который можно затем визуализировать на графике.
Суть в том, что графическая вкладка Prometheus оптимизирована для работы именно с матрицами, игнорируя другие типы данных. Такой подход обеспечивает непрерывное и последовательное представление данных в виде графика.
Обработки ошибок в PromQL
В работе с PromQL редко возникают ошибки. Вместо этого язык часто предоставляет усредненные значения, чтобы гладко обработать возможные непредвиденные ситуации. Однако есть исключения, когда вы можете столкнуться с ограничениями.
Например, попытка создания графика на основе двумерного запроса в графической вкладке:
http_requests_total{instance="app1"}[1m]
Такой запрос предполагает создание двумерной диаграммы с дополнительной третьей координатой. Однако это представление данных выходит за рамки функционала Prometheus, который предназначен для работы с двумерными (плоскими) структурами данных.
Простейшие операторы языка PromQL
Теперь давайте разберем простейшие операторы языка PromQL.
Оператор Offset
Одним из фундаментальных операторов в PromQL является offset. Несмотря на техническое название, его основная задача проста – он позволяет «переместить» временную шкалу метрики на определенный интервал назад.
Например:
http_requests_total offset 1d
В данном запросе «1d» означает интервал в один день. То есть он возвращает данные метрики «http_requests_total» за день до текущего момента.
Использование вложенных запросов
В PromQL есть возможность использовать вложенные запросы, что позволяет создавать сложные комбинации и оптимизировать выборку данных. Часто такие вложенные структуры применяются при формировании пользовательских типов матриц или при необходимости провести предварительную обработку данных перед основным запросом.
Помимо вложенных запросов, в PromQL имеются и стандартные логические операторы, характерные для большинства языков программирования. Они позволяют строить условные выражения и управлять потоком данных.
Оператор OR
OR – это один из ключевых операторов в PromQL. Он позволяет совершать выборки данных по нескольким условиям одновременно.
Пример:
http_requests_total{app=~"apache|nginx|iis.*"}
В данном запросе символы =~ представляют собой регулярное выражение, что позволяет искать соответствие одному из предложенных шаблонов: «apache», «nginx» или начинающемуся на «iis». Таким образом, этот запрос вернет результаты для любого из этих приложений.
AND
Оператор AND в PromQL используется для выполнения запросов, которые удовлетворяют нескольким условиям одновременно. Это позволяет получить более точные и конкретные результаты.
Например:
# найдет все tag, начинающиеся на aaa И заканчивающиеся на bbb metric{tag=~"aaa.*", tag=~".*bbb"}
В этом запросе мы ищем метрику с тегами, которые начинаются на «aaa» и одновременно заканчиваются на «bbb». Несмотря на то что в запросе используются два регулярных выражения с оператором =~, их комбинация обеспечивает выполнение обоих условий. Это эквивалентно логическому AND.
JOIN
Оператор JOIN в PromQL предназначен для объединения элементов в строку или вектор. Хотя на первый взгляд это может показаться простой задачей, синтаксис этой операции может быть несколько сложным и требует более глубокого погружения в детали.
Операторы и группировки
PromQL предоставляет мощные инструменты для работы со сложными запросами, включая различные операторы и функции группировки. Одним из преимуществ этого языка является наличие встроенных операторов, которые упрощают обработку и анализ данных.
Например:
metric{tag="value"} * 10 >= 50
Данный запрос умножает все значения указанной метрики на 10 и фильтрует результаты, оставляя только те, которые больше или равны 50. Такой результат можно получить без сложных программных конструкций или циклов.
Другие примеры:
metric1 and metric2{tag="something"} total_ram{instance="host"} - free_ram{instance="host"}
Эти запросы иллюстрируют возможности PromQL по работе с несколькими метриками одновременно, находя пересечение данных или вычисляя разницу между значениями. Например, чтобы определить использование оперативной памяти.
Все, что требуется от пользователя, – это знание доступных операторов и функций. С их помощью можно строить сложные запросы, учитывая специфику вашей системы мониторинга.
Агрегация
Агрегация – это метод, позволяющий комбинировать несколько графиков или метрик в одну цельную единицу. Ее удобно использовать для представления общей картины, особенно когда необходимо анализировать несколько метрик вместе. В PromQL для этого используются специализированные операторы.
Рассмотрим примеры:
http_requests_total{app="nginx"} http_requests_total{app="apache"}
Это разные временные ряды, и если рисовать их с помощью запроса http_requests_total, то получится две разные линии.
Чтобы объединить значения из разных метрик нужно использовать агрегацию. Например, функцию sum:
sum(http_requests_total)
Также возможно агрегировать данные по определенным тегам или лейблам:
sum by (app, instance) (http_requests_total)
Или исключить ненужные теги из результата:
sum without (instance) (http_requests_total) # или поменять местами: sum (http_requests_total) without (instance)
Гибкость PromQL позволяет использовать операторы в различных комбинациях, и система все равно корректно интерпретирует запрос:
sum (http_requests_total) by (app, instance)
Кроме этого, существуют и другие полезные функции, такие как объединение метрик (or) и дополнение результатов там, где отсутствуют значения (unless).
Функции
В отличие от базовых операторов, функции в PromQL выполняют более сложные операции и возвращают конкретные числовые результаты. Это аналогично работе большинства языков программирования, где каждая функция предназначена для выполнения определенного набора задач и возвращения определенного результата.
rate (range vector)
Функция rate в PromQL используется для преобразования графика из отдельных точек в непрерывную кривую.
Например:
rate(http_requests_total{app="nginx"}[5m])
Это особенно полезно, когда необходимо визуализировать тенденцию изменения данных, исключив отдельные выбросы или шум. Можно сказать, что это инструмент для создания более наглядных графиков, например, для демонстрации на презентациях.
Основные характеристики функции rate:
- Может обнулить начальную точку временной шкалы на графике, чтобы сосредоточить внимание на динамике изменения.
- Осуществляет экстраполяцию данных, предоставляя будущее прогнозирование на основе текущих данных.
- Автоматически рассчитывает темпы роста, помогая лучше понять динамику представленных данных.
- Применяется в основном для мониторинга увеличивающихся значений (например, счетчиков).
Таким образом, функция rate предоставляет интуитивно понятный способ анализа и представления данных в PromQL.
increase (range vector)
Функция increase в PromQL представляет собой разновидность функции rate, но ориентирована на конкретные интервалы времени:
rate(http_requests_total{app="nginx"}[5m])
Она вычисляет прирост (или уменьшение) значения параметра в течение заданного интервала, что позволяет легко увидеть динамику изменений на определенном промежутке. Можно настроить increase на использование различных временных интервалов для анализа, что дает возможность гибко адаптироваться к разным сценариям мониторинга.
При сравнении функций rate и increase на больших интервалах, результаты будут схожими, если учесть соответствующие коэффициенты преобразования.
Например:
rate(metric[1h]) increase(metric[1h])/3600
В большинстве случаев эти функции дают сопоставимые результаты. Но стоит помнить, что при использовании increase результат будет представлять собой абсолютное изменение, тогда как rate показывает средний темп изменения в единицу времени.
delta (range vector)
Функция delta в PromQL представляет собой уникальный инструмент, который позволяет определить разницу между начальным и конечным значениями в заданном временном интервале. Она создана для работы с теми метриками, где важно отслеживать именно изменение значения, а не его динамику:
delta(ram_free{host="postgresql"}[5m])
В отличие от rate и increase, функция delta не концентрируется на скорости изменения, а фокусируется на абсолютной разнице. Это делает ее идеальным выбором для метрик, где необходимо отслеживать резкие изменения, например, пики или спады.
Основные особенности функции delta:
- Экстраполяция данных – delta может делать предсказания на основе текущих тенденций, используя доступные данные.
- Взаимодействие с метрикой типа gauge – в отличие от counter, который может только увеличиваться, gauge позволяет учитывать метрики, изменяющиеся в любом направлении (рост, падение или колебание).
Это делает delta универсальным инструментом для анализа разнообразных метрик в системе Prometheus.
deriv (range vector)
Функция deriv в PromQL предоставляет возможность вычисления производной для метрик, что позволяет определить темп изменения значения метрики в течение заданного временного интервала. Эта функция особенно полезна для анализа «скачущих» графиков, где динамика изменения значений происходит неоднородно:
deriv(ram_free{host="postgresql"}[5m])
Однако стоит заметить особенность функции deriv – при наличии нулевых значений метрики могут возникнуть некорректные вычисления или даже ошибки. Это связано с тем, что производная от резко меняющихся функций может давать неожиданные результаты, особенно если есть резкие перепады до или от нуля.
Основные особенности функции deriv:
- Фокус на темпе изменения – позволяет увидеть, насколько быстро значение метрики изменяется, что особенно полезно для определения аномальных пиков или провалов.
- Работа исключительно с метриками типа gauge – в отличие от многих других функций PromQL, deriv разработан специально для работы с метриками, которые могут колебаться в обе стороны, не только расти.
histogram_quantile (instant vector)
Функция histogram_quantile предоставляет инструмент для создания и анализа гистограмм в PromQL. В то время как графики предоставляют визуализацию данных во времени, гистограммы иллюстрируют распределение данных по определенным значениям. Особенность гистограмм заключается в том, что они представляют собой столбцы, отображающие частоту или количество данных для каждого интервала значений.
Пример использования функции:
histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))
Этот запрос позволяет вычислить 95-й перцентиль времени ответа на запросы, основываясь на данных из гистограммы http_request_duration_seconds_bucket за последние 5 минут.
Более сложный запрос может агрегировать данные по определенным меткам:
histogram_quantile( 0.95, sum by (url, le) ( rate(http_request_duration_seconds_bucket[5m]) ) )
Таким образом, функция histogram_quantile позволяет не только визуализировать гистограммы, но и проводить глубокий анализ данных, вычисляя такие статистические показатели, как перцентили. Одно из преимуществ этого подхода в PromQL заключается в возможности сохранения промежуточных вычислений, что добавляет гибкости в анализ данных и предотвращает потерю информации. Это может быть актуально при работе с другими инструментами.
aggr_over_time (range vector)
В PromQL есть набор функций для выполнения агрегаций над временными рядами, которые представляют собой диапазоны значений метрик (range vectors). Эти функции позволяют извлекать статистически значимую информацию из данных за определенный временной интервал:
avg_over_time min_over_time max_over_time sum_over_time count_over_time quantile_over_time stddev_over_time (отклонение) stdvar_over_time (дисперсия)
Эти функции анализируют и усредняют значения в заданном временном интервале, делая их идеальными для анализа трендов и выявления статистических характеристик данных. Например, они могут быть использованы для определения среднего использования ресурсов сервером за последний час или для определения максимальной загрузки системы за последние сутки.
Бонус
Теперь небольшой совет для тех, кто только начинает изучать PromQL. Многие новички сталкиваются с трудностями при первой попытке создать метрику. И ирония здесь в том, что проблема часто кроется не в сложности языка, а наоборот – в его поразительной простоте. Возможно, вам покажется, что вы что-то делаете неправильно, когда на самом деле все гораздо проще, чем кажется.
(не) Персистентность
Важный момент работы с некоторыми программами – их «забывчивость». Например, при перезапуске приложения или компьютера сохраненные метрики исчезают, и пользователю приходится снова вводить параметры или устанавливать таймеры с начала. Из-за этой особенности иногда нет смысла доводить метрику до совершенства или лучше просто избегать перезапуска приложения во время важных операций.
Реплики приложения
Рассмотрим проблему, которая может возникнуть из-за минималистичности кода – при одновременном запуске нескольких реплик (или копий) одной и той же метрики система может столкнуться с проблемой определения, какой именно экземпляр следует обрабатывать.
Из-за этой неопределенности могут возникать ошибки, так как реплики могут быть идентичными:
# реплика 1: api_http_requests_total{method="POST", url="/login"} 2 # реплика 2: api_http_requests_total{method="POST", url="/login"} 3
Время (unix timestamp) |
Значение (double) |
1615973700 |
2 |
1615973701 |
3 |
1615973730 |
2 |
1615973731 |
5 |
Здесь мы видим, что в близлежащие моменты времени приходят разные значения метрик. Это может произойти из-за того, что реплики представляют собой версии одной и той же метрики, но с небольшим сдвигом по времени.
Чтобы избежать таких конфликтов, рекомендуется внимательно следить за активными репликами и, при необходимости, вводить в код специальные маркеры или уведомления. Это поможет сохранить порядок и предотвратить ошибки. Несмотря на эти особенности, большинство задач управления метриками программа успешно выполняет автоматически, благодаря интуитивным командам.
Заключение
Для успешного освоения языка PromQL достаточно понимать его основные принципы и логику. Это даст прочную основу для дальнейшего изучения и использования. Основное, что выделяет PromQL среди инструментов мониторинга, таких как Grafana, заключается в акценте на обработку и анализ данных, а не просто на их визуализацию. То есть главный упор делается на глубокое понимание данных и их интерпретацию, а не только на красочное отображение.
Комментарии