Последнее обновление: августа 10, 2026

Редактор запросов PostgreSQL

Редактор запросов PostgreSQL позволяет создавать и выполнять запросы к вашему источнику данных. Общие концепции редактора запросов и преобразования данных см. в разделе Запрос и преобразование данных.

Вы можете открыть редактор запросов PostgreSQL со страницы Explore или с панели дашборда. Нажмите многоточие в правом верхнем углу панели и выберите Edit.

Note

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

Компоненты редактора запросов PostgreSQL

Редактор запросов PostgreSQL имеет два режима: Builder и Code.

Режим Builder помогает строить запрос с помощью визуального интерфейса. Режим Code позволяет выполнять расширенные запросы и поддерживает написание сложных SQL-запросов.

Режим PostgreSQL Builder

Следующие компоненты помогают построить запрос PostgreSQL:

  • Format — выберите формат результата запроса в раскрывающемся списке. По умолчанию — Table. Если вы используете формат Time series, один из столбцов должен быть time. Дополнительную информацию см. в разделе Запросы временных рядов.
  • Table — выберите таблицу в раскрывающемся списке. Таблицы соответствуют выбранной базе данных.
  • Data operations — Необязательно. Выберите агрегацию в раскрывающемся списке. Вы можете добавить несколько операций с данными, нажав знак +. Нажмите знак X, чтобы удалить операции с данными.
  • Column — выберите столбец, по которому следует выполнить агрегацию.
  • Alias — Необязательно. Добавьте псевдоним из раскрывающегося списка. Вы также можете добавить свой собственный псевдоним, введя его в поле и нажав Enter. Удалите псевдоним, нажав X.
  • Filter — переключатель для добавления фильтров.
  • Filter by column value — Необязательно. Если вы включите Filter, вы можете добавить столбец для фильтрации из раскрывающегося списка. Чтобы фильтровать по нескольким столбцам, нажмите знак + справа от раскрывающегося списка условий. Выберите оператор в раскрывающемся списке рядом с условием. Когда добавлено несколько фильтров, вы можете добавить оператор AND, чтобы отобразить все истинные условия, или оператор OR, чтобы отобразить любые истинные условия. Используйте второй раскрывающийся список, чтобы выбрать значение фильтра. Чтобы удалить фильтр, нажмите X рядом с раскрывающимся списком этого фильтра. После выбора столбца типа даты вы можете выбрать Macros в списке операторов и выбрать timeFilter, чтобы добавить макрос $__timeFilter в запрос с выбранным столбцом даты.
  • Group — переключатель для добавления Group by column.
  • Group by column — выберите столбец для группировки в раскрывающемся списке. Нажмите знак +, чтобы группировать по нескольким столбцам. Нажмите X, чтобы удалить столбец.
  • Order — переключатель для добавления инструкции ORDER BY.
  • Order by — выберите столбец для сортировки в раскрывающемся списке. Выберите порядок по возрастанию (ASC) или по убыванию (DESC).
  • Limit — вы можете добавить необязательное ограничение на количество извлекаемых результатов. По умолчанию 50.
  • Preview — переключатель для предпросмотра SQL-запроса, сгенерированного конструктором запросов. Предпросмотр включён по умолчанию.

Режим PostgreSQL Code

Чтобы создавать расширенные запросы, переключитесь в Code mode, нажав Code в правом верхнем углу окна редактора. Режим Code поддерживает автодополнение таблиц, столбцов, ключевых слов SQL, стандартных SQL-функций, переменных шаблонов Grafana и макросов Grafana. Столбцы не могут быть дополнены до указания таблицы.

Note

Если имя таблицы или столбца является зарезервированным словом или содержит смешанный регистр либо специальные символы, используйте двойные кавычки в SQL. Например, "user" или "Created At".

