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

Обзор

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

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

{$MACRO:"статичный текст"}

или регулярным выражением (поддерживается с Zabbix 5.0.2):

{$MACRO: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

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

{host:vfs.fs.size[{#FSNAME},pfree].last()}<{$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"] одинаковы семантически, но различны для критерия уникальности.