- 重要な情報
- はじめに
- 用語集
- エージェント
- インテグレーション
- OpenTelemetry
- 開発者
- API
- CoScreen
- アプリ内
- インフラストラクチャー
- アプリケーションパフォーマンス
- 継続的インテグレーション
- ログ管理
- セキュリティ
- UX モニタリング
- 管理
データベースモニタリングは、クエリメトリクス、クエリサンプル、実行計画、データベースの状態、フェイルオーバー、イベントを公開することで、Postgres データベースを詳細に可視化します。
Agent は、読み取り専用のユーザーとしてログインすることでデータベースから直接テレメトリーを収集します。Postgres データベースでデータベースモニタリングを有効にするには、以下の設定を行ってください。
127.0.0.1
またはソケットを使用することをお勧めします。Agent をプロキシ、ロードバランサー、また pgbouncer
などのコネクションプーラーを経由してデータベースに接続しないようご注意ください。クライアントアプリケーションのアンチパターンとなる可能性があります。また、各 Agent は基礎となるホスト名を把握し、フェイルオーバーの場合でも常に 1 つのホストのみを使用する必要があります。Datadog Agent が実行中に異なるホストに接続すると、メトリクス値の正確性が失われます。DB パラメーターグループに以下のパラメーターを構成し、サーバーを再起動すると設定が有効になります。これらのパラメーターの詳細については、Postgres ドキュメントを参照してください。
パラメーター | 値 | 説明 |
---|---|---|
shared_preload_libraries | pg_stat_statements | postgresql.queries.* メトリクスに対して必要です。pg_stat_statements 拡張機能を使用して、クエリメトリクスの収集を可能にします。 |
track_activity_query_size | 4096 | より大きなクエリを収集するために必要です。pg_stat_activity および pg_stat_statements の SQL テキストのサイズを拡大します。 デフォルト値のままだと、1024 文字よりも長いクエリは収集されません。 |
pg_stat_statements.track | ALL | オプションです。ストアドプロシージャや関数内のステートメントを追跡することができます。 |
pg_stat_statements.max | 10000 | オプションです。pg_stat_statements で追跡する正規化されたクエリの数を増やします。この設定は、多くの異なるクライアントからさまざまな種類のクエリが送信される大容量のデータベースに推奨されます。 |
track_io_timing | 1 | オプション。クエリのブロックの読み取りおよび書き込み時間の収集を有効にします。 |
Datadog Agent が統計やクエリを収集するためには、データベース サーバーへの読み取り専用のアクセスが必要となります。
Agent が接続するデータベースサーバー上の PostgreSQL データベースを選択します。Agent は、どのデータベースに接続してもデータベースサーバー上のすべてのデータベースからテレメトリーを収集することができるため、デフォルトの postgres
データベースを使用することをお勧めします。[そのデータベースに対して、固有のデータに対するカスタムクエリ]を Agentで実行する必要がある場合のみ別のデータベースを選択してください6。
選択したデータベースに、スーパーユーザー (または十分な権限を持つ他のユーザー) として接続します。例えば、選択したデータベースが postgres
である場合は、次のように実行して psql を使用する postgres
ユーザーとして接続します。
psql -h mydb.example.com -d postgres -U postgres
datadog
ユーザーを作成します。
CREATE USER datadog WITH password '<PASSWORD>';
すべてのデータベースに以下のスキーマを作成します。
CREATE SCHEMA datadog;
GRANT USAGE ON SCHEMA datadog TO datadog;
GRANT USAGE ON SCHEMA public TO datadog;
GRANT pg_monitor TO datadog;
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
すべてのデータベースに以下のスキーマを作成します。
CREATE SCHEMA datadog;
GRANT USAGE ON SCHEMA datadog TO datadog;
GRANT USAGE ON SCHEMA public TO datadog;
GRANT SELECT ON pg_stat_database TO datadog;
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
すべてのデータベースに関数を作成して、Agent が pg_stat_activity
および pg_stat_statements
の全コンテンツを読み込めるようにします。
CREATE OR REPLACE FUNCTION datadog.pg_stat_activity() RETURNS SETOF pg_stat_activity AS
$$ SELECT * FROM pg_catalog.pg_stat_activity; $$
LANGUAGE sql
SECURITY DEFINER;
CREATE OR REPLACE FUNCTION datadog.pg_stat_statements() RETURNS SETOF pg_stat_statements AS
$$ SELECT * FROM pg_stat_statements; $$
LANGUAGE sql
SECURITY DEFINER;
注意: 追加のテーブルへの問い合わせを必要とするカスタムメトリクスを生成する場合は、それらのテーブルに対する SELECT
権限を datadog
ユーザーに付与する必要があります。例: grant SELECT on <TABLE_NAME> to datadog;
。詳細は PostgreSQL カスタムメトリクス収集の説明を参照してください。
Agent が実行計画を収集できるように、すべてのデータベースに関数を作成します。
CREATE OR REPLACE FUNCTION datadog.explain_statement(
l_query TEXT,
OUT explain JSON
)
RETURNS SETOF JSON AS
$$
DECLARE
curs REFCURSOR;
plan JSON;
BEGIN
OPEN curs FOR EXECUTE pg_catalog.concat('EXPLAIN (FORMAT JSON) ', l_query);
FETCH curs INTO plan;
CLOSE curs;
RETURN QUERY SELECT plan;
END;
$$
LANGUAGE 'plpgsql'
RETURNS NULL ON NULL INPUT
SECURITY DEFINER;
権限が正しいことを確認するために、以下のコマンドを実行して、Agent ユーザーがデータベースに接続してコアテーブルを読み取ることができることを確認します。
。
psql -h localhost -U datadog postgres -A \
-c "select * from pg_stat_database limit 1;" \
&& echo -e "\e[0;32mPostgres connection - OK\e[0m" \
|| echo -e "\e[0;31mCannot connect to Postgres\e[0m"
psql -h localhost -U datadog postgres -A \
-c "select * from pg_stat_activity limit 1;" \
&& echo -e "\e[0;32mPostgres pg_stat_activity read OK\e[0m" \
|| echo -e "\e[0;31mCannot read from pg_stat_activity\e[0m"
psql -h localhost -U datadog postgres -A \
-c "select * from pg_stat_statements limit 1;" \
&& echo -e "\e[0;32mPostgres pg_stat_statements read OK\e[0m" \
|| echo -e "\e[0;31mCannot read from pg_stat_statements\e[0m"
psql -h localhost -U datadog postgres -A \
-c "select * from pg_stat_database limit 1;" \
&& echo -e "\e[0;32mPostgres connection - OK\e[0m" \
|| echo -e "\e[0;31mCannot connect to Postgres\e[0m"
psql -h localhost -U datadog postgres -A \
-c "select * from pg_stat_activity limit 1;" \
&& echo -e "\e[0;32mPostgres pg_stat_activity read OK\e[0m" \
|| echo -e "\e[0;31mCannot read from pg_stat_activity\e[0m"
psql -h localhost -U datadog postgres -A \
-c "select * from pg_stat_statements limit 1;" \
&& echo -e "\e[0;32mPostgres pg_stat_statements read OK\e[0m" \
|| echo -e "\e[0;31mCannot read from pg_stat_statements\e[0m"
パスワードの入力を求められた場合は、datadog
ユーザーを作成したときに入力したパスワードを使用してください。
RDS ホストを監視するには、インフラストラクチャーに Datadog Agent をインストールし、各インスタンスのエンドポイントにリモートで接続するよう構成します。Agent はデータベース上で動作する必要はなく、データベースに接続するだけで問題ありません。ここに記載されていないその他の Agent のインストール方法については、Agent のインストール手順を参照してください。
ホスト上で実行されている Agent のデータベースモニタリングメトリクスの収集を構成するには、次の手順に従ってください。(Agent で RDS データベースからメトリクスを収集するために小規模な EC2 インスタンスをプロビジョニングする場合など)
postgres.d/conf.yaml
ファイルを編集して、host
/ port
を指定し、監視するマスターを設定します。使用可能なすべてのコンフィギュレーションオプションについては、サンプル postgres.d/conf.yaml を参照してください。init_config:
instances:
- dbm: true
host: '<AWS_INSTANCE_ENDPOINT>'
port: 5432
username: datadog
password: '<PASSWORD>'
tags:
- "dbinstanceidentifier:<DB_INSTANCE_NAME>"
## Required for Postgres 9.6: Uncomment these lines to use the functions created in the setup
# pg_stat_statements_view: datadog.pg_stat_statements()
# pg_stat_activity_view: datadog.pg_stat_activity()
## Optional: Connect to a different database if needed for `custom_queries`
# dbname: '<DB_NAME>'
ECS や Fargate などの Docker コンテナで動作するデータベースモニタリング Agent を設定するには、Agent コンテナの Docker ラベルとしてオートディスカバリーのインテグレーションテンプレートを設定します。
注: ラベルのオートディスカバリーを機能させるためには、Agent にDocker ソケットに対する読み取り権限が与えられている必要があります。
次のコマンドを実行して、コマンドラインから Agent を実行することですぐに稼動させることができます。お使いのアカウントや環境に合わせて値を変更してください。
export DD_API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
export DD_AGENT_VERSION=7.36.1
docker run -e "DD_API_KEY=${DD_API_KEY}" \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
-l com.datadoghq.ad.check_names='["postgres"]' \
-l com.datadoghq.ad.init_configs='[{}]' \
-l com.datadoghq.ad.instances='[{
"dbm": true,
"host": "<AWS_INSTANCE_ENDPOINT>",
"port": 5432,
"username": "datadog",
"password": "<UNIQUEPASSWORD>",
"tags": "dbinstanceidentifier:<DB_INSTANCE_NAME>"
}]' \
gcr.io/datadoghq/agent:${DD_AGENT_VERSION}
Postgres 9.6 の場合、ホストとポートが指定されているインスタンスの config に以下の設定を追加します。
pg_stat_statements_view: datadog.pg_stat_statements()
pg_stat_activity_view: datadog.pg_stat_activity()
Dockerfile
ではラベルの指定も可能であるため、インフラストラクチャーのコンフィギュレーションを変更することなく、カスタム Agent を構築・デプロイすることができます。
FROM gcr.io/datadoghq/agent:7.36.1
LABEL "com.datadoghq.ad.check_names"='["postgres"]'
LABEL "com.datadoghq.ad.init_configs"='[{}]'
LABEL "com.datadoghq.ad.instances"='[{"dbm": true, "host": "<AWS_INSTANCE_ENDPOINT>", "port": 5432,"username": "datadog","password": "<UNIQUEPASSWORD>","tags": "dbinstanceidentifier:<DB_INSTANCE_NAME>"}]'
Postgres 9.6 の場合、ホストとポートが指定されているインスタンスの config に以下の設定を追加します。
pg_stat_statements_view: datadog.pg_stat_statements()
pg_stat_activity_view: datadog.pg_stat_activity()
datadog
ユーザーのパスワードをプレーンテキストで公開しないようにするには、Agent のシークレット管理パッケージを使用し、ENC[]
構文を使ってパスワードを宣言するか、オートディスカバリーテンプレート変数に関するドキュメントでパスワードを環境変数として渡す方法をご確認ください。
Kubernetes クラスターをお使いの場合は、データベースモニタリング用の Datadog Cluster Agent をご利用ください。
Kubernetes クラスターでまだチェックが有効になっていない場合は、手順に従ってクラスターチェックを有効にしてください。Postgres のコンフィギュレーションは、Cluster Agent コンテナにマウントされた静的ファイル、またはサービスアノテーションのいずれかを使用して宣言できます。
以下の Helm コマンドを実行して、Kubernetes クラスターに Datadog Cluster Agent をインストールします。お使いのアカウントや環境に合わせて値を変更してください。
helm repo add datadog https://helm.datadoghq.com
helm repo update
helm install <RELEASE_NAME> \
--set 'datadog.apiKey=<DATADOG_API_KEY>' \
--set 'clusterAgent.enabled=true' \
--set 'clusterChecksRunner.enabled=true' \
--set "clusterAgent.confd.postgres\.yaml=cluster_check: true
init_config:
instances:
- dbm: true
host: <INSTANCE_ADDRESS>
port: 5432
username: datadog
password: <UNIQUEPASSWORD>
tags:
- dbinstanceidentifier:<DB_INSTANCE_NAME>" \
datadog/datadog
Postgres 9.6 の場合、ホストとポートが指定されているインスタンスの config に以下の設定を追加します。
pg_stat_statements_view: datadog.pg_stat_statements()
pg_stat_activity_view: datadog.pg_stat_activity()
マウントされたコンフィギュレーションファイルを使ってクラスターチェックを構成するには、コンフィギュレーションファイルを Cluster Agent コンテナのパス /conf.d/postgres.yaml
にマウントします。
cluster_check: true # Make sure to include this flag
init_config:
instances:
- dbm: true
host: '<AWS_INSTANCE_ENDPOINT>'
port: 5432
username: datadog
password: '<PASSWORD>'
tags:
- dbinstanceidentifier:<DB_INSTANCE_NAME>
## 必須: Postgres 9.6 の場合、セットアップで作成した関数を使用するために、以下の行のコメントを解除してください
# pg_stat_statements_view: datadog.pg_stat_statements()
# pg_stat_activity_view: datadog.pg_stat_activity()
ファイルをマウントせずに、インスタンスのコンフィギュレーションを Kubernetes サービスとして宣言することができます。Kubernetes 上で動作する Agent にこのチェックを設定するには、Datadog Cluster Agent と同じネームスペースにサービスを作成します。
apiVersion: v1
kind: Service
metadata:
name: postgres
labels:
tags.datadoghq.com/env: '<ENV>'
tags.datadoghq.com/service: '<SERVICE>'
annotations:
ad.datadoghq.com/service.check_names: '["postgres"]'
ad.datadoghq.com/service.init_configs: '[{}]'
ad.datadoghq.com/service.instances: |
[
{
"dbm": true,
"host": "<AWS_INSTANCE_ENDPOINT>",
"port": 5432,
"username": "datadog",
"password": "<UNIQUEPASSWORD>",
"tags": "dbinstanceidentifier:<DB_INSTANCE_NAME>"
}
]
spec:
ports:
- port: 5432
protocol: TCP
targetPort: 5432
name: postgres
Postgres 9.6 の場合、ホストとポートが指定されているインスタンスの config に以下の設定を追加します。
pg_stat_statements_view: datadog.pg_stat_statements()
pg_stat_activity_view: datadog.pg_stat_activity()
Cluster Agent は自動的にこのコンフィギュレーションを登録し、Postgres チェックを開始します。
datadog
ユーザーのパスワードをプレーンテキストで公開しないよう、Agent のシークレット管理パッケージを使用し、ENC[]
構文を使ってパスワードを宣言します。
Agent の status サブコマンドを実行し、Checks セクションで postgres
を探します。または、データベースのページを参照してください。
AWS からより包括的なデータベースメトリクスを収集するには、RDS インテグレーションをインストールします (オプション)。
インテグレーションと Agent を手順通りにインストール・設定しても期待通りに動作しない場合は、トラブルシューティングを参照してください。
お役に立つドキュメント、リンクや記事: