pgwatch2のミニマム設定でPostgreSQLを監視する
目次
手軽にPostgreSQLの監視をする
業務では libzbxpgsql(https://github.com/cavaliercoder/libzbxpgsql) を使ってZabbixにメトリクスを収集し、そのZabbixあるいはデータソースとしてのAmazon AuroraをデータソースとしてGrafanaでビジュアライズしている。
これには、Zabbixエージェント、Zabbixサーバ、Grafanaサーバ、DBサーバといった登場人物がいるわけだが、これをいちから準備するのはそこそこ手間である。それに、Zabbixは自由度が高く非常に便利だけれども、個人的に学習コストが高いように思う。慣れてしまうと、神がかったアイテムとトリガーとアクションを瞬時に作れるオジさんになれるのだろうが、手軽にPostgreSQLの状態をモニタリングできるツールがあれば個人用途であったり開発環境ではそっちに惹かれてしまうわけである。
目的は、ちょっとした非prodcution環境に立てただけのシングルなPostgreSQLに対して最低限の監視がしたい。ガッツリZabbixでというほどのモチベーションが湧かない。
このような時、ある程度簡単に作れてエージェントレスで素敵に可視化してくれるモニタリングツールがあると助かるが、まさにpgwatch2というのはそういう用途でガンガン使えるものになっている。
注: このエントリは、利用手順を書くものではなく、如何に簡単に始められるかに言及しており、手順が知りたい場合は、READMEがだいぶ詳しいのでそれに従うようにされたい。 -> GitHub - cybertec-postgresql/pgwatch2: PostgreSQL metrics monitor/dashboard
pgwatch2のアーキテクチャ
以下の図で大変わかりやすく説明できる。
図にあるように、最も簡単な使い方はオールインワンの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 config
を unprivileged
にするよう注意する。さもなければ、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にアクセスしてダッシュボードを作る。
まとめ
とにかく手軽にPostgreSQLの監視を構築したいときに良い選択肢になりそうである。
自前PostgreSQLクラスタを運用しているような環境なら、今回対象外とした機能も活用してリッチな監視を作ることができるし、試しても良さそう。