Расширенные конфигурации переменных

Описанные на этой странице расширенные конфигурации переменных помогают создавать дашборды, адаптирующиеся к сложным структурам данных и выбору пользователей:

  • Переменные с несколькими свойствами: сопоставление одного логического значения с несколькими значениями, специфичными для источника.
  • Связанные переменные: обновление параметров одной переменной на основе выбора в другой.
  • Фильтрация по регулярным выражениям: фильтрация значений, возвращаемых запросом переменной.

Эти конфигурации полезны для дашбордов, охватывающих несколько сред, источников данных, регионов, кластеров, пространств имён или других иерархических данных.

Переменные с несколькими свойствами

Если в дашборде с несколькими источниками для одного логического понятия используются разные значения, например среда, обозначенная как dev в одном источнике и development в другом, используйте переменную с несколькими свойствами, чтобы ссылаться на эти значения из одной переменной. Это позволяет связать связанные идентификаторы вместе и обращаться к нужному свойству в панелях и запросах.

Для этого настройте JSON-массив, в котором каждый объект может иметь любое количество свойств. Затем можно ссылаться на любое из свойств при использовании этих переменных.

Это применимо к следующим типам переменных:

  • Custom
  • Query
    • Infinity
    • PostgreSQL

Custom-переменные с несколькими свойствами

Чтобы создать custom-переменную с несколькими свойствами, определите JSON-массив, как показано ниже:

JSON
[
  { "value": "1", "text": "Development", "aws": "dev", "azure": "development", "google": "googledev" },
  { "value": "2", "text": "Staging", "aws": "stag", "azure": "staging", "google": "googlestag" },
  { "value": "3", "text": "Production", "aws": "prod", "azure": "production", "google": "googleprod" }
]

Так эти значения отображаются в предварительном просмотре:

Конфигурация custom-переменной и предварительный просмотр значений

Затем можно использовать синтаксис ${varName.someProperty} для ссылки на любое свойство на панелях дашборда или в метриках:

Переменная с несколькими свойствами, используемая на текстовой панели

Можно даже создавать глубоко вложенные свойства и по-прежнему обращаться к ним с помощью привычного синтаксиса переменных. В следующем примере у каждого пользователя есть свойство address, внутри которого вложены все элементы адреса:

Конфигурация вложенной переменной

Query-переменные с несколькими свойствами

Поскольку конфигурация запросов различается для каждого источника данных, не существует единственного способа настроить JSON-массив для создания query-переменной с несколькими свойствами. Для PostgreSQL см. раздел PostgreSQL template variables. Для других источников данных обратитесь к соответствующей документации по источникам данных для предустановленных плагинов источников данных. Сведения о настройке всех остальных плагинов источников данных см. в документации по плагинам.

Связанные переменные

Связанные переменные, также называемые linked variables или nested variables, — это query-переменные, в запросе которых присутствуют одна или несколько других переменных.

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

Шаблоны каскадных фильтров распространены в сценариях многоуровневой фильтрации, таких как регион > кластер > пространство имён > pod. Каждый уровень сужает доступные параметры на основе предыдущего выбора, создавая интуитивно понятную навигацию по вашей инфраструктуре или иерархии данных.

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

Примеры дашбордов в Grafana Play

Следующие дашборды Grafana Play содержат простые связанные переменные глубиной всего в два уровня. Чтобы просмотреть переменные и их настройки, нажмите Edit в правом верхнем углу дашборда, нажмите значок Dashboard options на панели инструментов и разверните раздел Variables. Оба примера подробно разобраны в следующем разделе.

Хотя примеры относятся к конкретным источникам данным, эти концепции можно применять широко.

Разбор примера с Graphite

В этом примере есть несколько приложений. У каждого приложения свой набор серверов. Пример основан на дашборде Graphite Templated Nested.

Можно было бы сделать отдельные переменные для каждого источника метрик, но тогда нужно знать, какой сервер относится к какому приложению. Лучшее решение — использовать одну переменную для фильтрации другой. В этом примере, когда пользователь изменяет значение переменной app, меняются параметры раскрывающегося списка, возвращаемые переменной server. Обе переменные используют параметры Multi-value и Include all option, позволяя пользователям в любой момент выбрать некоторые или все представленные параметры.

