Sidebar

Zabbix Summit 2022
View presentations

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