Выберите Table или Time Series в качестве формата. Нажмите {} в правом нижнем углу, чтобы отформатировать запрос. Нажмите стрелку вниз, чтобы развернуть редактор режима Code. CTRL/CMD + Return служит сочетанием клавиш для выполнения запроса.

Warning

Изменения, внесённые в запрос в режиме Code, не переносятся в режим Builder и отбрасываются. Вам будет предложено скопировать код в буфер обмена, чтобы сохранить любые изменения.

Макросы

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

Grafana разворачивает макросы в нативный PostgreSQL SQL перед выполнением запроса. Когда включено расширение TimescaleDB, $__timeGroup и $__timeGroupAlias используют time_bucket() для более эффективной группировки.

Макросы временных рядов

Пример макроса Описание
$__time(dateColumn) Переименовывает столбец в time. Пример: dateColumn AS "time". Используйте для нативных столбцов даты/времени.
$__timeEpoch(dateColumn) Преобразует в UNIX epoch (секунды) и переименовывает столбец в time. Пример: extract(epoch from dateColumn) as "time". Требует аргумент столбца.
$__timeFilter(dateColumn) Заменяет значение фильтром диапазона времени с использованием указанного имени столбца. Пример: dateColumn BETWEEN '2020-07-13T20:19:09.254Z' AND '2020-07-13T21:19:09.254Z'.
$__timeFrom() Заменяет значение началом текущего активного выбора времени (RFC3339Nano). Пример: '2020-07-13T20:19:09.254Z'.
$__timeTo() Заменяет значение концом текущего активного выбора времени (RFC3339Nano). Пример: '2020-07-13T20:19:09.254Z'.
$__timeGroup(dateColumn,'5m') Заменяет значение выражением, подходящим для использования в предложении GROUP BY. Пример: floor(extract(epoch from dateColumn)/300)*300. С TimescaleDB: time_bucket('300s', dateColumn).
$__timeGroup(dateColumn,'5m', 0) То же, что $__timeGroup(dateColumn,'5m'), но включает параметр заполнения, чтобы гарантировать добавление пропущенных точек ряда Grafana, используя 0 в качестве значения по умолчанию. Заполнение применяется только к запросам временных рядов.
$__timeGroup(dateColumn,'5m', NULL) То же, что $__timeGroup(dateColumn,'5m', 0), но NULL используется в качестве значения для пропущенных точек. Заполнение применяется только к запросам временных рядов.
$__timeGroup(dateColumn,'5m', previous) То же, что $__timeGroup(dateColumn,'5m', 0), но использует предыдущее значение в ряду в качестве значения заполнения. Если предыдущего значения нет, используется NULL. Заполнение применяется только к запросам временных рядов.
$__timeGroupAlias(dateColumn,'5m') То же, что $__timeGroup, но с добавленным псевдонимом столбца AS "time". С TimescaleDB использует time_bucket().

Макросы UNIX epoch

Пример макроса Описание
$__unixEpochFilter(dateColumn) Заменяет значение фильтром диапазона времени для столбцов, хранящих UNIX epoch (секунды). Пример: dateColumn >= 1494410783 AND dateColumn <= 1494497183.
$__unixEpochFrom() Заменяет значение началом текущего активного выбора времени в виде метки времени UNIX (секунды). Пример: 1494410783.
$__unixEpochTo() Заменяет значение концом текущего активного выбора времени в виде метки времени UNIX (секунды). Пример: 1494497183.
$__unixEpochNanoFilter(dateColumn) Заменяет значение фильтром диапазона времени для столбцов, хранящих UNIX epoch в наносекундах. Пример: dateColumn >= 1494410783152415214 AND dateColumn <= 1494497183142514872.
$__unixEpochNanoFrom() Заменяет значение началом текущего активного выбора времени в виде наносекундной метки времени. Пример: 1494410783152415214.
$__unixEpochNanoTo() Заменяет значение концом текущего активного выбора времени в виде наносекундной метки времени. Пример: 1494497183142514872.
$__unixEpochGroup(dateColumn,'5m', [fillmode]) То же, что $__timeGroup, но для столбцов, хранящих UNIX epoch (секунды). Пример: floor((dateColumn)/300)*300. fillMode применяется только к запросам временных рядов.
$__unixEpochGroupAlias(dateColumn,'5m', [fillmode]) То же, что $__unixEpochGroup, но с добавленным псевдонимом столбца AS "time". fillMode применяется только к запросам временных рядов.

