2 网络接口发现

可以发现网络接口及其属性:

  • 接口名称
  • 接口别名
  • 接口 MAC 地址
  • 接口类型
  • 链路速度
  • 接口最新或当前的双工值
  • 已配置的以及 RFC2863 运行状态
  • 物理链路是否存在
  • 链路变为 up 或 down 的次数,以及链路状态发生变化的总次数
  • 入站和出站流量

为此,您可以组合使用:

  • 作为主监控项的 net.if.get agent 监控项
  • 一个依赖的低级别发现规则
  • 依赖的监控项原型

配置

主监控项

使用以下 key 创建一个 Zabbix agent 监控项:

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 规则

创建一个低级别发现规则,类型为 Dependent item

作为主监控项,选择已创建的 net.if.get 监控项。

Preprocessing 选项卡中,添加:

  • 一个带有 $.config 参数的 JSONPath 步骤。
  • 一个带有足够大的心跳间隔的 Discard unchanged with heartbeat 步骤,例如 1h,以避免不必要的 LLD 执行。 这样,主监控项可以被频繁轮询,而低级别发现仅在 config 发生变化或心跳周期到期时运行。

LLD macros 选项卡中,定义自定义宏及其对应的 JSONPath 表达式。

例如,在使用 net.if.get[enp.*] 时,可以使用以下 JSONPath 表达式:

{#IFNAME} - $.name

依赖监控项原型

在 LLD 规则中创建一个类型为 Dependent item 的监控项原型。 将已创建的 net.if.get 监控项选为此原型的主监控项。

请注意在监控项原型名称和键中使用自定义宏。 在此示例中,键是自定义且由用户定义的。

  • 名称:Interface {#IFNAME}: operational state
  • 键:net.if.oper.state[{#IFNAME}]

信息类型使用 Text

在监控项原型的 Preprocessing 选项卡中选择 JSONPath,并使用以下 JSONPath 表达式作为参数:

$.config[?(@.name=='{#IFNAME}')].operational_state.first()

还可以用同样的方式创建其他监控项原型,例如:

  • 名称:Interface {#IFNAME}: carrier changes
  • 键:net.if.carrier.changes[{#IFNAME}]
  • 预处理:JSONPath - $.values[?(@.name=='{#IFNAME}')].carrier_changes.first()
  • 名称:Interface {#IFNAME}: speed
  • 键:net.if.speed[{#IFNAME}]
  • 预处理:JSONPath - $.config[?(@.name=='{#IFNAME}')].speed.first()

当发现开始时,将为每个网络接口创建一个监控项。