Переменные шаблонов InfluxDB
Вместо жёсткого прописывания таких сведений, как имена серверов, приложений и датчиков, в запросах к метрикам можно использовать переменные. Grafana отображает эти переменные в раскрывающихся списках в верхней части дашборда, чтобы вам было удобнее менять отображаемые данные. Grafana называет такие переменные переменными шаблонов (template variables).
Общую информацию о переменных см. в разделах Variables и Add and manage variables.
Перед началом
- Настройте источник данных InfluxDB.
- Разберитесь с переменными шаблонов Grafana.
Поддерживаемые типы переменных
Чтобы переключать дашборд между разными экземплярами InfluxDB, используйте переменную типа data source. Не применяйте в качестве обходного пути переменную запроса, возвращающую имена источников данных. Такие обходные решения на основе запросов могут сломаться после обновления Grafana, поскольку они зависят от внутренних идентификаторов. Подробности см. в разделе Add a data source variable.
Где можно использовать переменные
Поддержка переменных зависит от редактора запросов и режима работы:
Создание переменной запроса
Добавив переменную шаблона типа query, вы можете написать запрос для исследования метаданных InfluxDB. Такие запросы возвращают, например, имена измерений (measurement), имена ключей и значения ключей.
Дополнительные сведения см. в разделе Add a query variable.
Примеры переменных запросов InfluxQL
Чтобы создать переменную со всеми значениями тега hostname, используйте следующий запрос в поле Query:
SHOW TAG VALUES WITH KEY = "hostname"
Можно получить имена ключей для заданного измерения:
SHOW TAG KEYS [FROM <measurement_name>]
Можно вывести список доступных измерений:
SHOW MEASUREMENTS
Примеры переменных запросов Flux
Для источников данных, настроенных на Flux, напишите запрос Flux, возвращающий один столбец значений:
import "influxdata/influxdb/schema"
schema.tagValues(bucket: v.defaultBucket, tag: "hostname")
Примеры переменных запросов SQL
Для источников данных, настроенных на SQL (InfluxDB 3.x), напишите SQL-запрос, возвращающий один столбец значений:
SELECT DISTINCT hostname FROM cpu
Можно вывести список доступных таблиц:
SHOW TABLES
Можно вывести столбцы конкретной таблицы:
SHOW COLUMNS FROM cpu
Ограничение переменных временным диапазоном дашборда
По умолчанию запросы к метаданным, например SHOW TAG VALUES, возвращают значения за весь период хранения (retention), а не только за временной диапазон дашборда. Если узел или датчик перестал отправлять данные давно, его значения всё равно будут появляться в раскрывающемся списке переменной, пока они существуют в пределах периода хранения.
Чтобы ограничить результаты переменной временным диапазоном дашборда:
- Добавьте в запрос переменной условие по времени. В запросах переменных подставляются те же макросы времени, что и в обычных запросах:
$timeFilterдля InfluxQL,$__timeFilter(<column>)для SQL иv.timeRangeStartиv.timeRangeStopдля Flux. - Установите для переменной параметр Refresh в значение On time range change, чтобы значения обновлялись при изменении временного диапазона дашборда.
Пример для InfluxQL:
SHOW TAG VALUES WITH KEY = "hostname" WHERE $timeFilter
Пример для SQL:
SELECT DISTINCT hostname FROM cpu WHERE $__timeFilter(time)
Связывание и вложение переменных
Можно создавать вложенные переменные, которые иногда называют связанными переменными (chained variables).
Например, если у вас есть переменная с именем region, вы можете настроить переменную hosts так, чтобы она показывала только хосты из выбранного региона.
InfluxQL:
SHOW TAG VALUES WITH KEY = "hostname" WHERE region = '$region'
SQL:
SELECT DISTINCT hostname FROM cpu WHERE region = '$region'
Если у вас есть переменная с именами ключей, её можно использовать в предложении GROUP BY. Это позволяет менять группировку, выбирая значения из списка переменной в верхней части дашборда.
Использование фильтров
InfluxDB поддерживает использование фильтров для InfluxQL. Они позволяют задать несколько фильтров «ключ/значение», которые Grafana автоматически применяет ко всем вашим запросам к InfluxDB. Фильтры также поддерживают выражения.
Чтобы добавить фильтры:
- Перейдите к дашборду, который хотите изменить, и нажмите Edit.
- Нажмите значок Add new element (синий плюс).
- Нажмите Filter and Group by.
- Введите Name для фильтра.
- Выберите вариант в раскрывающемся списке Display, чтобы задать, где на дашборде отображается фильтр.
- Выберите свой источник данных InfluxDB в раскрывающемся списке Data source.
Дополнительные сведения см. в документации по Filter and Group by.
Выбор синтаксиса переменных
Источник данных InfluxDB поддерживает два синтаксиса переменных для использования в поле Query:
$<varname>— используйте этот синтаксис для отдельных ссылок на переменную. Он не позволяет использовать переменную в середине слова или выражения.${varname}— используйте этот синтаксис, когда нужно подставить переменную в середине выражения.
Примеры для InfluxQL:
SELECT mean("value") FROM "logins" WHERE "hostname" =~ /^$host$/ AND $timeFilter GROUP BY time($__interval), "hostname"
SELECT mean("value") FROM "logins" WHERE "hostname" =~ /^${host}$/ AND $timeFilter GROUP BY time($__interval), "hostname"
Когда вы включаете параметры Multi-value или Include all value для InfluxQL, Grafana преобразует значения из простого текста в строку, совместимую с регулярными выражениями, поэтому нужно использовать =~ вместо = и обернуть переменную в регулярное выражение вида /^$host$/.
Например, если $host — переменная с несколькими значениями и вы выбрали server1 и server2, Grafana объединяет значения через |, заключает их в круглые скобки и экранирует все специальные символы. Подставленный запрос выглядит так:
SELECT mean("value") FROM "logins" WHERE "hostname" =~ /^(server1|server2)$/ AND $timeFilter GROUP BY time($__interval), "hostname"
Примеры для SQL:
SELECT $__dateBin(time), mean(usage_system) FROM cpu WHERE $__timeFilter(time) AND host = '$host' GROUP BY $__dateBin(time)
SELECT $__dateBin(time), mean(usage_system) FROM cpu WHERE $__timeFilter(time) AND host IN ($host) GROUP BY $__dateBin(time)
Когда для SQL включён параметр Multi-value, используйте оператор IN вместо =, чтобы сопоставить несколько значений.
Предотвращение нежелательного экранирования значений
Когда вы используете переменную внутри регулярного выражения или когда переменная имеет несколько значений, Grafana экранирует специальные символы в значениях, чтобы запрос оставался корректным. Если вместо этого нужно буквальное, неизменённое значение, используйте параметр формата raw:
SELECT mean("value") FROM "requests" WHERE "path" = '${path:raw}' AND $timeFilter GROUP BY time($__interval)
Это полезно для пользовательских переменных, значения которых намеренно содержат символы, которые Grafana иначе экранировала бы. Полный список доступных параметров формата см. в разделе Advanced variable format options.
Пример дашборда с шаблонами
Пример дашборда с шаблонами см. в этом примере дашборда InfluxDB.