ujunのブログ

pgwatch2のミニマム設定でPostgreSQLを監視する

目次

手軽にPostgreSQLの監視をする

業務では libzbxpgsql(https://github.com/cavaliercoder/libzbxpgsql) を使ってZabbixにメトリクスを収集し、そのZabbixあるいはデータソースとしてのAmazon AuroraをデータソースとしてGrafanaでビジュアライズしている。

これには、Zabbixエージェント、Zabbixサーバ、Grafanaサーバ、DBサーバといった登場人物がいるわけだが、これをいちから準備するのはそこそこ手間である。それに、Zabbixは自由度が高く非常に便利だけれども、個人的に学習コストが高いように思う。慣れてしまうと、神がかったアイテムとトリガーとアクションを瞬時に作れるオジさんになれるのだろうが、手軽にPostgreSQLの状態をモニタリングできるツールがあれば個人用途であったり開発環境ではそっちに惹かれてしまうわけである。

目的は、ちょっとした非prodcution環境に立てただけのシングルなPostgreSQLに対して最低限の監視がしたい。ガッツリZabbixでというほどのモチベーションが湧かない。

このような時、ある程度簡単に作れてエージェントレスで素敵に可視化してくれるモニタリングツールがあると助かるが、まさにpgwatch2というのはそういう用途でガンガン使えるものになっている。

github.com

注: このエントリは、利用手順を書くものではなく、如何に簡単に始められるかに言及しており、手順が知りたい場合は、READMEがだいぶ詳しいのでそれに従うようにされたい。 -> GitHub - cybertec-postgresql/pgwatch2: PostgreSQL metrics monitor/dashboard

pgwatch2のアーキテクチャ

以下の図で大変わかりやすく説明できる。

https://raw.githubusercontent.com/cybertec-postgresql/pgwatch2/master/screenshots/pgwatch2_architecture.png

図にあるように、最も簡単な使い方はオールインワンのDockerイメージをrunするだけである。

docker run -d -p 3000:3000 -p 8080:8080 --name pw2 cybertec/pgwatch2

コンテナの中では、supervisord で influxDB、設定保存用PostgreSQL、Grafana、Metrics Collector(メトリクスの収集プロセス)、WebUI用に書かれた簡易なPythonアプリがサービスとして起動され、特に何もconfigを与えなくても docker run するだけでもう始まっている。Metrics Collectorが一定間隔(たいてい60secとか120sec)で 指定したメトリクスを収集し、influxDBに追記していく。閲覧するにはコンテナ中のGrafanaにアクセスすればよい。デフォルトではこのような構成なので、もちろんこのままコンテナを落とせば、何らかのデータ永続化を施していない限りは、設定、メトリクス、ダッシュボードすべてが吹っ飛ぶ。だがそれがいい。気軽に収集して確認して、あとは消すのにまったく手間がかからない。

ちなみに、この方法はあくまで最もシンプルな構成であって、例えば外部にinfluxDBやGrafana、あるいはChronograf等でもあれば、pgwatch2は単なるメトリクス収集くんになってもらい、データソースやビジュアライズは自前で用意しても良い。そのための設定は存在する。ただ、 docker run するだけでよいという手軽感が完全に良いのであって、他の構成をとるのであればpgwatch2にこだわる必要はないかもしれない。

準備

CREATE EXTENSION

GitHub - cybertec-postgresql/pgwatch2: PostgreSQL metrics monitor/dashboard

コンテナを上げた後(あげる前でもいいけど)、採取対象のPostgreSQLにて、 pg_stat_statements モジュールを有効化する。本エントリのタイトルでもある ミニマル設定 という主旨において必要な変更はこれだけであるとする。本来、pgwatch2の機能をフルに使うには、PL/Python を有効化したり、追加のヘルパ関数を多数追加するなどの変更が必要になるが、おそらく多くのDBaaSで PL/Python は許可されていないと考えられるので、本エントリでは度外視する。 pg_stat_statements は、Amazon RDSでもサポートされており、利用可能であることを前提とすることは自然である。

接続設定

GitHub - cybertec-postgresql/pgwatch2: PostgreSQL metrics monitor/dashboard

次に、採取対象のPostgreSQLへの接続情報を入力するが、これはコンテナの中いるPythonのWebアプリを通して行う。CherryPyというフレームワークで書かれているようだが、本当に接続情報を入力するためだけのUIとなっており、使い勝手がお察しなのが残念である。ただ初回設定時くらいにしか訪れないであろうページではある。接続情報のみに気をつけてほとんどはデフォルトでも期待の動作はするが、 Preset configunprivileged にするよう注意する。さもなければ、Metrics Collectorから採取対象DBに対して存在しないヘルパ関数を叩き続けてしまう。

使う

influxDB

このような設定をするだけで、以下のようなmeasurementがinfluxDBの方に生成されている。

> show measurements
name: measurements
name
----
bgwriter
db_size
db_stats
index_changes
index_stats
locks
locks_mode
object_changes
table_changes
table_io_stats
table_stats
wal

例えば、 db_stats というmeasurementの中には、 pg_stat_database から取得した各種フィールドがあり、

> show field keys from db_stats
name: db_stats
fieldKey            fieldType
--------            ---------
blk_read_time       float
blk_write_time      float
blks_hit            integer
blks_read           integer
conflicts           integer
deadlocks           integer
numbackends         integer
postmaster_uptime_s integer
temp_bytes          integer
temp_files          integer
tup_deleted         integer
tup_fetched         integer
tup_inserted        integer
tup_returned        integer
tup_updated         integer
xact_commit         integer
xact_rollback       integer

table_stats というmeasurementの中には、 pg_stat_user_talbles から取得した各種フィールドがある。

> show field keys from table_stats
name: table_stats
fieldKey                   fieldType
--------                   ---------
analyze_count              integer
autoanalyze_count          integer
autovacuum_count           integer
idx_scan                   integer
idx_tup_fetch              integer
n_tup_del                  integer
n_tup_hot_upd              integer
n_tup_ins                  integer
n_tup_upd                  integer
seconds_since_last_analyze integer
seconds_since_last_vacuum  integer
seq_scan                   integer
seq_tup_read               integer
table_size_b               integer
total_relation_size_b      integer
vacuum_count               integer
Grafana

同梱のGrafanaにアクセスしてダッシュボードを作る。

f:id:ujun:20190224164702p:plain

まとめ

とにかく手軽にPostgreSQLの監視を構築したいときに良い選択肢になりそうである。

自前PostgreSQLクラスタを運用しているような環境なら、今回対象外とした機能も活用してリッチな監視を作ることができるし、試しても良さそう。