2 Обнаружение сетевых интерфейсов
Можно обнаруживать сетевые интерфейсы и их свойства:
- имя интерфейса
- псевдоним интерфейса
- MAC-адрес интерфейса
- тип интерфейса
- скорость соединения
- последнее или текущее значение дуплекса интерфейса
- настроенное и рабочее состояние RFC2863
- наличие физического соединения
- количество переходов соединения в состояние up или down, а также общее число изменений состояния соединения
- входящий и исходящий трафик
Для этого можно использовать комбинацию из:
- элемента данных
net.if.getагента в качестве основного элемента данных - зависимого правила обнаружения низкого уровня
- зависимых прототипов элементов данных
Конфигурация
Мастер-элемент данных
Создайте элемент данных агента Zabbix, используя следующий ключ:
net.if.get[enp.*]

Установите для Типа информации значение Текст для потенциально больших JSON-данных.
Историю можно установить в значение Не хранить, так как он используется только как мастер-элемент данных.
Можно настроить относительно короткий интервал обновления, например 1m, чтобы обеспечить частый опрос данных.
Элемент данных обнаруживает сетевые интерфейсы, имена которых соответствуют enp.*, и возвращает их конфигурацию и статистику.
Данные, возвращаемые этим элементом данных, будут содержать информацию, аналогичную следующей, для сетевых интерфейсов:
{
"config": [
{
"name": "enp0s3",
"mac": "08:00:27:9a:8f:bb",
"type": "physical",
"speed": 1000,
"duplex": "full",
"administrative_state": "up",
"operational_state": "up",
"carrier": 1
}
],
"values": [
{
"name": "enp0s3",
"mac": "08:00:27:9a:8f:bb",
"carrier": 1,
"carrier_changes": 2,
"carrier_up_count": 1,
"carrier_down_count": 1,
"in": {
"bytes": 98241651,
"packets": 72754,
"errors": 0,
"dropped": 0,
"overruns": 0,
"frame": 0,
"compressed": 0,
"multicast": 17
},
"out": {
"bytes": 1299650,
"packets": 11380,
"errors": 0,
"dropped": 0,
"overruns": 0,
"collisions": 0,
"carrier": 0,
"compressed": 0
}
}
]
}
Зависимое правило LLD
Создайте правило обнаружения на низком уровне типа Зависимый элемент данных:

В качестве мастер-элемента выберите созданный элемент net.if.get.
На вкладке Предобработка добавьте:
- Шаг JSONPath с параметром
$.config. - Шаг Discard unchanged with heartbeat с достаточно большим интервалом heartbeat, например
1h, чтобы избежать ненужного выполнения LLD. Это позволяет опрашивать мастер-элемент часто, а обнаружение на низком уровне выполнять только при измененииconfigили по истечении периода heartbeat.

На вкладке LLD macros определите пользовательские макросы с соответствующими выражениями JSONPath.
Например, при использовании net.if.get[enp.*] можно использовать следующие выражения JSONPath:
{#IFNAME} - $.name

Прототип зависимого элемента данных
Создайте прототип элемента данных типа Dependent item в правиле LLD.
Выберите созданный элемент net.if.get в качестве мастер-элемента для этого прототипа.

Обратите внимание на использование пользовательских макросов в имени и ключе прототипа элемента данных. В этом примере ключ является пользовательским и задан вручную.
- Имя: Интерфейс
{#IFNAME}: operational state - Ключ:
net.if.oper.state[{#IFNAME}]
В качестве типа информации используйте Text.
На вкладке Preprocessing прототипа элемента данных выберите JSONPath и используйте следующее выражение JSONPath в качестве параметра:
$.config[?(@.name=='{#IFNAME}')].operational_state.first()

Дополнительные прототипы элементов данных можно создать аналогичным образом, например:
- Имя: Интерфейс
{#IFNAME}: carrier changes - Ключ:
net.if.carrier.changes[{#IFNAME}] - Preprocessing: JSONPath -
$.values[?(@.name=='{#IFNAME}')].carrier_changes.first() - Имя: Интерфейс
{#IFNAME}: speed - Ключ:
net.if.speed[{#IFNAME}] - Preprocessing: JSONPath -
$.config[?(@.name=='{#IFNAME}')].speed.first()
Когда обнаружение начнется, для каждого сетевого интерфейса будет создан один элемент данных.