PrometheusによるPOWAのようなPostgreSQLモニタリング

背景


PostgreSQLの動作に関するデータ(サーバー全体のパフォーマンス、最も遅いクエリ、最も頻繁なクエリ)を収集して表示するために、私たちは長い間優れたPOWAユーティリティを使用してきました。 しかし、このソリューションは理想とはほど遠いものであり、メインの監視システムと完全に統合された、より良いオプションを見つけることができました。


POWAはほとんど私たちのニーズのほとんどを満たしました:



ただし、不快な短所もありました。



たとえば、いくつかのPOWAスクリーンショット:




この点で、Prometheusのpostgres_exporterを使用して、PostgreSQLでメトリックを収集しようとすることが決定されました。


設置


TL; DR:これはAnsibleの役割で、CentOS 7で作成されましたが、最小限の変更(firewalldをiptablesに置き換え)後はsystemd systemdで動作するはずです-https ://github.com/UnitedTraders/ansible-postgresql-exporter


ソリューションのアーキテクチャ


プロメテウス自体については詳しく説明しませんが、それについては十分な資料がありますが、一般的なアーキテクチャとエクスポーターについて説明します。


Prometheusはプルメトリックコレクションモデルを使用します。エクスポーターのリストがあり、HTTPを介してそれらをポーリングし、それらからメトリックのリストを収集し、ストレージに格納します。


エクスポーターは、監視が必要なエンティティ(サーバー全体、または特定のアプリケーション)からメトリックを直接収集するエージェントです。 プロメテウスには計装の豊富な機会があるため、ほとんどの一般的なアプリケーションでエクスポーターを利用できます。必要に応じて独自に作成することは難しくありません。


postgres_exporterは次のように機能します。PostgreSQLに接続し、サービステーブルへのクエリを実行し、Prometheusによる収集のために内部HTTPサーバーを使用して特別な形式で結果を公開します。 重要な点:多数のデフォルトクエリセットに加えて、独自のクエリを定義し、SQLを使用して取得できるデータ(ビジネスメトリックなど)を収集できます。


したがって、postgres_exporterをセットアップすると、次の3つのアクションになります。



エクスポーターのインストール


エクスポーターはGoで記述されているため、すべてがつまらないものです。



 [Unit] Description=Prometheus exporter for Postgresql (https://github.com/wrouesnel/postgres_exporter) [Service] WorkingDirectory=/opt/postgres_exporter EnvironmentFile=/opt/postgres_exporter/env ExecStart=/opt/postgres_exporter/postgres_exporter_v0.4.1_linux-amd64/postgres_exporter --extend.query-path=/opt/postgres_exporter/metrics.yaml --web.listen-address=:9187 User=pg_exporter [Install] WantedBy=multi-user.target 


メトリックをカスタマイズする


デフォルトでは、postgres_exporterはリクエストに関するデータを収集できません。 しかし、PostgreSQLには非常に便利なpg_stat_statements拡張機能がpg_stat_statementsまさにそれを行います。 pg_stat_statementsの設定は、次の3つの簡単な手順になります。



なぜなら 最初にクエリの実行時間を収集することが重要でしたが、メトリックファイルは次のようになりました。


 pg_database: query: " SELECT pg_database.datname, pg_database_size(pg_database.datname) as size FROM pg_database" metrics: - datname: usage: "LABEL" description: "Name of the database" - size: usage: "GAUGE" description: "Disk space used by the database" pg_stat_statements: query: "SELECT queryid, datname, left(query, 100) as short_query, sum(calls) as calls, sum(total_time) as total_time, min(min_time) as min_time, max(max_time) as max_time, sum(mean_time*calls)/sum(calls) as mean_time FROM pg_stat_statements JOIN pg_database ON pg_stat_statements.dbid = pg_database.oid group by queryid, short_query, datname" metrics: - queryid: usage: "LABEL" description: "Query ID" - datname: usage: "LABEL" description: "Database name" - short_query: usage: "LABEL" description: "Query limited to 100 symbols" - calls: usage: "COUNTER" description: "Number of times executed" - total_time: usage: "COUNTER" description: "Total time spent in the statement, in milliseconds" - min_time: usage: "GAUGE" description: "Minimum time spent in the statement, in milliseconds" - max_time: usage: "GAUGE" description: "Maximum time spent in the statement, in milliseconds" - mean_time: usage: "GAUGE" description: "Mean time spent in the statement, in milliseconds" 

落とし穴が1つあります。pg_stat_statementsのレコードを集約する必要があるためです。 このテーブルには、クエリID、データベースID、およびクエリの同じ組み合わせを持つ複数のレコードが存在する場合があります。 そのような記録が存在すると、postgres_exporterが低下します。 これらのデータに基づいてメトリックの名前を形成し、それらは一意でなければなりません。


簡単にするために、読み取り/書き込みメトリックを追加しませんでした(shared_blks_writtenなど、類推により追加されます)。 また、繰り返しますが、このようなクエリはpg_stat_statementsだけでなく、任意のテーブルに対して行うことができます。


プロメテウスクエリの例


上記の構成では、エクスポーターはかなりの数のメトリックを生成します-リクエストのタイプごとに5個。 プロメテウスの側でそれらを集約します。


クエリの例(テンプレート用のグラファン変数をすぐに使用):



グラファンでは、次のようになります(jsonへのリンク ):





Source: https://habr.com/ru/post/J345370/


All Articles