Zabbixで特定ディレクトリ以下のディスク使用量を監視する

Zabbixではファイルシステム単位でのディスク使用量はホストテンプレートで自動的にアイテムが追加されます。
でもディスクの残容量が圧迫されたときにどのディレクトリの使用量が増えたのかなと調べたい時があるのでその設定をしてみました。Zabbixのローレベルディスカバリ機能を使います。

監視対象ホストのzabbix agentへjsonデータを出力するスクリプトを入れる

ローレベルディスカバリでは、エージェントから帰ってきたjsonデータを元にしてアイテムを作成します。
指定されたディレクトリ以下の1階層目だけのディレクトリリストをjsonにして出力するスクリプトは以下。

#!/bin/bash
for dir_path in `/bin/find $1 -maxdepth 1 ! -regex $1 -type d`; do
    tmpdata=$tmpdata"{\"{#DIRPATH}\":\"$dir_path\"},"
done
jsondata="{\"data\":["`echo $tmpdata | sed -e "s/,$//"`"]}"
echo $jsondata

指定されたディレクトリを除くために-regexの否定をつけています。

出力されるjsonデータはこんなフォーマット。#DIRPATHのところは後で参照される変数です。

{"data":[{"{#DIRPATH}":"/tmp/mm/1"},{"{#DIRPATH}":"/tmp/mm/2"}]}

このスクリプトをzabbix agentへ登録する

上記スクリプトを適当なところへ保存。例えば /usr/local/bin/dirlist.shなどと保存してzabbix agentのUserParameterへ登録。

UserParameter=vfs.directory.discovery[*],/bin/sh /usr/local/bin/dirlist.sh $1

キー値(上記だとvfs.directory.discovery)はなんでもいいのですが、ファイルシステムっぽい感じなのでこの例ではvfs以下に指定しています。

zabbixサーバでディスカバリルールとアイテムのプロトタイプを作成

設定→ホスト→ディスカバリで「ディスカバリルールの作成」

設定項目 設定値
名前 適当に
タイプ Zabbixエージェント
キー vfs.directory.discovery[/home]
更新間隔 3600
存在しなくなったリソースの保持期間 30

名前は適当でOK。キー値は上記で設定したagentに登録したUserParameterのキー値と一致させる。
上記の場合は/home以下のディレクトリについて調べる場合。

続いてアイテムプロトタイプを設定。

設定項目 設定値
名前 directory size of [{#DIRPATH}]
タイプ Zabbixエージェント
キー vfs.dirdu.size[#DIRPATH]
アプリケーション FileSystems
更新間隔 3600

更新間隔やアプリケーションは好みで。

zabbix agentへ上記アイテムプロトタイプで設定したキーを設定

先ほど設定したディスカバリのキーと合わせてこんな。

UserParameter=vfs.directory.discovery[*],/bin/sh /usr/local/bin/dirlist.sh $1
UserParameter=vfs.dirdu.size[*],sudo du -b -s $1 | awk '{print $$1}'

awkのprint文、引数が$$1になっているのはtypoではありません。$1と書いてしまうと、agent側で引数(この場合だと/home)に展開されてしまうのでこのように書くようです。この記事を書くまで知りませんでした。

ここまで設定できたら、zabbix agentを再起動。

これで/home以下にあるディレクトリ使用量についてのアイテムが追加されます。ディレクトリが作成されたら自動的にアイテムが追加されるし、削除されたら設定した期間(この例だと30日)を経過したらアイテムも削除されます。