Переменная app

Запрос этой переменной возвращает все существующие приложения.

apps.*

Возвращаемые значения: backend, country, fakesite и All.

Переменная server

Запрос этой переменной возвращает все серверы для выбранного в данный момент приложения.

apps.$app.*

Если пользователь выбирает backend, запрос принимает вид:

apps.backend.*

Запрос возвращает все серверы, связанные с backend, включая backend_01, backend_02 и так далее.

Если пользователь выбирает fakesite, запрос принимает вид:

apps.fakesite.*

Запрос возвращает все серверы, связанные с fakesite, включая web_server_01, web_server_02 и так далее.

Дополнительные переменные

Note

Этот пример теоретический. Сервер Graphite, используемый в примере, не содержит метрик CPU.

В дашборде цепочка заканчивается на двух уровнях, но её можно продолжить. Например, если вы хотите получать метрики CPU для выбранных серверов, можно скопировать переменную server и расширить запрос так, чтобы он выглядел так:

apps.$app.$server.cpu.*

Этот запрос возвращает все метрики CPU для выбранного сервера.

В зависимости от того, какие параметры переменных выбирает пользователь, могут получаться запросы вида:

apps.backend.backend_01.cpu.*
apps.{backend.backend_02,backend_03}.cpu.*
apps.fakesite.web_server_01.cpu.*

Разбор примера с InfluxDB

В этом примере есть несколько центров обработки данных. У каждого центра обработки данных свой набор хостов. Пример основан на дашборде InfluxDB Templated.

В этом примере, когда пользователь изменяет значение переменной datacenter, меняются параметры раскрывающегося списка, возвращаемые переменной host. Переменная host использует параметры Multi-value и Include all option, позволяя пользователям в любой момент выбрать некоторые или все представленные параметры. Переменная datacenter не использует ни один из этих параметров, поэтому одновременно можно выбрать только один центр обработки данных.

Переменная datacenter

Запрос этой переменной возвращает все существующие центры обработки данных.

SHOW TAG VALUES WITH KEY = "datacenter"

Возвращаемые значения: America, Africa, Asia и Europe.

Переменная host

Запрос этой переменной возвращает все хосты для выбранного в данный момент центра обработки данных.

SHOW TAG VALUES WITH KEY = "hostname" WHERE "datacenter" =~ /^$datacenter$/

Если пользователь выбирает America, запрос принимает вид:

SHOW TAG VALUES WITH KEY = "hostname" WHERE "datacenter" =~ /^America/

Запрос возвращает все серверы, связанные с America, включая server1, server2 и так далее.

Если пользователь выбирает Europe, запрос принимает вид:

SHOW TAG VALUES WITH KEY = "hostname" WHERE "datacenter" =~ /^Europe/

Запрос возвращает все серверы, связанные с Europe, включая server3, server4 и так далее.

Дополнительные переменные

Note

Этот пример теоретический. Сервер InfluxDB, используемый в примере, не содержит метрик CPU.

В дашборде цепочка заканчивается на двух уровнях, но её можно продолжить. Например, если вы хотите получать метрики CPU для выбранных хостов, можно скопировать переменную host и расширить запрос так, чтобы он выглядел так:

SHOW TAG VALUES WITH KEY = "cpu" WHERE "datacenter" =~ /^$datacenter$/ AND "host" =~ /^$host$/

Этот запрос возвращает метрики CPU для выбранного хоста.

В зависимости от того, какие параметры переменных выбирает пользователь, могут получаться запросы вида:

Bash
SHOW TAG VALUES WITH KEY = "cpu" WHERE "datacenter" =~ /^America/ AND "host" =~ /^server2/
SHOW TAG VALUES WITH KEY = "cpu" WHERE "datacenter" =~ /^Africa/ AND "host" =~ /^server/7/
SHOW TAG VALUES WITH KEY = "cpu" WHERE "datacenter" =~ /^Europe/ AND "host" =~ /^server3+server4/

Рекомендации по работе со связанными переменными

