Хотя вы может быть и найдёте требуемый номер индекса (например, сетевого интерфейса) из всех SNMP OID'ов, иногда вы не можете полностью положиться на то, что номер индекса всегда останется таким же.
Индексы могут быть динамическими — они могут изменяться время от времени и, как следствие, ваш элемент данных может перестать работать.
Чтобы избежать этого, имеется возможность указать OID, который принимает во внимание возможность изменения номера индекса.
Например, если вам необходимо получить значение индекса, который относится к ifInOctets, которое соответствует интерфейсу GigabitEthernet0/1 на устройстве Cisco, используйте следующий OID:
Для OID используется специальный синтаксис:
<OID данных>["index","<базовый OID индекса>","<искомая строка>"]
Параметр | Описание |
---|---|
OID данных | Основной OID, который используется для получения данных по элементу данных. |
index | Метод обработки. В настоящее время поддерживается только один метод: index — поиск индекса и присоединение его к OID'у данных |
базовый OID индекса | Этот OID будет просматриваться для получения значения индекса, соответствующего заданной строке. |
искомая строка | Строка, используемая для точного совпадения со значением при выполнении поиска. Регистрозависимо. |
Получение использования памяти процессом apache.
Если используется этот синтаксис OID:
номер индекса будет искаться здесь:
...
HOST-RESOURCES-MIB::hrSWRunPath.5376 = STRING: "/sbin/getty"
HOST-RESOURCES-MIB::hrSWRunPath.5377 = STRING: "/sbin/getty"
HOST-RESOURCES-MIB::hrSWRunPath.5388 = STRING: "/usr/sbin/apache2"
HOST-RESOURCES-MIB::hrSWRunPath.5389 = STRING: "/sbin/sshd"
...
Теперь у нас есть индекс, равный 5388. Индекс будет присоединён к OID'у данных, чтобы получить интересующее нас значение:
При запросе динамического индекса элемента данных, Zabbix извлекает и кэширует всю таблицу SNMP под базовым OID, даже если совпадение будет найдено ранее. Это делается на случай, если другой элемент данных в дальнейшем ссылается на тот же самый базовый OID — Zabbix будет искать индекс в кэше, вместо ещё одного запроса к наблюдаемому устройству. Обратите внимание, что каждый процесс поллера использует свой собственный кэш.
Во всех последующих операциях получения значений проверяется только найденный индекс. Если он не изменился, значение запрашивается. Если он изменился, кэш перестраивается — каждый поллер, который встречает изменённый индекс, снова обходит и кэширует таблицу индексов SNMP.