PostgreSQL の DB サイズを Zabbix から監視する

Windows版(今回は Windows2008 R2 で試しています) PostgreSQL の DB サイズを Zabbix から監視したいなと思って。これ unix だったら du -s /var/lib/pgsql/data とかでイッパツなわけですよ。Windows に du が無いのが悔やまれる。

なので PostgreSQL に接続して pg_database_size() で容量を取得することにしました。psql コマンドでできるでしょう。

バックグラウンドで走らせますからパスワードの入力は避ける必要があります。Windows の Zabbix Agent は Local System ユーザ権限で動作しますので、Local System ユーザに対してパスワード入力なしに psql を実行できるようにします。

これはパスワードファイルを用意することで実現できます。postgresql のマニュアルを見てみます→パスワードファイル

これに従って用意しましょう。

SYSTEM ユーザの %APPDATA% は(標準のまま導入していれば) C:\Windows\system32\config\systemprofile\AppData\Roaming ですので、ここに postgresql フォルダを作り、なかに pgpass.conf ファイルを作成します。pgpass.conf ファイルの中身はマニュアルの通りです。

これで、パスワード入力なしに psql コマンドを動かす準備ができました。

あと、こんなバッチファイルを用意です。C:\scripts\pg_database_size.bat としましょう。

@echo off
@rem ----------------------------------------------------------------------
@rem PostgreSQL DBサイズを取得する。引数1:DB名
@rem ----------------------------------------------------------------------
SET PGDATA=C:\Program Files\PostgreSQL\9.0\data
SET PGDATABASE=postgres
SET PGUSER=postgres
SET PGPORT=5432
SET PGLOCALEDIR=C:\Program Files\PostgreSQL\9.0\share\locale
cd /d "C:\Program Files\PostgreSQL\9.0\bin"
for /f USEBACKQ %%A in (`psql -t -c  "select pg_database_size('%1');"`) do echo %%A

Zabbix Agent の設定ファイル内でこれを呼び出します。UserParameter で定義します。

UserParameter=pgsql.dbfile.size[*],C:\scripts\pg_database_size.bat $1

Zabbix Agent のサービスを再起動すると、Zabbix Server 側から pgsql.dbfile.size で呼び出せるようになります。ホストのアイテムとして登録してみます。登録した時の引数としてはDB名を与えます。たとえば postgres など。イメージとしてはこんな感じです。

こんな感じでいけるので、あとは psql 経由で取れるデータは同じ方法でどんどんとれるでしょう。

ところで、Windows 2008 R2 の SYSTEM ユーザの %APPDATA%\postgresql\pgpass.conf ですが、OS付属のメモ帳(64bit)で作ったあと、32bit 版の sakura editor で開いたら空っぽで表示されてしまいました。メモ帳 32bit 版(WOW64のフォルダにあるヤツ)でも空っぽです。どうやら postgresql フォルダ以下が 32bit アプリからは見えないようです。64bit 版で開くときちんと中身が表示されました。何が違うんだろう。そういうこともあるということで。