Редактор запросов Microsoft SQL Server
Редактор запросов MSSQL позволяет писать запросы Transact-SQL прямо в Grafana, со встроенными макросами и параметрами форматирования, предназначенными для визуализаций временных рядов и таблиц. Вы можете открыть его из Explore или из любой панели дашборда в режиме редактирования.
Эта страница охватывает функции запросов, специфичные для MSSQL. Общие концепции запросов, применимые ко всем источникам данных, см. в разделе Query and transform data. Синтаксис Transact-SQL см. в разделах Write Transact-SQL statements и Transact-SQL reference в документации Microsoft.
Редактор запросов Microsoft SQL Server имеет два режима:
Чтобы переключаться между режимами редактора, выберите соответствующие вкладки Builder и Code в правом верхнем углу.

Warning
При переключении из режима Code в режим Builder любые изменения, внесённые в ваш SQL-запрос, не сохраняются и не отображаются в интерфейсе построителя. Вы можете скопировать свой код в буфер обмена или отменить изменения.
Чтобы выполнить запрос, выберите Run query в правом верхнем углу редактора.
Помимо написания запросов, редактор запросов также позволяет создавать и использовать:
Режим Builder
Режим Builder позволяет строить запросы с помощью визуального интерфейса. Этот режим отлично подходит пользователям, которые предпочитают управляемый процесс создания запросов или только начинают работать с SQL.
Следующие компоненты помогают вам построить запрос T-SQL:
-
Format - Выберите формат ответа из выпадающего списка для запроса MSSQL. По умолчанию — Table. Дополнительную информацию и примеры см. в разделах Табличные запросы и Запросы временных рядов. Если вы выберете вариант формата Time series, необходимо включить столбец
time. -
Dataset - Выберите базу данных для запроса из выпадающего списка. Grafana автоматически заполняет выпадающий список всеми базами данных, к которым у пользователя есть доступ. Если база данных задана в поле Database на странице настройки источника данных или через файл провижининга, пользователи ограничены запросами только к этой базе данных.
Обратите внимание, что системные базы данных
tempdb,model,msdbиmasterне включены в выпадающий список редактора запросов. -
Table - Выберите таблицу из выпадающего списка. После выбора базы данных следующий выпадающий список отображает все доступные таблицы в этой базе данных.
-
Data operations - Необязательно. Выберите агрегацию или макрос из выпадающего списка. Вы можете добавить несколько операций с данными, нажав знак +. Нажмите значок мусорной корзины, чтобы удалить операции с данными.
- Column - Выберите столбец, по которому следует выполнить агрегацию.
- Interval - Выберите интервал из выпадающего списка. Вы увидите эту опцию, когда выберете макрос
time groupиз выпадающего списка. - Fill - Необязательно. Добавьте метод
FILL, чтобы заполнить отсутствующие временные интервалы значениями по умолчанию (например, NULL, 0 или указанным значением), когда для этих интервалов нет данных. Это обеспечивает непрерывность временного ряда, избегая разрывов в визуализациях. - Alias - Необязательно. Добавьте псевдоним из выпадающего списка. Вы также можете добавить собственный псевдоним, введя его в поле и нажав Enter. Удалите псевдоним, нажав X.
-
Filter - Переключите, чтобы добавить фильтры.
-
Filter by column value - Необязательно. Если вы включите Filter, вы сможете добавить столбец для фильтрации из выпадающего списка. Чтобы фильтровать по дополнительным столбцам, нажмите знак + справа от выпадающего списка условий. Вы можете выбрать различные операторы из выпадающего списка рядом с условием. Когда добавлено несколько фильтров, используйте операторы
ANDилиOR, чтобы определить, как оцениваются условия.ANDтребует, чтобы все условия были истинными, тогда какORтребует, чтобы любое условие было истинным. Используйте второй выпадающий список для выбора значения фильтра. Чтобы удалить фильтр, нажмите значок X рядом с ним. Если вы выберете столбец типаdate-type, вы можете использовать макросы из списка операторов и выбратьtimeFilter, чтобы вставить макрос$\_\_timeFilterв ваш запрос с выбранным столбцом даты.После выбора столбца типа даты вы можете выбрать Macros из списка операторов и выбрать
timeFilter, что добавит макрос$\_\_timeFilterв запрос с выбранным столбцом даты. Дополнительную информацию см. в разделе Макросы.
-
-
Group - Переключите, чтобы добавить столбец
GROUP BY.- Group by column - Выберите столбец для фильтрации из выпадающего списка. Нажмите знак +, чтобы фильтровать по нескольким столбцам. Нажмите X, чтобы удалить фильтр.
-
Order - Переключите, чтобы добавить инструкцию
ORDER BY.- Order by - Выберите столбец для сортировки из выпадающего списка. Выберите порядок по возрастанию (
ASC) или по убыванию (DESC). - Limit - Вы можете добавить необязательное ограничение на количество извлекаемых результатов. По умолчанию — 50.
- Order by - Выберите столбец для сортировки из выпадающего списка. Выберите порядок по возрастанию (
-
Preview - Переключите, чтобы увидеть предварительный просмотр SQL-запроса, сгенерированного построителем запросов. Предварительный просмотр включён по умолчанию.
Дополнительные сведения об использовании форматов см. в разделах Табличные запросы и Запросы временных рядов.
Режим Code
Режим Code позволяет строить сложные запросы с помощью текстового редактора с полезными функциями, такими как автодополнение и подсветка синтаксиса.
Этот режим идеален для опытных пользователей, которым нужен полный контроль над SQL-запросом или которые хотят использовать функции, недоступные в режиме визуальных запросов. Он особенно полезен для написания подзапросов, использования макросов или применения расширенной фильтрации и форматирования. Вы можете вернуться в визуальный режим, но учтите, что некоторые пользовательские запросы могут быть не полностью совместимы.
Функции панели инструментов режима Code
Режим Code имеет несколько функций на панели инструментов, расположенной в правом нижнем углу редактора.
- Чтобы переформатировать запрос, нажмите кнопку скобок (
{}). - Чтобы развернуть редактор кода, нажмите кнопку в виде шеврона, направленного вниз.
- Чтобы выполнить запрос, нажмите кнопку Run query или используйте сочетание клавиш
Ctrl /Cmd +Enter /Return .
Использование автодополнения
Функция автодополнения режима Code работает автоматически во время ввода.
Чтобы вызвать автодополнение вручную, используйте сочетание клавиш
Режим Code поддерживает автодополнение таблиц, столбцов, ключевых слов SQL, стандартных функций SQL, переменных шаблонов Grafana и макросов Grafana.
Note
Вы не можете автодополнять столбцы, пока не указали таблицу.
Макросы
Чтобы упростить синтаксис и обеспечить возможность использования динамических компонентов, таких как фильтры диапазона дат, вы можете добавлять макросы в ваш запрос.
Используйте макросы в предложении SELECT, чтобы упростить создание запросов временных рядов.
В выпадающем списке Data operations выберите макрос, например $\_\_timeGroup или $\_\_timeGroupAlias. Затем выберите столбец времени из выпадающего списка Column и временной интервал из выпадающего списка Interval. Это создаёт запрос временного ряда на основе выбранной вами группировки по времени.
Warning
Макросы времени (
$__time,$__timeFilterи т. д.) не поддерживают параметры часового пояса в Microsoft SQL Server и всегда разворачиваются в значения UTC. Если ваши временные метки не хранятся в UTC (что часто бывает с типамиdatetime/datetime2), преобразуйте их в UTC в вашем SQL-запросе с помощьюAT TIME ZONE … AT TIME ZONE 'UTC', а не передавайте аргумент часового пояса в макрос.
Просмотр интерполированного запроса
Редактор запросов включает ссылку Generated SQL, которая появляется после выполнения запроса при редактировании панели. Нажмите эту ссылку, чтобы просмотреть необработанный интерполированный SQL, который выполнила Grafana, включая все макросы, развёрнутые во время обработки запроса.
Табличные запросы
Чтобы создать табличный запрос, задайте для параметра Format в редакторе запросов значение Table. Это позволяет писать любой допустимый SQL-запрос, а панель Table отображает результаты, используя возвращённые столбцы и строки.
Пример:
CREATE TABLE [event] (
time_sec bigint,
description nvarchar(100),
tags nvarchar(100),
)
CREATE TABLE [mssql_types] (
c_bit bit, c_tinyint tinyint, c_smallint smallint, c_int int, c_bigint bigint, c_money money, c_smallmoney smallmoney, c_numeric numeric(10,5),
c_real real, c_decimal decimal(10,2), c_float float,
c_char char(10), c_varchar varchar(10), c_text text,
c_nchar nchar(12), c_nvarchar nvarchar(12), c_ntext ntext,
c_datetime datetime, c_datetime2 datetime2, c_smalldatetime smalldatetime, c_date date, c_time time, c_datetimeoffset datetimeoffset
)
INSERT INTO [mssql_types]
SELECT
1, 5, 20020, 980300, 1420070400, '$20000.15', '£2.15', 12345.12,
1.11, 2.22, 3.33,
'char10', 'varchar10', 'text',
N'☺nchar12☺', N'☺nvarchar12☺', N'☺text☺',
GETDATE(), CAST(GETDATE() AS DATETIME2), CAST(GETDATE() AS SMALLDATETIME), CAST(GETDATE() AS DATE), CAST(GETDATE() AS TIME), SWITCHOFFSET(CAST(GETDATE() AS DATETIMEOFFSET), '-07:00')
Пример запроса с выводом:
SELECT * FROM [mssql_types]
Используйте ключевое слово AS, чтобы определить псевдоним в вашем запросе для переименования столбца или таблицы.
Пример запроса с выводом:
SELECT
c_bit AS [column1], c_tinyint AS [column2]
FROM
[mssql_types]
Запросы временных рядов
Note
Храните временные метки в UTC, чтобы избежать проблем со сдвигами времени в Grafana при использовании часовых поясов, отличных от UTC.
Чтобы создать запрос временного ряда, задайте для параметра Format в редакторе запросов значение Time series. Запрос должен включать столбец с именем time, который должен содержать либо значение SQL datetime, либо числовое значение, представляющее время Unix epoch в секундах. Результирующий набор должен быть отсортирован по столбцу time, чтобы панели корректно визуализировали данные.
Запрос временного ряда возвращает результаты в формате wide data frame.
- Любой столбец, кроме
timeили типаstring, преобразуется в поля значений в результате запроса data frame. - Любой строковый столбец преобразуется в метки полей в результате запроса data frame.
Вы можете включить поддержку макросов в предложении SELECT, чтобы упростить создание запросов временных рядов. Используйте выпадающий список Data operations, чтобы выбрать макрос, например $\_\_timeGroup или $\_\_timeGroupAlias, затем выберите столбец времени из выпадающего списка Column и временной интервал из выпадающего списка Interval. Это создаёт запрос временного ряда на основе выбранной вами группировки по времени.
Macros
You can enable macros support in the select clause to create time-series queries.
Use the Data operations drop-down to select a macro like $__timeGroup or $__timeGroupAlias.
Select a time column from the Column drop-down and a time interval from the Interval drop-down to create a time-series query.
You can also add custom value to the Data operations. For example, a function that’s not in the drop-down list. This allows you to add any number of parameters.
Создание запроса метрики
Для обратной совместимости существует исключение из вышеуказанного правила для запросов, которые возвращают три столбца и включают строковый столбец с именем metric.
Вместо преобразования столбца metric в метки полей он становится именем поля, а затем имя серии форматируется как значение столбца metric.
Обратитесь к примеру со столбцом metric ниже.
Чтобы при необходимости настроить форматирование имени серии по умолчанию, см. Standard options definitions.
Пример со столбцом metric:
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 1
Результат data frame:
+---------------------+-----------------+
| 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 |
+---------------------+-----------------+
Примеры запросов временных рядов
Используйте параметр fill в макросе $__timeGroupAlias, чтобы вместо этого преобразовать значения null в ноль:
SELECT
$__timeGroupAlias(createdAt, '5m', 0),
sum(value) as value,
hostname
FROM test_data
WHERE
$__timeFilter(createdAt)
GROUP BY
time,
hostname
ORDER BY 1
Учитывая результат data frame в следующем примере и используя панель graph, вы получите две серии с именами value 10.0.1.1 и value 10.0.1.2. Чтобы отобразить серии с именами 10.0.1.1 и 10.0.1.2, используйте значение отображаемого имени
Standard options definitions ${__field.labels.hostname}.
Результат data frame:
+---------------------+---------------------------+---------------------------+
| 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 |
+---------------------+---------------------------+---------------------------+
Использование нескольких столбцов:
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 1
Результат data frame:
+---------------------+-----------------+-----------------+
| 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 |
+---------------------+-----------------+-----------------+
Аннотации
Вы можете использовать запросы Microsoft SQL Server в качестве источников аннотаций, чтобы накладывать события на графики вашего дашборда. Подробные инструкции, примеры запросов и рекомендации см. в разделе Аннотации Microsoft SQL Server.
Использование хранимых процедур
Хранимые процедуры проверены на работу с запросами Grafana. Однако обратите внимание, что для хранимых процедур нет специальной обработки или расширенной поддержки, поэтому некоторые крайние случаи могут вести себя не так, как ожидается.
Хранимые процедуры можно использовать в табличных запросах, запросах временных рядов и запросах аннотаций при условии, что возвращаемые данные соответствуют ожидаемым именам столбцов и форматам, описанным в соответствующих предыдущих разделах этого документа.
Note
Функции макросов Grafana не работают внутри хранимых процедур.
В следующих примерах таблица базы данных определена в разделе Запросы временных рядов. Допустим, мы хотим визуализировать четыре серии на панели graph, например все комбинации столбцов valueOne, valueTwo и measurement. Панель graph справа визуализирует то, чего мы хотим достичь. Чтобы решить эту задачу, вам нужно использовать два запроса:
Первый запрос:
SELECT
$__timeGroup(time, '5m') as time,
measurement + ' - value one' as metric,
avg(valueOne) as valueOne
FROM
metric_values
WHERE
$__timeFilter(time)
GROUP BY
$__timeGroup(time, '5m'),
measurement
ORDER BY 1
Второй запрос:
SELECT
$__timeGroup(time, '5m') as time,
measurement + ' - value two' as metric,
avg(valueTwo) as valueTwo
FROM
metric_values
GROUP BY
$__timeGroup(time, '5m'),
measurement
ORDER BY 1
Хранимая процедура с форматом epoch time
Вы можете определить хранимую процедуру, возвращающую все данные, необходимые для отображения нескольких серий (например, 4) на панели graph.
В следующем примере хранимая процедура принимает два параметра, @from и @to, оба типа int. Эти параметры представляют диапазон времени (от/до) в формате epoch time и используются для фильтрации результатов, возвращаемых процедурой.
Запрос внутри процедуры имитирует поведение $__timeGroup(time, '5m'), группируя временные метки в 5-минутные интервалы. Хотя выражения для группировки по времени несколько громоздкие, их можно вынести в переиспользуемые функции SQL Server, чтобы упростить процедуру.
CREATE PROCEDURE sp_test_epoch(
@from int,
@to int
) AS
BEGIN
SELECT
cast(cast(DATEDIFF(second, {d '1970-01-01'}, DATEADD(second, DATEDIFF(second,GETDATE(),GETUTCDATE()), time))/600 as int)*600 as int) as time,
measurement + ' - value one' as metric,
avg(valueOne) as value
FROM
metric_values
WHERE
time >= DATEADD(s, @from, '1970-01-01') AND time <= DATEADD(s, @to, '1970-01-01')
GROUP BY
cast(cast(DATEDIFF(second, {d '1970-01-01'}, DATEADD(second, DATEDIFF(second,GETDATE(),GETUTCDATE()), time))/600 as int)*600 as int),
measurement
UNION ALL
SELECT
cast(cast(DATEDIFF(second, {d '1970-01-01'}, DATEADD(second, DATEDIFF(second,GETDATE(),GETUTCDATE()), time))/600 as int)*600 as int) as time,
measurement + ' - value two' as metric,
avg(valueTwo) as value
FROM
metric_values
WHERE
time >= DATEADD(s, @from, '1970-01-01') AND time <= DATEADD(s, @to, '1970-01-01')
GROUP BY
cast(cast(DATEDIFF(second, {d '1970-01-01'}, DATEADD(second, DATEDIFF(second,GETDATE(),GETUTCDATE()), time))/600 as int)*600 as int),
measurement
ORDER BY 1
END
Затем на панели graph вы можете использовать следующий запрос, чтобы вызвать хранимую процедуру с диапазоном времени, динамически заполняемым Grafana:
DECLARE
@from int = $__unixEpochFrom(),
@to int = $__unixEpochTo()
EXEC dbo.sp_test_epoch @from, @to
Здесь используются встроенные макросы Grafana для преобразования выбранного диапазона времени в epoch time ($__unixEpochFrom() и $__unixEpochTo()), которые передаются в хранимую процедуру в качестве входных параметров.
Хранимая процедура с форматом datetime
Вы можете определить хранимую процедуру, возвращающую все данные, необходимые для отображения четырёх серий на панели graph.
В следующем примере хранимая процедура принимает два параметра, @from и @to, типа datetime. Эти параметры представляют выбранный диапазон времени и используются для фильтрации возвращаемых данных.
Запрос внутри процедуры повторяет поведение $__timeGroup(time, '5m'), группируя данные в 5-минутные интервалы. Эти выражения могут быть громоздкими, но вы можете вынести их в переиспользуемые функции SQL Server для улучшения читаемости и сопровождаемости.
CREATE PROCEDURE sp_test_datetime(
@from datetime,
@to datetime
) AS
BEGIN
SELECT
cast(cast(DATEDIFF(second, {d '1970-01-01'}, time)/600 as int)*600 as int) as time,
measurement + ' - value one' as metric,
avg(valueOne) as value
FROM
metric_values
WHERE
time >= @from AND time <= @to
GROUP BY
cast(cast(DATEDIFF(second, {d '1970-01-01'}, time)/600 as int)*600 as int),
measurement
UNION ALL
SELECT
cast(cast(DATEDIFF(second, {d '1970-01-01'}, time)/600 as int)*600 as int) as time,
measurement + ' - value two' as metric,
avg(valueTwo) as value
FROM
metric_values
WHERE
time >= @from AND time <= @to
GROUP BY
cast(cast(DATEDIFF(second, {d '1970-01-01'}, time)/600 as int)*600 as int),
measurement
ORDER BY 1
END
Чтобы вызвать эту хранимую процедуру из панели graph, используйте следующий запрос со встроенными макросами Grafana для динамического заполнения диапазона времени:
DECLARE
@from datetime = $__timeFrom(),
@to datetime = $__timeTo()
EXEC dbo.sp_test_datetime @from, @to
Дальнейшие шаги
После построения запросов вы можете:
- Использовать переменные шаблонов для создания динамических, переиспользуемых дашбордов
- Добавлять аннотации, чтобы накладывать события SQL Server на графики
- Настроить оповещения для создания правил оповещения на основе результатов ваших запросов
- Устранять проблемы, если запросы возвращают неожиданные результаты