14 Обнаружение блочных устройств
Обзор
Можно обнаруживать блочные устройства и их свойства:
- имя и тип блочного устройства
- идентификаторы устройства и такие свойства, как путь, модель, серийный номер, WWN и размеры блоков
- сведения о разделах
- статистику блочного устройства
Для этого можно использовать комбинацию из:
- элемента данных
vfs.dev.getв качестве мастер-элемента - зависимого правила обнаружения низкого уровня
- зависимых прототипов элементов данных
Конфигурация
Главный элемент данных
Создайте элемент данных агента Zabbix, используя следующий ключ:
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
Создайте правило обнаружения низкого уровня типа Зависимый элемент данных:

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

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

На вкладке Filters можно добавить регулярное выражение, которое будет отфильтровывать только дисковые устройства.

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

Обратите внимание на использование пользовательских макросов в имени и ключе прототипа элемента данных. Ключ в этом примере является пользовательским и заданным вручную.
- Name: Размер блочного устройства
{#DEVNAME} - Key:
dev.block.size[{#DEVNAME}]
В качестве типа информации используйте Numeric (unsigned).
На вкладке Preprocessing прототипа элемента данных выберите JSONPath и используйте следующее выражение JSONPath в качестве параметра:
$.config[?(@.name=='{#DEVNAME}')].size_bytes.first()

Дополнительные прототипы элементов данных можно создать аналогичным образом, например:
- Name: Чтение байтов на
{#DEVNAME} - Key:
dev.block.read_bytes[{#DEVNAME}] - Preprocessing: JSONPath
$.values[?(@.name=='{#DEVNAME}')].stats.bytes_read.first() - Name: Время I/O на
{#DEVNAME} - Key:
dev.block.io_time_ms[{#DEVNAME}] - Preprocessing: JSONPath
$.values[?(@.name=='{#DEVNAME}')].stats.io_time_ms.first()
Когда начнется обнаружение, для каждого блочного устройства будет создан один элемент данных.