Шаблонные переменные Graphite

Вместо жёсткого задания таких данных, как имена серверов, приложений и сенсоров в запросах метрик, вы можете использовать переменные. Grafana выводит эти переменные в выпадающих списках в верхней части дашборда, помогая вам изменять отображаемые в дашборде данные. Такие переменные Grafana называет шаблонными.

Введение в шаблонизацию и шаблонные переменные см. в документации Templating и Add and manage variables.

Пример дашборда с шаблонами см. в разделе Graphite Templated Nested dashboard.

Использование переменных запросов

С источниками данных Graphite вы можете создавать только переменные запросов. Grafana поддерживает три конкретных типа запросов для переменных на основе Graphite:

Тип запроса Описание Пример использования
Default query Позволяет динамически перечислять метрики, узлы или значения тегов с помощью функций Graphite. tag_values(apps.*.requests.count, app)
Value query Возвращает все значения для запроса, включающего метрику и функцию. tag_values(apps.*.status.*, status)
Metric name query Возвращает все имена для запроса, включающего метрику и функцию. apps.*.requests.count

Выбор синтаксиса переменной

Источник данных Graphite поддерживает два синтаксиса переменных для использования в поле Query.

Variable syntax example

Grafana допускает два способа ссылки на переменные в запросе:

Синтаксис Пример
$varname apps.frontend.$server.requests.count
${varname} apps.frontend.${server}.requests.count
  • Сокращённый синтаксис ($varname) удобен для простых путей, но не работает, когда переменная находится вплотную к другим символам (например, cpu$coreLoad).
  • Полный синтаксис (${varname}) более гибок и работает в любой части строки, включая случай, когда переменная встроена внутрь слова.

Выбирайте формат, который лучше всего подходит к структуре вашего пути метрики Graphite.

Использование переменных тегов

Grafana поддерживает переменные на основе тегов для Graphite, позволяя динамически заполнять выпадающие списки на основе ключей и значений тегов в ваших сериях метрик. Для этого используйте функции Graphite tags() и tag_values() в запросах переменных.

Запрос Описание
tags() Возвращает список всех ключей тегов в базе данных Graphite.
tags(server=~backend\*) Возвращает ключи тегов только из серий, соответствующих указанному выражению фильтра.
tag_values(server) Возвращает все значения для указанного ключа тега.
tag_values(server, server=~backend\*) Возвращает значения тегов для заданного ключа, отфильтрованные только по тем, что встречаются в подходящих сериях.

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

tag_values(server, server=~backend\*, app=~${apps:regex})

Этот запрос возвращает все значения тега server из серий, где тег server соответствует backend* и тег app соответствует значениям, отфильтрованным по регулярному выражению из другой переменной ${apps}.

Подробности см. в документации Graphite по API автодополнения для тегов.

Использование форматирования регулярных выражений и оператора «равно с тильдой» =~:

server=~${servers:regex}

Этот запрос указывает Grafana отформатировать выбранные значения переменной servers как регулярное выражение (например, (server1|server2), если выбраны два сервера).

Дополнительные сведения см. в разделе Advanced variable format options.

Фильтрация с несколькими выражениями

При использовании многозначных переменных в запросах тегов добавляйте ${var:regex} к имени переменной, чтобы применить форматирование регулярным выражением.

tag_values(server, app=~${apps:regex})

Этот запрос возвращает только те серии, где тег app соответствует выбранным значениям в ${apps}, отформатированным как регулярное выражение. =~ — это оператор регулярного выражения.

Запросы без тегов используют для многозначных переменных форматирование glob по умолчанию.

Использование других переменных запросов

При написании запросов используйте тип запроса metric find для получения динамических значений.

Например, запрос prod.servers.* заполняет переменную всеми значениями, которые существуют на позиции подстановочного знака (*).

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

Чтобы вернуть полные пути метрик, соответствующие вашему запросу, используйте функцию expand():

expand(*.servers.*).

Сравнение результатов поиска метрик с раскрытием и без него

При запросе метрик Graphite в Grafana вы можете выбирать между использованием раскрытого (expanded) или нераскрытого (non-expanded) запроса:

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

Раскрытые запросы особенно полезны при работе с регулярными выражениями для сопоставления или извлечения конкретных частей пути метрики.

Предположим, ваша база данных Graphite содержит следующие метрики:

  • prod.servers.001.cpu
  • prod.servers.002.cpu
  • test.servers.001.cpu

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

Нераскрытый запрос Результаты Раскрытый запрос Результаты с раскрытием
* prod, test expand(*) prod, test
*.servers servers expand(*.servers) prod.servers, test.servers
test.servers servers expand(test.servers) test.servers
*.servers.* 001, 002 expand(*.servers.*) prod.servers.001, prod.servers.002, test.servers.001
test.servers.* 001 expand(test.servers.*) test.servers.001
*.servers.*.cpu cpu expand(*.servers.*.cpu) prod.servers.001.cpu, prod.servers.002.cpu, test.servers.001.cpu

Note

Нераскрытый запрос работает как раскрытый, но возвращает только финальный сегмент каждой совпавшей метрики.

Grafana также поддерживает вложенные переменные, которые позволяют ссылаться на другие переменные в запросе.

Например:

apps.$app.servers.*

Этот запрос использует выбранное значение переменной $app для динамической фильтрации пути метрики. Переменная $app содержит одно или несколько имён приложений, а servers.* соответствует всем серверам для данного приложения.

Фильтрация результатов переменных запросов с помощью __searchFilter

Grafana предоставляет переменную __searchFilter, которую можно использовать для динамической фильтрации результатов запроса на основе того, что пользователь вводит в выпадающем списке переменной. Когда выпадающий список пуст или не заполнен, __searchFilter по умолчанию принимает значение *, что означает возврат всех возможных значений. Если вы введёте строку, Grafana заменит __searchFilter этим вводом.

Чтобы использовать __searchFilter как часть поля запроса для включения поиска по server во время ввода пользователем в выпадающем списке:

Запрос:

apps.$app.servers.$__searchFilter

TagValues:

tag_values(server, server=~${__searchFilter:regex})