Переменные шаблонов MySQL
Вместо жёсткого задания таких деталей, как имена серверов, приложений и датчиков, в запросах метрик вы можете использовать переменные. Grafana отображает эти переменные в виде раскрывающихся списков в верхней части дашборда, помогая изменять отображаемые на дашборде данные. Grafana называет такие переменные переменными шаблонов.
Введение в шаблонизацию и переменные шаблонов см. в разделах Templating и Add and manage variables.
Переменная запроса
Переменная запроса в Grafana динамически извлекает значения из вашего источника данных с помощью запроса. С помощью переменной запроса вы можете написать SQL-запрос, возвращающий значения, такие как имена измерений, имена ключей или значения ключей, которые отображаются в раскрывающемся списке.
Редактор запросов переменных поддерживает те же режимы Builder и Code, что и основной редактор запросов. Используйте режим Builder для визуального построения запросов путём выбора набора данных, таблицы, столбцов и фильтров. Используйте режим Code для написания SQL напрямую.
Например, следующий запрос возвращает все значения из столбца hostname:
SELECT hostname FROM my_host
Запрос может возвращать несколько столбцов, и Grafana автоматически формирует список, используя значения из этих столбцов. Например, следующий запрос возвращает значения из обоих столбцов hostname и hostname2, которые включаются в раскрывающийся список переменной.
SELECT my_host.hostname, my_other_host.hostname2 FROM my_host JOIN my_other_host ON my_host.city = my_other_host.city
Чтобы использовать в запросе зависящие от диапазона времени макросы, такие как $__timeFilter(column), вы должны установить режим обновления переменной шаблона в On Time Range Change.
SELECT event_name FROM event_log WHERE $__timeFilter(time_column)
Переменные «ключ/значение»
Вы можете создать переменную «ключ/значение», чтобы в раскрывающемся списке отображалась понятная метка (например, hostname), а в запросах панелей использовалось другое значение (например, ID). Используйте Value field и Text field редактора переменных в нижней части раздела запроса, чтобы указать, какие столбцы запроса задают значение и метку. Ваш запрос может использовать любые имена столбцов; вам не нужны __value или __text в SQL.
Пример: выполните запрос, возвращающий hostname и id, затем установите Text field в hostname и Value field в id.
SELECT hostname, id FROM my_host
Обратите внимание, что значения в текстовом столбце должны быть уникальными. Если есть дубликаты, Grafana использует только первую совпадающую запись.
Как вариант, вы можете использовать устаревший подход: возвращать в запросе столбцы с именами __text и __value (например, SELECT hostname AS __text, id AS __value FROM my_host).
Вложенные переменные
Вы можете создавать вложенные переменные, когда одна переменная зависит от значения другой. Например, если у вас есть переменная с именем region, вы можете настроить переменную hosts так, чтобы она показывала только хосты из выбранного региона. Если region — многовыбираемая переменная, используйте оператор IN вместо =, чтобы сопоставить несколько выбранных значений.
SELECT hostname FROM my_host WHERE region IN($region)
Фильтрация результатов с помощью __searchFilter
Использование __searchFilter в поле запроса позволяет фильтровать результаты запроса на основе ввода пользователя в раскрывающемся списке выбора. Если вы ничего не вводите, значением по умолчанию для __searchFilter является %.
Обратите внимание, что вы должны заключить выражение __searchFilter в кавычки, так как Grafana не добавляет их автоматически.
Следующий пример демонстрирует, как использовать __searchFilter в поле запроса для включения поиска по hostname в реальном времени по мере ввода пользователем в раскрывающемся списке выбора.
SELECT hostname FROM my_host WHERE hostname LIKE '$__searchFilter'
Использование переменных в запросах
Grafana автоматически заключает значения переменных шаблонов в кавычки только тогда, когда переменная шаблона является multi-value.
При использовании многовыбираемой переменной используйте оператор сравнения IN вместо =, чтобы сопоставить несколько значений.
Grafana поддерживает два синтаксиса использования переменных в запросах:
- синтаксис
$<varname>
Пример с переменной шаблона с именем hostname:
SELECT
UNIX_TIMESTAMP(atimestamp) as time,
aint as value,
avarchar as metric
FROM my_table
WHERE $__timeFilter(atimestamp) and hostname in($hostname)
ORDER BY atimestamp ASC
- синтаксис
[[varname]]
Пример с переменной шаблона с именем hostname:
SELECT
UNIX_TIMESTAMP(atimestamp) as time,
aint as value,
avarchar as metric
FROM my_table
WHERE $__timeFilter(atimestamp) and hostname in([[hostname]])
ORDER BY atimestamp ASC
Отключение заключения в кавычки для многовыбираемых переменных
По умолчанию Grafana форматирует многовыбираемые переменные как заключённую в кавычки строку, разделённую запятыми. Например, если выбраны server01 и server02, результатом будет 'server01', 'server02'. Чтобы отключить заключение в кавычки, используйте параметр форматирования csv для переменных:
${servers:csv}
Это выводит значения как список без кавычек, разделённый запятыми.
Использование явного заключения в кавычки для строковых переменных
Не полагайтесь на неявное поведение заключения в кавычки для строковых переменных в SQL-запросах. Поведение заключения в кавычки может различаться в зависимости от типа панели и контекста:
- Повторяющиеся панели могут вообще не заключать одновыбираемые переменные в кавычки, из-за чего в SQL появляются значения без кавычек и запрос ломается.
- Если вы вручную обернёте переменную в кавычки (например,
WHERE name = '$myvar'), а Grafana также применит своё собственное заключение в кавычки, значение будет заключено в двойные кавычки (например,''30''вместо'30'). Это намеренное поведение заключения в кавычки было восстановлено в Grafana 11.3.
Чтобы избежать обеих проблем, используйте параметр форматирования sqlstring. Он выполняет экранирование и заключение в кавычки за один шаг, так что вам не нужно добавлять свои собственные кавычки вокруг переменной:
SELECT *
FROM my_table
WHERE hostname = ${hostname:sqlstring}
Это даёт безопасно заключённую в кавычки строку (например, 'server01') независимо от типа панели или контекста. Для многовыбираемых переменных используйте IN с ${var:sqlstring}:
SELECT *
FROM my_table
WHERE hostname IN (${hostname:sqlstring})
Caution
Не оборачивайте
${var:sqlstring}в дополнительные кавычки. Форматтерsqlstringуже выдаёт значение в кавычках. Написание'${var:sqlstring}'приводит к двойному заключению в кавычки.
Дополнительную информацию см. в разделе Advanced variable format options.