14 ブロックデバイスの検出
概要
ブロックデバイスとそのプロパティを検出できます。
- ブロックデバイス名と種類
- パス、モデル、シリアル番号、WWN、ブロックサイズなどのデバイス識別子とプロパティ
- パーティション情報
- ブロックデバイスの統計情報
そのためには、次の組み合わせを使用できます。
- マスターアイテムとして
vfs.dev.getアイテム - 依存する低レベルディスカバリルール
- 依存するアイテムプロトタイプ
設定
マスターアイテム
次のキーを使用して Zabbix エージェントアイテムを作成します。
vfs.dev.get[device_stats,.*]

大きな JSON データの可能性があるため、情報のタイプは Text に設定します。
このアイテムはマスターアイテムとしてのみ使用されるため、履歴は無効にできます。
データを頻繁に取得するために、たとえば 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の実行を避けるため、適切に大きい heartbeat、たとえば 1h を指定した Discard unchanged with heartbeat ステップを追加します。
これにより、マスターアイテムは頻繁にポーリングされ、低レベルディスカバリは config が変更されたとき、または heartbeat 期間が終了したときにのみ実行されます:

LLD macros タブで、対応するJSONPathを使用してカスタムマクロを定義します。
たとえば、vfs.dev.get[device_stats,.*] を使用する場合、次のJSONPath式を使用できます:
{#DEVNAME} - $.name

Filters タブでは、ディスクデバイスのみをフィルタリングする正規表現を追加できます。

依存アイテムのプロトタイプ
このLLDルールで、Dependent item タイプのアイテムプロトタイプを作成します。
これらのプロトタイプのマスターアイテムとして、作成した vfs.dev.get アイテムを選択します。

アイテムプロトタイプの名前とキーでカスタムマクロを使用している点に注意してください。
この例のキーはカスタムで、ユーザー定義です。
- 名前: ブロックデバイス
{#DEVNAME}のサイズ - キー:
dev.block.size[{#DEVNAME}]
情報のタイプとして、Numeric (unsigned) を使用します。
アイテムプロトタイプの Preprocessing タブで JSONPath を選択し、次のJSONPath式をパラメーターとして使用します:
$.config[?(@.name=='{#DEVNAME}')].size_bytes.first()

追加のアイテムプロトタイプは、同様の方法で作成できます。例:
- 名前:
{#DEVNAME}の読み取りバイト数 - キー:
dev.block.read_bytes[{#DEVNAME}] - Preprocessing: JSONPath
$.values[?(@.name=='{#DEVNAME}')].stats.bytes_read.first() - 名前:
{#DEVNAME}の I/O 時間 - キー:
dev.block.io_time_ms[{#DEVNAME}] - Preprocessing: JSONPath
$.values[?(@.name=='{#DEVNAME}')].stats.io_time_ms.first()
ディスカバリが開始されると、各ブロックデバイスごとに1つのアイテムが作成されます。