14 块设备的发现

概述

可以发现块设备及其属性:

  • 块设备名称和类型
  • 设备标识符和属性,例如路径、型号、序列号、WWN 和块大小
  • 分区信息
  • 块设备统计信息

为此,您可以组合使用以下内容:

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

配置

主监控项

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

vfs.dev.get[device_stats,.*]

将信息类型设置为 Text,以便处理可能较大的 JSON 数据。

此监控项可以禁用历史记录,因为它仅作为主监控项使用。 可以配置一个相对较短的更新间隔,例如 1m,以便频繁轮询数据。

该监控项返回的数据对于块设备将包含类似如下内容:

{
  "config": [
    {
      "name": "sda",
      "devid": "ata-ST1000LM024_HN-M101MBB_S2R8NX0J123456",
      "type": "disk",
      "size_bytes": 1000204886016
    },
    {
      "name": "sda1",
      "devid": "ata-ST1000LM024_HN-M101MBB_S2R8NX0J123456-part1",
      "type": "partition",
      "size_bytes": 536870912
    }
  ],
  "values": [
    {
      "name": "sda",
      "stats": {
        "reads_completed": 1284,
        "writes_completed": 312,
        "bytes_read": 104857600,
        "bytes_written": 16777216,
        "io_time_ms": 204
      }
    },
    {
      "name": "sda1",
      "stats": {
        "reads_completed": 12,
        "writes_completed": 3,
        "bytes_read": 1048576,
        "bytes_written": 262144,
        "io_time_ms": 8
      }
    }
  ]
}

config 数组包含块设备清单和元数据,这些内容通常变化不频繁。 values 数组包含块设备统计信息,这些信息会在每次轮询时更新。

依赖型 LLD 规则

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

将我们创建的 vfs.dev.get 监控项作为主监控项选择。

Preprocessing 选项卡中,添加一个带有 $.config 参数的 JSONPath 步骤。 为避免不必要的 LLD 执行,添加一个 Discard unchanged with heartbeat 步骤,并将 heartbeat 设置为一个足够大的值,例如 1h。 这样,主监控项可以被频繁轮询,而低级别发现只会在 config 发生变化时或 heartbeat 周期到期时运行:

LLD macros 选项卡中,定义带有相应 JSONPath 的自定义宏。

例如,在使用 vfs.dev.get[device_stats,.*] 时,可以使用以下 JSONPath 表达式:

{#DEVNAME} - $.name

Filters 选项卡中,您可以添加一个仅筛选磁盘设备的正则表达式。

依赖监控项原型

在此 LLD 规则中创建一个类型为 依赖监控项 的监控项原型。
将我们创建的 vfs.dev.get 监控项选为这些原型的主监控项。

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

  • 名称:块设备 {#DEVNAME} 的大小
  • 键值:dev.block.size[{#DEVNAME}]

信息类型请选择 数值(无符号)

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

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

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

  • 名称:{#DEVNAME} 的读取字节数
  • 键值:dev.block.read_bytes[{#DEVNAME}]
  • 预处理:JSONPath $.values[?(@.name=='{#DEVNAME}')].stats.bytes_read.first()
  • 名称:{#DEVNAME} 的 I/O 时间
  • 键值:dev.block.io_time_ms[{#DEVNAME}]
  • 预处理:JSONPath $.values[?(@.name=='{#DEVNAME}')].stats.io_time_ms.first()

当发现开始时,将为每个块设备创建一个监控项。