[comment]: # ({73d3f62e-73d3f62e})
# 3 Пользовательские макросы с контекстом

[comment]: # ({/73d3f62e-73d3f62e})

[comment]: # ({d01ca156-4232eb11})
#### Обзор

Необязательный контекст может использоваться в [пользовательских
макросах](/manual/config/macros/user_macros), позволяя переопределить
значение по умолчанию значением, специфичным для контекста.

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

    {$MACRO:"static text"}

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

    {$MACRO:regex:"regular expression"} 

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

Кавычки для контекста необязательны (см. также [важные
примечания](#important-notes)).

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

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

[comment]: # ({/d01ca156-4232eb11})

[comment]: # ({2a65d6fe-d403a5a0})
#### Варианты использования

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

-   {$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%

[comment]: # ({/2a65d6fe-d403a5a0})

[comment]: # ({4d28ca51-4d28ca51})
#### Важные заметки

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

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

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

Технически, контекст макроса задается с использованием правил, похожих на параметры [ключей элементов данных](/manual/config/items/item/key), за исключением того, что контекст макроса при наличии `,` символа не обрабатывается как несколько параметров:

-   Контекст макроса необходимо заключать в `​"` кавычки, если контекст содержит `}` символ или он начинается с `​"` символа. Кавычки внутри заключенном в кавычки контексте необходимо экранировать при помощи `\` символа.
-   Сам символ `\` не экранируется, что означает, что невозможно задать заключенный в кавычки контекст оканчивающийся на `\` символ - макрос {$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​"]` одинаковы семантически, но различны для критерия уникальности.

[comment]: # ({/4d28ca51-4d28ca51})
