🟢 Статус: Conceptually stable · v0.1
Концепция устойчива, проверена опытом, литературой и практикой.
04. LLD и прототипы¶
Low-Level Discovery (LLD) — механизм, благодаря которому Zabbix может сам обнаруживать сущности внутри хоста (диски, интерфейсы, БД, очереди, процессы) и сам создавать для них items, triggers, graphs по заранее заготовленным прототипам.
В Zabbix прототип — это заготовка внутри LLD-правила, по которой Zabbix автоматически создаёт реальные объекты мониторинга для каждого найденного ресурса. LLD-правило отвечает на вопрос «что найдено?», прототип — «что создать для каждого найденного объекта?».
Без LLD Zabbix постоянно требует ручной конфигурации для каждого объекта: диски, интерфейсы, процессы и базы данных заводятся по одному, конфигурация постепенно дрейфует от хоста к хосту. Ошибка в одном прототипе триггера, напротив, размножается на сотни реальных триггеров — поэтому прототипы это не второстепенная деталь интерфейса, а ключевой механизм стандартизации.
Простой пример¶
Допустим, есть сервер srv-01. У него диски:
Можно руками создать:
Item: свободное место C:
Item: свободное место D:
Item: свободное место E:
Trigger: C: < 10%
Trigger: D: < 10%
Trigger: E: < 10%
А можно сделать нормально через LLD:
Discovery rule: найти все файловые системы
Item prototype: свободное место на {#FSNAME}
Trigger prototype: свободное место на {#FSNAME} < 10%
И Zabbix сам создаст реальные объекты:
Item: свободное место на C:
Item: свободное место на D:
Item: свободное место на E:
Trigger: C: свободно < 10%
Trigger: D: свободно < 10%
Trigger: E: свободно < 10%
Вот эта заготовка свободное место на {#FSNAME} и есть прототип.
Для прототипа элемента данных LLD-макрос в ключе обязателен — он делает будущий item уникальным для каждого обнаруженного объекта. Например, из прототипа vfs.fs.size[{#FSNAME},pfree] Zabbix создаст отдельные элементы данных для /, /var, /home и других найденных файловых систем. Без LLD-макроса несколько обнаруженных объектов пытались бы породить один и тот же ключ, и Zabbix не смог бы корректно создать items из прототипа. (Zabbix)
Какие бывают прототипы¶
| Тип | Что создаёт |
|---|---|
| Item prototype | Метрики: диск, интерфейс, сервис, БД, tablespace |
| Trigger prototype | Триггеры для найденных объектов |
| Graph prototype | Графики для найденных объектов |
| Host prototype | Новые хосты, например VM |
| Discovery prototype | Вложенное discovery, например БД → tablespaces → tables. ⚠ Версия Zabbix: только 7.x+; в 6.0 LTS отсутствует. |
Trigger prototype поддерживает зависимости только двух видов: от другого прототипа из того же LLD-правила и от обычного триггера. Зависимость от прототипа из другого LLD-правила или от discovered trigger не поддерживается. (Zabbix) (Zabbix)
Где прототипы уже работают¶
В ежедневной работе администратор обычно видит не prototype'ы, а результат их применения: уже созданные item'ы, trigger'ы и графики на конкретном хосте. Сами prototype'ы находятся уровнем выше — внутри LLD-правил шаблона:
Поэтому термин может долго не попадаться на глаза, хотя механизм уже используется. Например, встроенные шаблоны Zabbix создают через LLD проверки для файловых систем, сетевых интерфейсов и сервисов:
Windows by Zabbix agent
└─ Network interface discovery
└─ Windows service discovery
Cisco/Eltex SNMP template
└─ Interface discovery
├─ входящий трафик {#IFNAME}
├─ исходящий трафик {#IFNAME}
└─ trigger prototype: interface down
То есть если в Zabbix автоматически появляются диски, интерфейсы, службы или другие однотипные объекты — prototype'ы уже работают.
Где это полезно в архитектуре¶
В плане Zabbix для свечного завода LLD прямо указан как часть стандартизации: интерфейсы, диски, очереди 1С и похожие повторяющиеся сущности нужно закрывать через LLD, а не руками. Правило простое: любой повторяющийся однотипный объект — кандидат на LLD-прототип.
| Область | Что обнаруживать через LLD |
|---|---|
| Windows/Linux | Диски, интерфейсы, services (⚠ только по allowlist/regex критичных служб — без фильтра получите сотни мусорных объектов), процессы |
| Сеть | Порты коммутаторов, VLAN, sensors, PSU/fan |
| VMware/Hyper-V | VM, datastores, hypervisor entities |
| MSSQL/PostgreSQL | Базы, tablespaces, replication slots |
| 1С | Кластеры, рабочие серверы, информационные базы, rphost count/health, сеансы, фоновые задания, лицензии HASP |
| Veeam | Jobs, repositories, backup sessions |
| UPS/SNMP | Батареи, входы/выходы, датчики |
Где прототипы опасны¶
Главная проблема — они могут нагенерировать мусор и нагрузку.
Плохой пример:
Discover all Windows services
→ создать item + trigger на каждый service
→ на 500 серверах по 200 services
→ 100 000+ items и куча шума
Или:
Discover all network interfaces
→ без фильтра
→ loopback, tunnel, docker, veth, virtual adapters
→ сотни ненужных метрик
Поэтому в нормальной эксплуатации LLD всегда идёт с фильтрами, overrides и политикой жизненного цикла.
LLD-фильтры и overrides¶
Filters отсекают мусор на входе: regex или условие по LLD-макросу, чтобы не создавать объекты для loopback, docker-интерфейсов, временных дисков и т.д.
Overrides позволяют менять severity, теги, enable state, interval по классу найденного объекта — без дублирования прототипов. Например: все найденные диски C: — High, остальные — Warning.
Жизненный цикл disappeared/lost resources¶
Когда LLD-объект больше не попадает в результаты обнаружения (диск отмонтирован, интерфейс удалён, сервис исчез из discovery-вывода), Zabbix не удаляет его сразу. Поведение задаётся в правиле обнаружения:
Disable lost resources — через какое время отключить элементы и триггеры
Delete lost resources — через какое время удалить сам объект
Keep lost resources period — устаревшее название (Zabbix до 6.x)
Без явной настройки в конфигурации копятся потерянные LLD-объекты: засоряют инвентарь и могут давать ложные срабатывания. Удалять немедленно опасно — ошибка в фильтре или временное исчезновение объекта приведёт к потере исторических данных. Разумная отправная точка — 30 дней.
История и тренды для уже удалённых объектов управляются не LLD-правилом, а housekeeping (history/trends retention).
Windows services через LLD: не добавляйте в мониторинг все службы подряд. Используйте allowlist/regex для критичных служб: SQL Server, Exchange, 1С, агенты backup, EDR и т.п. Иначе LLD создаст десятки или сотни элементов и триггеров по службам, которые не являются объектами эксплуатации. Это раздувает конфигурацию и создаёт шум.
Макросы с контекстом: разные пороги для разных объектов¶
Самый мощный инструмент тонкой настройки LLD-шаблонов — пользовательские макросы с контекстом ({$MACRO:context}). Они позволяют задать дефолтный порог на уровне шаблона и переопределить его для конкретного хоста или конкретного обнаруженного объекта.
Синтаксис¶
{$MACRO} — обычный макрос, fallback-значение
{$MACRO:"static context"} — статический контекст
{$MACRO:regex:"pattern"} — контекст-регулярное выражение
В триггере-прототипе контекст передаётся через LLD-макрос:
Zabbix резолвит {#FSNAME} в имя конкретного диска при создании триггера из прототипа.
Порядок разрешения¶
Zabbix ищет значение макроса по двум осям.
Где задано (от приоритетного к fallback):
- Макрос на самом хосте
- Макрос на шаблонах, привязанных к хосту (по уровню вложенности)
- Глобальный макрос
Какой контекст подошёл (внутри каждого уровня):
- Точное совпадение контекста (
{$MACRO:"/boot"}) - Совпадение по regex-контексту (
{$MACRO:regex:"^/[a-z]+$"}) — при нескольких regex-совпадениях порядок не определён, пересекающихся паттернов лучше избегать - Макрос без контекста (
{$MACRO}) — fallback
На практике это даёт три ступени переопределения для LLD-прототипов:
- Шаблонный дефолт —
{$MACRO}и{$MACRO:"..."}на шаблоне: базовое поведение для всех хостов, использующих шаблон - Host-wide override —
{$MACRO}на конкретном хосте: перебивает шаблонный дефолт сразу для всех обнаруженных объектов этого хоста - Host+context override —
{$MACRO:"..."}на конкретном хосте: перебивает поведение только для одного обнаруженного объекта, остальные продолжают работать по шаблону
Практический пример: пороги свободного места на дисках¶
На шаблоне задаём дефолт и исключения:
{$VFS.FS.UTIL.WARN} = 80 ← применяется ко всем дискам
{$VFS.FS.UTIL.WARN:/boot} = 90 ← /boot заполняется меньше, порог выше
{$VFS.FS.UTIL.WARN:/var} = 75 ← /var под логи, реагируем раньше
Триггер-прототип использует контекстный макрос:
При LLD-обнаружении /boot, /var, /data Zabbix создаёт отдельные триггеры для каждого диска, каждый со своим порогом.
На уровне конкретного хоста доступны обе формы переопределения:
{$VFS.FS.UTIL.WARN} = 70 ← host-wide: для всех дисков этого хоста
{$VFS.FS.UTIL.WARN:/data} = 85 ← host+context: только для /data
Первая строка перебивает шаблонный дефолт 80 сразу для всех обнаруженных дисков на этом хосте — удобно, когда конкретный сервер требует более жёсткой или более мягкой реакции в целом. Вторая — точечно меняет порог только для /data, остальные диски продолжают работать по шаблону. Шаблон при этом остаётся нетронутым.
Ограничение¶
В качестве контекста поддерживаются только LLD-макросы ({#FSNAME}, {#IFNAME}, {#DEVNAME}) и статические строки. Обычные Zabbix-макросы ({HOST.NAME} и др.) в контексте не работают — игнорируются.
Когда применять¶
- Разные пороги утилизации для системных дисков и дисков с данными
- Разные пороги ошибок для разных сетевых интерфейсов (
{$IF.ERRORS.WARN:eth0}) - Разные RPO/RTO для разных заданий Veeam
- Исключение конкретных объектов из мониторинга через макрос-флаг
Где смотреть прототипы в интерфейсе¶
В шаблоне:
Внутри discovery rule проверяются:
На хосте объекты, созданные через LLD, обычно помечены как discovered и связаны с исходным discovery rule. Это помогает понять, был объект создан вручную или появился автоматически.
Связь с остальными главами¶
- Глава 3 — Теги: теги на prototype-объектах автоматически наследуются на discovered items/triggers — это важный механизм
- Глава 13 — Шаблоны: для MSSQL DB, Exchange DB copies, Veeam jobs, UserGate interfaces/VPN — везде нужен LLD