Zabbix4.4でpg_monzを使用してPostgreSQL11を監視する（構築メモ）

# はじめに

Zabbix4.4＋pg_monzを使用して、PostgreSQL11を監視する環境を構築します。
使用する環境は以下のとおりです。

- CentOS 7.5（firewalld, SELinuxは無効化済み）
- PostgreSQL 11.7（同じサーバにインストール済み）
- Zabbix4.4 + pg_monz2.2

最後に書いていますが、現状一部項目が監視できていません（後で調査するつもり）


# Zabbix4.4のインストール

まずはZabbix4.4.1をインストールしていきます。

```
# wget http://repo.zabbix.com/zabbix/4.4/rhel/7/x86_64/zabbix-release-4.4-1.el7.noarch.rpm
# rpm -ivh zabbix-release-4.4-1.el7.noarch.rpm

# yum install -y zabbix-agent zabbix-server-pgsql zabbix-get
# yum install -y zabbix-web-japanese zabbix-web-pgsql
# yum install -y zabbix-sender
```

PHP側のタイムゾーンを変える

```
vi /etc/httpd/conf.d/zabbix.conf
php_value date.timezone "Asia/Tokyo"
```

PostgreSQL11にZabbix用のデータベースを作成します。

```
# su - postgres
$ createuser --pwprompt zabbix
$ createdb -O zabbix -E UTF8 zabbix
```

pg_hba.confを修正して、zabbixユーザで接続できるように設定する。

```
$ vi /data/pg_hba.conf 
local   zabbix          zabbix                                  md5
host    zabbix          zabbix          127.0.0.1/32            md5
※localはいらなかったかも（TODO：暇があったら確認する）

host    postgres        postgres        127.0.0.1/32            md5

$ pg_ctl restart
```

以下のコマンドを実行し、zabbixデータベースにテーブル・データを作成します。

```
# zcat /usr/share/doc/zabbix-server-pgsql-4.4.1/create.sql.gz | psql -U zabbix zabbix -W
```

設定が終わったところで、各種サービスの自動起動設定と起動を行います。

```
systemctl start zabbix-server
systemctl start zabbix-agent
systemctl start httpd
systemctl enable zabbix-server
systemctl enable zabbix-agent
systemctl enable httpd
```


# Zabbixへのログインまで

ブラウザで以下のアドレスにアクセスします。

- http://ZabbixサーバーのIPアドレス/zabbix/

「Welcome」ページはそのまま「Next step」を押して次の画面へ移ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/d2f3d6c6-dfd2-2d87-fd4f-9c178ca5a980.png)

前提条件が全てOKになっていることを確認して画面へ移ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/9a0f5a8c-ad4a-fd62-b8dc-eea8a28e3afd.png)

Zabbixのデータの保存先を指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/0f8b8cb0-ef3e-7607-77c5-db52c2c55742.png)

Zabbixサーバの情報ですが、特に何も変更せずに次へ進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/dc909471-3d2d-25f5-bd3c-7b6609a7be2d.png)

インストールのサマリが表示されます。そのまま次へ進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/2deb66af-f154-51c8-79c1-c3a0816f6a37.png)

問題なければインストール完了しますので、「Finish」を押すとログイン画面へ移動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/56668322-52d3-affa-74f0-0244dd2f0f4c.png)

ログイン画面では、「Admin/zabbix」でログインします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/5a4cabd1-76ca-1bb3-d335-34f859971e4f.png)

画面からは色々と設定する項目はありますが、まずは言語を日本語に変更しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/b9aed3c2-00ba-819a-5559-55c47255af5f.png)


# Zabbixの設定

Zabbixのデータの保存先（PostgreSQL）を設定します。

```
# vi /etc/zabbix/zabbix_server.conf

DBHost=127.0.0.1
DBPassword=zabbix
DBPort=5432
```

# pg_monzのtemplateインストール

以下の公式サイトからpg_monzのモジュール（zipファイル）をダウンロードします。

- https://github.com/pg-monz/pg_monz

zipファイル中の以下のディレクトリに各種templateファイルが保存されています。

- pg_monz-2.2\pg_monz\template

今回はPostgreSQL 1台構成なので以下のtemplateファイルをZabbixのTemplate画面からインポートします。

- Template_App_PostgreSQL.xml
※SR、pgpool-IIは今回未使用

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/4b2b27a9-20fa-5291-31b2-ca33bdaa726a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/f9bd34e0-e951-ec91-5ccc-8f8662493404.png)

なぜかインポートで色々エラーが出たので、templateファイルを修正（screens削除等）を実施してインポートしました（原因不明）。


# pg_monzのインストール

先ほどダウンロードしたzipファイルをサーバへ格納し、インストールのため以下のコマンドを実行します。

