PostgreSQLインスタンスに関するより深いインサイトを得るには、以下のオプションを設定できます:
TLSを有効にする
tlsフィールドはオプションですが、これを省略することはTLSを明示的に無効にすることと同じではありません:レシーバーのデフォルト設定ではすでにinsecure: falseとinsecure_skip_verify: trueが設定されているため、接続は暗号化されます(sslmode=require)が、insecure_skip_verify: falseを設定してca_fileを提供しない限り、サーバー証明書は検証されません。ほとんどのAmazon RDSおよびAuroraインスタンスはSSL/TLSを強制するため、通常はそれらの環境に対してその検証を追加することをお勧めします。
receivers: nrpostgresql: endpoint: <YOUR_HOST>:<YOUR_PORT> username: <YOUR_DB_USERNAME> password: <YOUR_DB_PASSWORD> collection_interval: 30s tls: insecure: false insecure_skip_verify: false ca_file: <PATH_TO_CA_CERTIFICATE> cert_file: <PATH_TO_CLIENT_CERTIFICATE> key_file: <PATH_TO_CLIENT_KEY>ヒント
cert_file/key_file は、PostgreSQLサーバーが相互TLS(クライアント証明書認証)を必要とする場合にのみ必要です;ほとんどのセットアップでは、サーバーを検証するために ca_file のみが必要です。Amazon RDS/Auroraの場合は、適切なRDS CA証明書バンドルをダウンロードし、ca_file で参照してください。insecure_skip_verify: true(デフォルト)は、自己署名証明書を使用するインスタンスに対するテストの場合にのみそのままにし、本番環境では決して使用しないでください。
書き込みステートメントのクエリプラン
デフォルトでは、EXPLAINは直接監視ユーザーとして実行され、PostgreSQLはプラン時にテーブル権限を確認します。つまり、監視ユーザーが書き込みアクセス権を持っていない限り、行ロックや書き込みステートメントはpermission deniedで失敗します。なお、監視ユーザーが書き込みアクセス権を持つことは決してあってはなりません。
監視ユーザーに書き込みアクセス権を付与せずに行ロックまたは書き込みステートメントのクエリ計画を収集するには、各データベースに次の関数を作成します:
CREATE OR REPLACE FUNCTION otel.explain_statement(l_query text)RETURNS jsonLANGUAGE plpgsqlSECURITY DEFINERAS $$DECLARE v_plan json; v_param_count int; v_nulls text := ''; i int;BEGIN SET TRANSACTION READ ONLY; SET plan_cache_mode = force_generic_plan;
EXECUTE 'PREPARE otel_explain_stmt AS ' || l_query;
SELECT COALESCE(array_length(parameter_types, 1), 0) INTO v_param_count FROM pg_prepared_statements WHERE name = 'otel_explain_stmt';
IF v_param_count > 0 THEN FOR i IN 1..v_param_count LOOP v_nulls := v_nulls || CASE WHEN i > 1 THEN ', ' ELSE '' END || 'null'; END LOOP; v_nulls := '(' || v_nulls || ')'; END IF;
EXECUTE 'EXPLAIN (FORMAT JSON) EXECUTE otel_explain_stmt' || v_nulls INTO v_plan; DEALLOCATE otel_explain_stmt; RETURN v_plan;EXCEPTION WHEN OTHERS THEN IF EXISTS (SELECT 1 FROM pg_prepared_statements WHERE name = 'otel_explain_stmt') THEN DEALLOCATE otel_explain_stmt; END IF; RAISE;END;$$;
GRANT EXECUTE ON FUNCTION otel.explain_statement(text) TO <YOUR_DB_USERNAME>;実行計画の収集メカニズム
- レート制限:
top_query_collection.max_explain_each_interval(デフォルトは1000)は、スクレイプごとのEXPLAIN呼び出し回数を制限します。 - キャッシング:
query_plan_cache_size/query_plan_cache_ttl(デフォルトは1000エントリ/1h)は、取得した計画をクエリIDをキーとしてキャッシュします。