Пользовательские макросы с контекстом
Обзор
В пользовательских макросах можно использовать необязательный контекст, позволяющий переопределить значение по умолчанию значением, заданным для конкретного контекста.
Контекст добавляется к имени макроса; синтаксис зависит от того, является ли контекст статическим текстовым значением:
{$MACRO:"static text"}
или регулярным выражением:
{$MACRO:regex:"regular expression"}
Обратите внимание, что макрос с контекстом в виде регулярного выражения можно определить только в конфигурации пользовательских макросов. Если префикс 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% дискового пространства
- в папках, соответствующих шаблону regexp (например, /etc, /tmp или /var), свободно менее 30% дискового пространства
- в папках, не соответствующих шаблону regexp и не являющихся /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" } и {$MACRO: "A" } одинаковы, но макросы
Следующие макросы идентичны, так как имеют один и тот же контекст: {$MACRO:A}, {$MACRO: A} и {$MACRO:"A"}. Такое поведение отлично от ключей элементов данных, где «key[a]», «key[ a]» и «key["a"]» одинаковы семантически, но различны для критерия уникальности.