Переменные интервалов

В дополнение к перечисленным макросам перед выполнением запроса заменяются следующие переменные интервалов Grafana:

Переменная Описание
$__interval Заменяется вычисленным интервалом на основе диапазона времени и ширины панели (например, 5m). Используйте в $__timeGroup или напрямую в пользовательских выражениях.
$__interval_ms То же, что $__interval, но в миллисекундах (например, 300000).

Вы можете задать нижнюю границу для этих переменных с помощью опции Min time interval в конфигурации источника данных или в параметрах запроса панели.

Поведение макросов

Учитывайте следующее поведение при использовании макросов:

  • Удаление комментариев: Grafana удаляет SQL-комментарии (строчные комментарии -- и блочные комментарии /* */) перед разворачиванием макросов. Макросы, размещённые внутри комментариев, не разворачиваются.
  • Режим TimescaleDB: Когда в конфигурации источника данных включён переключатель TimescaleDB, $__timeGroup и $__timeGroupAlias используют функцию time_bucket() PostgreSQL вместо floor(extract(epoch ...)).
  • Шаблон с завершающей запятой: Вызов $__timeGroup(...), за которым сразу следует запятая (,), автоматически рассматривается как $__timeGroupAlias(...), добавляя псевдоним AS "time". Это унаследованное удобство. Для ясности используйте $__timeGroupAlias явно.
  • Просмотр развёрнутого SQL: Чтобы увидеть итоговый SQL после разворачивания макросов, откройте Query inspector на панели и проверьте запрос, отправленный в базу данных.

Табличные запросы

Если опция Format установлена в Table, вы можете выполнять практически любой тип SQL-запроса. Панель Table автоматически отображает результирующие столбцы и строки вашего запроса.

Табличный запрос

Вы можете изменить или настроить имя столбца панели Table, используя синтаксис ключевого слова SQL AS.

SQL
SELECT
  title as "Title",
  "user".login as "Created By",
  dashboard.created as "Created On"
FROM dashboard
INNER JOIN "user" on "user".id = dashboard.created_by
WHERE $__timeFilter(dashboard.created)

Вы можете использовать переменные шаблонов в запросах для создания динамических, многократно используемых дашбордов. Например, чтобы отфильтровать по переменной с именем hostname:

SQL
SELECT
  $__time("time_date_time"),
  value_double AS value,
  hostname
FROM test_data
WHERE
  $__timeFilter("time_date_time")
  AND hostname IN($hostname)
ORDER BY time

Дополнительную информацию о создании и использовании переменных шаблонов с PostgreSQL см. в разделе Переменные шаблонов PostgreSQL.

Табличный запрос со столбцами диапазона времени

Табличные запросы поддерживают столбец timeend в дополнение к столбцу time. Когда присутствуют оба, Grafana рассматривает строку как диапазон времени, а не как одну точку. Это полезно для отображения событий с длительностью, таких как окна обслуживания или развёртывания.

SQL
SELECT
  start_time AS "time",
  end_time AS "timeend",
  description,
  status
FROM maintenance_windows
WHERE $__timeFilter(start_time)

Запросы временных рядов

Установите опцию Format в Time series, чтобы создавать и выполнять запросы временных рядов.

Note

Чтобы выполнить запрос временного ряда, вы должны включить столбец с именем time, возвращающий либо значение SQL datetime, либо числовой тип данных, представляющий время UNIX epoch в секундах. Кроме того, результаты запроса должны быть отсортированы по столбцу time для правильной визуализации на панелях.

