Zabbix 2.0 ではサーバとエージェントのセットで生きてくるローレベルディスカバリという機能が新しく搭載されています。これは、エージェントが動作するホスト上のアイテム、トリガー、グラフをホストの環境に合わせて自動で生成するものです。Zabbix 1.8 までもテンプレートにてある程度想定できるアイテムを作り込んでおき展開はできていましたが、ホストごとにファイルシステムの構成が違うだとかNICの種類が違うだとかで、細かい違いの部分はアイテムをチマチマと作る必要がありました。これがなにげに面倒な作業でしたがここから開放されます。
Zabbix のマニュアル 3 Low-level discovery [Zabbix] が参考になります。そのまま入力していけば良いという感じです。ローレベルディスカバリでは、特定のJOSN形式で項目リストを返してくるキーを使います。
vfs.fs.discovery
と net.if.discovery
です。vfs.fs.discovery
はエージェントがインストールされたホストのファイルシステムの一覧を提供します。サーバはこのファイルシステム一覧から、ファイルシステムを監視するためのアイテムを生成します。net.if.discovery
のネットワークインタフェースも同様です。生成されたアイテムに応じて、トリガー(例えば空き容量監視であったり)やグラフ(NICごとのトラフィックのグラフであったり)も自動生成されます。
例えばこんなデータです。
# zabbix_get -s127.0.0.1 -k"vfs.fs.discovery" { "data":[ {"{#FSNAME}":"\/","{#FSTYPE}":"rootfs"}, {"{#FSNAME}":"\/","{#FSTYPE}":"ext3"}, {"{#FSNAME}":"\/dev","{#FSTYPE}":"tmpfs"}, {"{#FSNAME}":"\/proc","{#FSTYPE}":"proc"}, {"{#FSNAME}":"\/sys", "{#FSTYPE}":"sysfs"}, {"{#FSNAME}":"\/boot","{#FSTYPE}":"ext3"}, {"{#FSNAME}":"\/dev\/shm","{#FSTYPE}":"tmpfs"}, {"{#FSNAME}":"\/net","{#FSTYPE}":"autofs"} ] } # zabbix_get -s127.0.0.1 -k"net.if.discovery" { "data":[ {"{#IFNAME}":"lo"}, {"{#IFNAME}":"eth0"}, {"{#IFNAME}":"eth1"}, {"{#IFNAME}":"sit0"} ] }
こうやって出てくるデータの中から、{#IFNAME}
や {#FSNAME}
、{#FSTYPE}
がマクロとして使用できます。同じ形式でデータを返すのなら別のものを UserParameter として定義することももちろん可能です。ループバックは監視しなくていいな、とか、proc や sysfs 監視しても仕方ないだろう、なんてときは、ディスカバリ対象をフィルタすることができます。具体的には、マクロに対して正規表現で発見するモノをフィルタとして記述します。こんなかんじです。
あとはいつものアイテム登録と同じようにアイテムのプロトタイプを登録してゆきます。アイテムの中にマクロを使用すると、発見した分だけ展開されます。ファイルシステムであれば、“vsf.fs.size[{#FSNAME},total]”, “vsf.fs.size[{#FSNAME},used]”, “vsf.fs.size[{#FSNAME},free]”
などいつも使っているものが、ネットワークインタフェースであれば “net.if.in[{#IFNAME},bytes]”, “net.if.out[{#IFNAME},bytes]”
などが使えます。
アイテムのプロトタイプを登録したら、トリガーのプロトタイプのなかでアイテムのプロトタイプが参照できます。また、グラフのプロトタイプでもアイテムのプロトタイプが参照できます。
Lniux はまだいいんですよ、eth0、eth1 ってネットワークインタフェース名がついていくから。Windows ですよ面倒くさいのは。ドライバーによって名称が違ってくるからいちいちその文字列を調べなきゃいけない。何十台も登録作業なんかやってられるかーとあきらめかけてたところにローレベルディスカバリ。定義しとくだけで勝手にアイテムをリストアップしてくれる。Zabbix 2.0 にバージョンアップして良かった。とても快適。