```
# unzip pg_monz-2.2.zip
# cd pg_monz-2.2/pg_monz/

# cp usr-local-etc/* /usr/local/etc
# cp usr-local-bin/* /usr/local/bin
```

pg_monzの設定ファイルをコピーします。この設定ファイルは変更する必要ありません。

```
# cp /tmp/pg_monz-2.2/pg_monz/zabbix_agentd.d/userparameter_pgsql.conf /etc/zabbix/zabbix_agentd.d/
```

# PostgreSQLの設定変更

PostgreSQLのログはデフォルトで"600"に設定されており、Zabbixユーザからログが見れないので以下のようにpostgresql.confの設定を変更します。変更後はPostgreSQLを再起動します。

```
$ vi /data/postgresql.conf
log_file_mode = 0644

# chmod 750 /data
# chmod 750 /data/log

# vi /etc/group
postgres:x:26:zabbix

# chmod 644 /data/log/postgresql-*.log

$ pg_ctl restart
```


# Zabbix-agentがPostgreSQLへ接続できるように設定

PostgreSQLへ接続するときにパスワードが必要な場合、pgsql_funcs.confに以下の一行を追加します。

```
# vi /usr/local/etc/pgsql_funcs.conf

export PGPASSFILE=/usr/local/etc/pgpass
```

次にパスワードを格納するファイル（/usr/local/etc/pgpass）を作成します。

```
# vi /usr/local/etc/pgpass

127.0.0.1:5432:*:postgres:パスワード
```

Zabbixエージェントの起動ユーザのみに権限を付与します。

```
# chown zabbix:zabbix /usr/local/etc/pgpass
# chmod 600 /usr/local/etc/pgpass
```

zabbix-agentのログにbcコマンドが見つからないとエラーが出たので、bcをインストールしました。

```
# yum install -y bc
```

zabbix-agentを再起動する。

```
# systemctl restart zabbix-agent.service
```

# Zabbixの画面からTemplateのマクロ設定を変更

Zabbixの画面からマクロの{$PGLOGDIR}の値を以下のように実際のログディレクトリ（私の環境では/data/log）に変更する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/34054eef-1640-ea97-bda8-50f82adfe3e8.png)


# PostgreSQLサーバにtemplateを適用

PostgreSQLサーバにtemplateを適用して監視対象になるように設定します。
以下のようにサーバに「Template App PostgreSQL」がリンクするようにしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/5656abe6-f6b4-c562-bb68-072e530e5001.png)

これで以下のように監視できるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/d0d67bef-f11b-e02e-a077-b849db07dbfa.png)




# 設定ファイル

Zabbix、pg_monzの設定ファイの一覧は以下のとおりです。

- Zabbix server
/etc/zabbix/zabbix_server.conf 

- Zabbix agent
/etc/zabbix/zabbix_agentd.conf

- pg_monz
/usr/local/etc/pgsql_funcs.conf
/etc/zabbix/zabbix_agentd.d/userparameter_pgsql.conf
/usr/local/etc/pgpass


# ログファイル

- /var/log/zabbix/zabbix_agentd.log
- /var/log/zabbix/zabbix_server.log


# 最後に（終わっていない）

上述のように設定したのですが、一部のエラーが解消されませんでした。
zabbix_server.logに出力されていたエラーは以下のようになります。一部の情報が表示されないのですが、まずは一旦完了し後日調べてみるつもりです。

```
 21919:20191103:191903.740 error reason for "Zabbix server:pgsql.get.pg.transactions[{$PGSCRIPTDIR},{$PGSCRIPT_CONFDIR},{HOST.HOST},{$ZABBIX_AGENTD_CONF}]" changed: Value "Response from "127.0.0.1:10051": "processed: 8; failed: 0; total: 8; seconds spent: 0.000099"
sent: 8; skipped: 0; total: 8" of type "string" is not suitable for value type "Numeric (unsigned)"
 21916:20191103:191905.748 error reason for "Zabbix server:pgsql.get.pg.slow_query[{$PGSCRIPTDIR},{$PGSCRIPT_CONFDIR},{HOST.HOST},{$ZABBIX_AGENTD_CONF},{$PGSLOWQUERY_TIME_THRESHOLD}]" changed: Value "Response from "127.0.0.1:10051": "processed: 3; failed: 0; total: 3; seconds spent: 0.000052"
sent: 3; skipped: 0; total: 3" of type "string" is not suitable for value type "Numeric (unsigned)"
```

# 参考

- [PostgreSQL monitoring template for Zabbix (pg_monz)](http://pg-monz.github.io/pg_monz/)
- [統合監視ソフトウェア Zabbix で PostgreSQL を監視しよう](https://www.sraoss.co.jp/technology/zabbix/introduction/pg_monz.php)
- [pg_monzの導入手順と PostgreSQL監視の実態](https://thinkit.co.jp/story/2014/02/06/4812)