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