[comment]: # translation:outdated

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

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

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

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

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

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

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

    {$МАКРОС: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/.|

[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})