Следующие практики делают дашборды и переменные удобнее в использовании.

Создание новых связанных переменных

  • Связывание переменных создаёт зависимости «родитель/потомок». Их можно представить в виде лестницы или дерева.
  • Самый простой способ создать новую связанную переменную — скопировать переменную, на основе которой вы хотите создать новую. В списке переменных нажмите значок Duplicate variable справа от записи переменной, чтобы создать копию. Затем можно дополнить запрос родительской переменной.
  • Созданные таким образом новые переменные появляются в нижней части списка. Возможно, потребуется перетащить её в другое место списка, чтобы получить логичный порядок.

Порядок переменных

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

  • Размещайте переменные, у которых нет зависимостей, вверху, перед их дочерними переменными.
  • Каждая переменная должна следовать за той, от которой она зависит.
  • Помните, что в интерфейсе нет указаний на то, какие переменные связаны отношениями зависимости. Упорядочивайте переменные логично, чтобы другим было проще ими пользоваться.

Учёт сложности

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

Например, если у вас есть цепочка из четырёх связанных переменных (country, region, server, metric) и вы меняете значение корневой переменной (country), Grafana должна выполнить запросы для всех зависимых переменных, прежде чем обновит визуализации на дашборде.

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

С помощью параметра запроса Regex вы фильтруете список параметров, возвращаемых запросом переменной, или изменяете возвращаемые параметры.

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

С помощью параметра запроса Regex вы фильтруете список параметров, возвращаемых запросом переменной, или изменяете возвращаемые параметры. Дополнительные сведения см. в руководстве Mozilla по регулярным выражениям.

Примеры фильтрации по следующему списку параметров:

text
backend_01
backend_02
backend_03
backend_04

Фильтрация с возвратом только параметров, заканчивающихся на 01 или 02

Regex:

regex
/(01|02)$/

Результат:

text
backend_01
backend_02

Фильтрация и изменение параметров с помощью группы захвата регулярного выражения для возврата части текста

Regex:

regex
/.*(01|02)/

Результат:

text
01
02

Фильтрация и изменение: пример с Prometheus

Список параметров:

text
up{instance="demo.robustperception.io:9090",job="prometheus"} 1 1521630638000
up{instance="demo.robustperception.io:9093",job="alertmanager"} 1 1521630638000
up{instance="demo.robustperception.io:9100",job="node"} 1 1521630638000

Regex:

regex
/.*instance="([^"]*).*/

Результат:

text
demo.robustperception.io:9090
demo.robustperception.io:9093
demo.robustperception.io:9100

Фильтрация и изменение с использованием именованных групп захвата text и value

С помощью именованных групп захвата можно извлекать отдельные части «text» и «value» из параметров, возвращаемых запросом переменной. Это позволяет раскрывающемуся списку переменной содержать понятное имя для каждого значения, которое можно выбрать.

Например, при запросе метрики Prometheus node_hwmon_chip_names значение chip_name гораздо понятнее, чем значение chip. Так, следующий результат запроса переменной:

text
node_hwmon_chip_names{chip="0000:d7:00_0_0000:d8:00_0",chip_name="enp216s0f0np0"} 1
node_hwmon_chip_names{chip="0000:d7:00_0_0000:d8:00_1",chip_name="enp216s0f0np1"} 1
node_hwmon_chip_names{chip="0000:d7:00_0_0000:d8:00_2",chip_name="enp216s0f0np2"} 1
node_hwmon_chip_names{chip="0000:d7:00_0_0000:d8:00_3",chip_name="enp216s0f0np3"} 1

пропущенный через следующее регулярное выражение:

regex
/chip_name="(?<text>[^"]+)|chip="(?<value>[^"]+)/g

даст следующий раскрывающийся список:

text
Display Name          Value
------------          -------------------------
enp216s0f0np0         0000:d7:00_0_0000:d8:00_0
enp216s0f0np1         0000:d7:00_0_0000:d8:00_1
enp216s0f0np2         0000:d7:00_0_0000:d8:00_2
enp216s0f0np3         0000:d7:00_0_0000:d8:00_3

Note

Поддерживаются только имена групп захвата text и value.