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

Обзор

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

Контекст добавляется к имени макроса; синтаксис зависит от того, является ли контекст обычным текстовым значением:

{$МАКРОС:"обычный текст"}

или регулярным выражением:

{$МАКРОС:regex:"регулярное выражение"} 

Обратите внимание, макрос с контекстом в виде регулярного выражения можно задавать только в настройках пользовательских макросов. Если префикс regex: используется в каком-либо другом месте как контекст пользовательского макроса, например в выражении триггера, этот префикс будет рассматриваться как обычный контекст.

Заключение в кавычки контекста опционально (смотрите также важные замечания).

Примеры контекста макросов:

Пример Описание
{$LOW_SPACE_LIMIT} Пользовательский макрос без контекста.
{$LOW_SPACE_LIMIT:/tmp} Пользовательский макрос с контекстом (статическая строка).
{$LOW_SPACE_LIMIT:regex:"^/tmp$"} Пользовательский макрос с контекстом (регулярное выражение). То же, что и {$LOW_SPACE_LIMIT:/tmp}.
{$LOW_SPACE_LIMIT:regex:"^/var/log/.*$"} Пользовательский макрос с контекстом (регулярное выражение). Соответствует всем строкам с префиксом /var/log/.

Примеры использования

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

  • {$LOW_SPACE_LIMIT} = 10
  • {$LOW_SPACE_LIMIT:/home} = 20
  • {$LOW_SPACE_LIMIT:regex:"^\/[a-z]+$"} = 30

Затем в прототипе триггеров для обнаружения примонтированных файловых систем можно использовать макрос низкоуровневого обнаружения как контекст ранее добавленного макроса:

last(/host/vfs.fs.size[{#FSNAME},pfree])<{$LOW_SPACE_LIMIT:"{#FSNAME}"}

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

  • директория /home имеет менее 20% свободного места на диске
  • директории, которые соответствуют шаблону регулярного выражения (такие как /etc, /tmp или /var), имеют менее 30% свободного места на диске
  • директории, которые не соответствуют шаблону регулярного выражения и не /home, имеют менее 10% свободного места на диске

Важные замечания

  • Если существует более одного пользовательского макроса с контекстом, Zabbix сначала попытается сопоставить макросы с простым контекстом и только затем макросы с контекстом в виде регулярного выражения в неопределённом порядке.

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

  • Если макрос со своим контекстом не найден на узле сети, присоединённых шаблонах или на глобальном уровне, тогда будет произведён поиск макроса без наличия контекста.
  • В контекстах макроса поддерживаются только макросы низкоуровневого обнаружения. Любые другие макросы игнорируются и обрабатываются как текстовые значения.

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

  • Контекст макроса необходимо заключать в кавычки ​", если контекст содержит символ } или он начинается с символа ​". Кавычки внутри заключённого в кавычки контекста необходимо экранировать при помощи символа \.
  • Сам символ \ не экранируется, что означает, что невозможно задать заключённый в кавычки контекст, оканчивающийся на символ \ - макрос {$MACRO:"a:\b\c\"} ошибочный.
  • Пробелы в начале контекста игнорируются, пробелы в конце не игнорируются:
    • Например, {$MACRO:A} тоже самое, что и {$MACRO: A}, но не то же самое, что {$MACRO:A }.
  • Все пробелы до открывающих кавычек и после закрывающих кавычек игнорируются, но все пробелы внутри кавычек не игнорируются:
    • Макросы {$MACRO:"A"}, {$MACRO: "A"}, {$MACRO:"A" } и {$MACRO: "A" } одинаковы, но макросы {$MACRO:​"A​"} и {$MACRO:​" A ​"} не одинаковы.

Следующие макросы идентичны, так как имеют один и тот же контекст: {$MACRO:A}, {$MACRO: A} и {$MACRO:​"A​"}. Такое поведение отлично от ключей элементов данных, где key[a], key[ a] и key[​"a​"] одинаковы семантически, но различны для критерия уникальности.