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 版で開くときちんと中身が表示されました。何が違うんだろう。そういうこともあるということで。