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()

Когда обнаружение начнется, для каждого сетевого интерфейса будет создан один элемент данных.