Примеры в этом разделе относятся к данным в следующей таблице:

text
+---------------------+--------------+---------------------+----------+
| time_date_time      | value_double | CreatedAt           | hostname |
+---------------------+--------------+---------------------+----------+
| 2020-01-02 03:05:00 | 3.0          | 2020-01-02 03:05:00 | 10.0.1.1 |
| 2020-01-02 03:06:00 | 4.0          | 2020-01-02 03:06:00 | 10.0.1.2 |
| 2020-01-02 03:10:00 | 6.0          | 2020-01-02 03:10:00 | 10.0.1.1 |
| 2020-01-02 03:11:00 | 7.0          | 2020-01-02 03:11:00 | 10.0.1.2 |
| 2020-01-02 03:20:00 | 5.0          | 2020-01-02 03:20:00 | 10.0.1.2 |
+---------------------+--------------+---------------------+----------+

Результаты запросов временных рядов возвращаются в широком формате data frame. В результате запроса data frame любой столбец, кроме столбцов времени или строкового типа, преобразуется в поля значений. Строковые столбцы становятся метками полей.

Определение столбца метрики

Плагин PostgreSQL определяет столбцы строкового типа (text, varchar, char, bpchar) как столбцы меток, которые разделяют результат на несколько рядов. Числовые столбцы и столбцы времени становятся полями значений.

Note

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

Заполнение пропущенных точек временных рядов

При использовании $__timeGroup или $__unixEpochGroup с параметром заполнения (третий аргумент) Grafana заполняет пробелы в данных вашего временного ряда. Это полезно, когда ваши данные имеют нерегулярные интервалы или пропущенные точки данных. Заполнение работает только с запросами формата временных рядов.

Доступны следующие режимы заполнения:

Режим заполнения Поведение
0 (или любое число) Пропущенные точки заполняются указанным числовым значением.
NULL Пропущенные точки заполняются NULL, что создаёт разрывы на линейных графиках.
previous Пропущенные точки используют последнее известное значение. Если предыдущего значения нет, используется NULL.

Например, $__timeGroupAlias("CreatedAt",'5m', 0) группирует данные в 5-минутные интервалы и заполняет любые пробелы значением 0.

Note

Начиная с Grafana 13.0, режим заполнения в $__timeGroup и $__unixEpochGroup включает дополнительные защиты, предотвращающие некорректные точки данных, когда запрос не возвращает строк или диапазон времени выходит за границы данных.

Ограничения на количество строк

Grafana применяет серверное ограничение на количество строк в результатах запроса, чтобы защититься от чрезмерного использования памяти. Если ваш запрос возвращает больше строк, чем лимит, результат усекается. Чтобы уменьшить количество возвращаемых строк, сузьте диапазон времени дашборда, увеличьте интервал $__timeGroup или добавьте предложение LIMIT в ваш запрос.

Пример со столбцом metric:

SQL
SELECT
  $__timeGroupAlias("time_date_time",'5m'),
  min("value_double"),
  'min' as metric
FROM test_data
WHERE $__timeFilter("time_date_time")
GROUP BY time
ORDER BY time

Результат data frame:

text
+---------------------+-----------------+
| Name: time          | Name: min       |
| Labels:             | Labels:         |
| Type: []time.Time   | Type: []float64 |
+---------------------+-----------------+
| 2020-01-02 03:05:00 | 3               |
| 2020-01-02 03:10:00 | 6               |
+---------------------+-----------------+

Чтобы настроить форматирование имени ряда по умолчанию, см. Определения стандартных опций.

Далее приведены примеры запросов временных рядов.

Пример без группировки (сырые точки):

Чтобы вернуть сырые точки времени и значений без группировки, используйте $__time, чтобы задать псевдоним вашему столбцу даты/времени как time:

SQL
SELECT
  $__time("time_date_time"),
  "value_double" as value
