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()
当发现开始时,将为每个块设备创建一个监控项。