tkuchikiの日記

Linux やプログラミングについて書きます。

zabbix の LLD で gearmand の job を動的に監視する

検証した環境の zabbix のバージョンは、2.0.15 です。

gearmand の監視を zabbix で行う際、
job の数がアプリケーションによって違うと思いますので、
テンプレートを作っても汎用的に使うことができません。

こういうケースで使えるのが LLD(ローレベルディスカバリ) です。
アイテムを動的に追加したりするあれです(vfs.fs.discovery など)。
LLD は自作もできるので、自作してみました。

Template

をインポートします。

ポートは、テンプレートのマクロで、
{$GEARMAND_PORTS} = 4730 を設定しています。

f:id:tkuchiki:20151027171421p:plain

ホストごとにポートを変更したい場合は、

ホストのマクロに {$GEARMAND_PORTS} = 14730 などと設定して上書きしてください。
また、複数ポート指定できるようにしてあるので、
必要であれば空白区切りでポートを列挙してください。

f:id:tkuchiki:20151027171626p:plain

UserParameter

LLD も UserParameter で集計するので設定ファイルとシェルスクリプトを置く必要があります。

gearmand.conf

UserParameter の設定を記述します。
zabbix_agentd.conf にベタ書きする場合は、
zabbix_agentd.conf で Include せず、直接記述してください。

zabbix_agentd.conf

UserParameter の定義を書いたファイルを読み込むために、
Include を追記します。

Include=/etc/zabbix/zabbix_agentd.d/gearmand.conf

user.discovery.gearmand.sh

アイテムを自動収集するためのスクリプトです。
LLD では、決まった形式の json を返すだけで、zabbix がアイテムを登録してくれます。

f:id:tkuchiki:20151027175902p:plain

となっているので、{$GEARMAND_PORTS} で設定したポートを引数にスクリプトを実行します。
user.discovery.gearmand.sh は第一引数に port を受けるようになっているので、
zabbix-agent が user.discovery.gearmand.sh 4730 のように叩き、
以下のような json を返します。

{
  "data": [
    {
      "{#GEARMAND_FUNC_NAME}": "Notification",
      "{#GEARMAND_PORT}": 4730
    },
    {
      "{#GEARMAND_FUNC_NAME}": "GroupNews",
      "{#GEARMAND_PORT}": 4730
    }
  ]
}

アイテムのプロトタイプに、gearmand[{#GEARMAND_PORT}, {#GEARMAND_FUNC_NAME}, capable_workers]
と設定しているので、

  • gearmand[4730, Notification, capable_workers]
  • gearmand[4730, GroupNews, capable_workers]

というアイテム(キー) が自動で登録されます。
json とアイテムのプロトタイプを見るとなんとなくお分かりいただけると思いますが、
json の key をアイテムのプロトタイプを作るときに利用でき、
key と対応する value が展開される、という動作をします。
capable_workers は、もう一つのシェルスクリプト(gearmand.sh)で使っています。

gearmand.sh

以下は、gearadmin の実行結果です。

$ gearadmin --status
Notification    1    0    1
GroupNews    2    1    1
.

左から順に、job名、キュー数、実行中のジョブ数、実行可能なworker数です。
job名以外は忘れやすそうでしたので、名前で参照できるようにしています。
名前で指定できるようにして、 STAT=$(eval echo '$'${3}) の部分で変数を展開して数値に戻しています。

設定完了

Template_gearmand をホストに設定して zabbix-agent を restart すれば、
LLD の設定完了です。
zbx_template_gearmand.xml では、port を listen しているか、capable_workers が 0 でないかを監視するトリガを設定しています。
必要であれば適宜トリガを追加してください。

まとめ

LLD で gearmand の job を監視する方法を紹介しました。
gearmand を使っていない方も、LLD の設定の参考にしていただければ幸いです。

参考資料