FROM test_data
WHERE $__timeFilter("time_date_time")
ORDER BY time

Пример использования параметра заполнения в макросе $__timeGroupAlias для преобразования значений null в ноль:

SQL
SELECT
  $__timeGroupAlias("CreatedAt",'5m',0),
  sum(value) as value,
  hostname
FROM test_data
WHERE
  $__timeFilter("CreatedAt")
GROUP BY time, hostname
ORDER BY time

Основываясь на результате data frame в следующем примере, панель временных рядов создаёт два ряда с именами value 10.0.1.1 и value 10.0.1.2. Чтобы отобразить имена рядов как 10.0.1.1 и 10.0.1.2, используйте значение отображения Определения стандартных опций ${__field.labels.hostname}.

Результат data frame:

text
+---------------------+---------------------------+---------------------------+
| Name: time          | Name: value               | Name: value               |
| Labels:             | Labels: hostname=10.0.1.1 | Labels: hostname=10.0.1.2 |
| Type: []time.Time   | Type: []float64           | Type: []float64           |
+---------------------+---------------------------+---------------------------+
| 2020-01-02 03:05:00 | 3                         | 4                         |
| 2020-01-02 03:10:00 | 6                         | 7                         |
+---------------------+---------------------------+---------------------------+

Пример с несколькими столбцами:

SQL
SELECT
  $__timeGroupAlias("time_date_time",'5m'),
  min("value_double") as "min_value",
  max("value_double") as "max_value"
FROM test_data
WHERE $__timeFilter("time_date_time")
GROUP BY time
ORDER BY time

Результат data frame:

text
+---------------------+-----------------+-----------------+
| Name: time          | Name: min_value | Name: max_value |
| Labels:             | Labels:         | Labels:         |
| Type: []time.Time   | Type: []float64 | Type: []float64 |
+---------------------+-----------------+-----------------+
| 2020-01-02 03:04:00 | 3               | 4               |
| 2020-01-02 03:05:00 | 6               | 7               |
+---------------------+-----------------+-----------------+

Пример со столбцом времени UNIX epoch:

Когда ваш столбец времени хранит UNIX epoch (секунды), используйте $__timeEpoch, чтобы задать ему псевдоним time, и $__unixEpochFilter в предложении WHERE:

SQL
SELECT
  $__timeEpoch(epoch_seconds_column),
  value_column as value
FROM my_table
WHERE $__unixEpochFilter(epoch_seconds_column)
ORDER BY time

Для сгруппированных временных рядов со столбцами epoch используйте $__unixEpochGroupAlias и $__unixEpochFilter. Подробности см. в таблице Макросы.

Запросы EXPLAIN

Вы можете выполнять запросы EXPLAIN и EXPLAIN ANALYZE в режиме Code, чтобы изучить планы выполнения запросов. Результаты возвращаются в виде таблицы, что полезно для диагностики медленных запросов прямо в Grafana.

SQL
EXPLAIN ANALYZE
SELECT
  $__timeGroupAlias("time_date_time", '5m'),
  avg("value_double") AS value
FROM test_data
WHERE $__timeFilter("time_date_time")
GROUP BY time
ORDER BY time

Макросы Grafana разворачиваются перед выполнением запроса, поэтому вы можете использовать $__timeFilter и другие макросы в ваших запросах EXPLAIN, чтобы увидеть фактический план выполнения для диапазона времени дашборда. Установите Format в Table, чтобы отобразить вывод плана.

Дальнейшие шаги

  • Используйте переменные шаблонов для создания динамических, многократно используемых дашбордов.
  • Добавьте аннотации из PostgreSQL, чтобы накладывать события на ваши панели.
  • Настройте алертинг, чтобы получать уведомления, когда метрики пересекают пороговые значения (только формат временных рядов).
  • Устраняйте проблемы, если вы сталкиваетесь с проблемами с запросами.