はじめに
こんにちは、Datadog Japan で Sales Engineer をしている AoTo です。
この投稿は AoTo Advent Calendar 2023 15日目の記事です。
Datadog Database Monitoring では様々な RDBMS の監視をサポートしていますが、2022年5月22日に発表された Google Cloud の AlloyDB for PostgreSQL を現時点では正式にサポートしていません。
ですが、AlloyDB は PostgreSQL の全ての機能をサポートしており、Datadog DBM でのクエリパフォーマンスの監視は技術的には可能です。今回は Datadog DBM の基本設定に始まり Datadog DBM で AlloyDB を監視する方法を解説するとともに、現時点での注意点に触れていきます。
本内容は技術検証を目的としており、公式では一部の機能はサポートされていません。(2023/12/15 現在)
公式にサポートされる機能は、 Datadog DBM for PostgreSQL をご参照ください。
↓
この実装方法は、2024年8月に公式にサポートが開始されました。
正式な設定方法は Setting Up Database Monitoring for Google AlloyDB managed Postgres をご参照ください。
Google Cloud のリソースや AlloyDB のメトリクスデータを Datadog に収集したい場合は、Google Cloud Integration をご活用ください。サポートされるメトリクスは AlloyDB integration をご参照ください。
ちなみに、インテグレーションのアーキテクチャについては「3大クラウドのDatadog Integrations アーキテクチャ」で解説しています。
概要
Datadog Database Monitoring は、RDBMS のクエリパフォーマンスをリアルタイムに監視するソリューションです。DBM を利用することで、APM で可視化できるアプリケーションからの DB クエリをはじめとする DB 操作の他に、データベースのインフラストラクチャ情報やデータベースから直接取得したクエリ情報によって RDBMS の正常性とパフォーマンスを可視化できるソリューションです。
AlloyDB は Google Cloud 上で実行できるフルマネージドの PostgreSQL 互換データベースサービスです。AlloyDB は全ての PostgreSQL の機能をサポートしていながら、標準の PostgreSQL と比較してトランザクションワークロードで4倍以上、分析クエリで最大100倍高速になり、99.99% の可用性を提供する、高機能・高性能・高可用性なソリューションです。
Datadog DBM は PotgreSQL のバージョン 9.6, 10, 11, 12, 13, 14 と一部のバージョン 15 を利用するデータベースサービスの監視をサポートします。これに対し、AlloyDB は PosgtreSQL のバージョン 14 とバージョン 15をプレビューで をサポートしています。これはつまり、公式に名言はされていないが Datadog DBM で AlloyDB が監視できることを意味します。
この時のアーキテクチャは「クラウド管理型データベース」のようになります。
Google Cloud 内のアーキテクチャは以下のようになります。
AlloyDB を作成して GCE から接続する
今回検証で利用する AlloyDB インスタンスは「Google Cloudの新DBMS、AlloyDB for PostgreSQLを触ってみた Vol.1」を参考に作成し、負荷をかけています。
前提条件として、Vertual Private Cloud(VPC) の作成は完了しているものとし、AlloyDB の作成から Datadog DBM の設定と検証手順をまとめます。
① AlloyDB API を有効化する
Google Cloud は全てのプロダクトに共通して、利用前にプロジェクトの単位でプロダクトの API を有効化する必要があります。
API の有効化は [API とサービス]ページから [+API とサービスの有効化]を選択し、[AlloyDB API]を検索して選択することで専用の API ページに遷移できます。[有効にする]を選択するとプロジェクト全体で AlloDB を利用できるようになります。
② AlloyDB クラスタ・インスタンスを作成する
AlloyDB は複数のインスタンスをまとめるグループとして、クラスタから作成する必要があります。クラスタは作成時に高可用性、高可用性(読み取りプールあり)、基本、基本(読み取りプールあり) から選択できますが、後からも可用性や読み取りプールは柔軟に変更が可能です。
このクラスタ作成時に、リージョン内で一意のクラスタ ID とフォルトの postgres データベースユーザーのパスワードを設定します。さらに、AlloyDB は VPC 内で作成されるデータベースサービスのため、デプロイ先の VPC とネットワークの設定を行います。
さらに、AlloyDB クラスタには最低1つのインスタンスが必要となるため、プライマリのインスタンス ID とマシンの CPU とメモリの組み合わせを設定します。これにより、AlloyDB は特定リージョンにクラスタを、特定 AZ にインスタンスをデプロイして PostgreSQL 互換のデータベースサービスを利用開始できます。
③ AlloyDB に接続できる GCE を作成する
AlloyDB には Public IP が割り当てられず、Private IP のみが VPC 内から割り当てられます。これに接続するためには、同一の VPC 内に仮想ホストである Google Compute Engine などを準備する必要があります。
今回はこの GCE インスタンスから psql
コマンドを実行したり、Datadog Agent をインストールして Datadog DBM を構成したりします。
今回は AlloyDB のプライマリインスタンスと同一の VPC・リージョン・AZ に GCE インスタンスを作成します。OS はデフォルトのままだと Debian が選択されます。
この時、ファイアウォールルールに PostgreSQL 接続用のアウトバウンド(外向き) tcp/5432
と SSH 接続用のインバウンドのtcp/22
を許可する設定を追加します。これにより、Google Cloud Console から GCE に接続して、AlloyDB にpsql
で接続できます。
④ GCE から AlloyDB に接続する
インバウンドのtcp/22
による通信が許可されている GCE インスタンスは、Google Cloud Console 上の GCE ページから [SSH] を選択するだけで、ブラウザ上で自動的に SSH 認証鍵を VM に転送し、Identity-Aware Proxy(IAP) による認証を使用して OS コンソールに SSH 接続できます。
こうして接続した GCE のコンソールから、PostgreSQL クライアントのpsql
を利用して AlloyDB へ接続できます。psql
は PostgreSQL の公式ドキュメントからインストール方法を確認できます。今回は Debian へ apt-get
を利用してインストールを行います。
PostgreSQL クライアントのインストール
$ sudo sh -c 'echo "deb https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
$ wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
$ sudo apt-get update
$ sudo apt-get -y install postgresql
インストールが完了すると、psql
コマンドが利用可能になります。AlloyDB 作成時に指定したデフォルトの postgres ユーザーとパスワードを指定して、AlloyDB インスタンスの Private IP へ接続を行います。
AlloyDB に接続
$ psql -h <ALLOYDB_PRIVATE_IP> -U postgres
Password for user postgres:
接続が完了すると、postgres=>
というプロンプトが表示され、PostgreSQL(AlloyDB) に対する入力を行えるようになります。
以降の解説では、AlloyDB への接続方法は省略します。
⑤ Datadog Agent をインストールし、Datadog DBM を構成する
Datadog Agent は Datadog が公式で公開している sh ファイルを利用して、ワンライナーのコマンドでインストールを行えます。
Datadog Agent のインストール
$ DD_API_KEY=<YOUR_API_KEY> DD_SITE=<DATADOG_SITE_URL> bash -c "$(curl -L https://s3.amazonaws.com/dd-agent/scripts/install_script_agent7.sh)"
AlloyDB 上の操作
Datadog DBM で情報を取得するために、初めに専用の datadog データベースユーザーを作成ます。これにpublic
スキーマへの使用権限とpg_monitor
権限を付与し、pg_stat_statements
モジュールを作成することで PostgreSQL の監視情報を datadog ユーザーを介して取得することができます。
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;
さらに、実行計画を収集するためにdatadog.explain_statement
関数を作成して、実行計画を記録します。
実行計画の記録
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;
ここまでで、Datadog DBM を構成するために AlloyDB 上で行う準備は完了となります。
Datadog Agent の設定
ここからは Datadog Agent の構成ファイルから PostgreSQL integration の設定を行い、このファイル内で Datadog DBM に関連する情報の取得を有効化します。
Postgre integration 用の構成ファイルは Linux ディストリビューション OS の場合は、etc/datadog-agent/conf.d/postgres.d
配下のconf.yaml
となります。デフォルトでconf.yaml.example
が用意されており、これをコピーして設定を行うことができます。
init_config:
instances:
- dbm: true
host: '<INSTANCE_ADDRESS>'
port: 5432
username: datadog
password: '<PASSWORD>'
database_autodiscovery:
enabled: true
tags:
- '<KEY1>:<VALUE1>'
- '<KEY2>:<VALUE2>'
# この構成は現在サポートされていませんが、Cloud SQL の設定に倣い AlloyDB への正式サポート後を想定して指定します。現在は特に何の意味も為しません。(2023年12月)
# この構成は正式にサポートされ、この構成がそのまま利用できます。(2024年8月)
gcp:
project_id: '<PROJECT_ID>'
instance_id: '<INSTANCE_ID>'
上記のように、構成ファイルの作成・編集が完了したら、Datadog Agent を再起動し設定を反映します。
Datadog Agent の再起動
$ sudo systemctl restart datadog-agent
DBM 有効化の確認
Datadog DBM が有効化されているか、データが取得されているかは`datadog-agent`コマンドで確認できます。$ sudo datadog-agent status
各インテグレーションステータスの内、DBM の対象となる Postgres のステータスを確認します。
-
Instance ID:
の行に [OK] が表示されていれば、integration は完了しています -
Database Monitoring Query Metrics:
とDatabase Monitoring Query Samples:
の値が0以上であれば情報が収集されています
postgres (15.1.1)
-----------------
Instance ID: postgres:<INSTANCE_ID> [OK]
Configuration Source: file:/etc/datadog-agent/conf.d/postgres.d/conf.yaml
Total Runs: <TEST_RUNS_VALUE>
Metric Samples: Last Run: <LAST_RUN_VALUE>, Total: <TOTAL_RUN_VALUE>
Events: Last Run: 0, Total: 0
Database Monitoring Activity Samples: Last Run: <LAST_RUN_VALUE>, Total: <TOTAL_RUN_VALUE>
Database Monitoring Metadata Samples: Last Run: <LAST_RUN_VALUE>, Total: <TOTAL_RUN_VALUE>
Database Monitoring Query Metrics: Last Run: <LAST_RUN_VALUE>, Total: <TOTAL_RUN_VALUE>
Database Monitoring Query Samples: Last Run: <LAST_RUN_VALUE>, Total: <TOTAL_RUN_VALUE>
Service Checks: Last Run: <LAST_RUN_VALUE>, Total: <TOTAL_RUN_VALUE>
Average Execution Time : <AVG_EXECUTION_TIME>
Last Execution Date : YYYY-MM-DD hh:mm:ss UTC (<UNIX_TIMESTAMP>)
Last Successful Execution Date : YYYY-MM-DD hh:mm:ss UTC (<UNIX_TIMESTAMP>)
metadata:
resolved_hostname: <ALLOYDB_PRIVATE_IP>
version.major: 14
version.minor: 9
version.patch: 0
version.raw: 14.9
version.scheme: semver
⑥ AlloyDB にデモデータを投入する
AlloyDB の監視ようにデモデータを投入し、負荷をかけます。この内容は「Google Cloudの新DBMS、AlloyDB for PostgreSQLを触ってみた Vol.1」と同様に行います。
オプション① CSVデータを投入する
イギリスの不動産データを CSV 形式で GCE にwget
でダウンロードし、データベースとテーブルを作成し、AlloyDB にデータを投入します。
wget
でデータをダウンロード
$ wget http://prod.publicdata.landregistry.gov.uk.s3-website-eu-west-1.amazonaws.com/pp-monthly-update-new-version.csv
データベースを作成
postgres=> CREATE DATABASE etude;
CREATE DATABASE
テーブルを作成
postgres=> \c etude
etude=> CREATE TABLE land_registry_price_paid_uk(
transaction uuid,
price numeric,
transfer_date date,
postcode text,
property_type char(1),
newly_built boolean,
duration char(1),
paon text,
saon text,
street text,
locality text,
city text,
district text,
county text,
ppd_category_type char(1),
record_status char(1));
CREATE TABLE
CSV からデータを投入1
etude=> \copy land_registry_price_paid_uk FROM './pp-complete.csv' with (format csv, encoding 'win1252', header false, null '', quote '"', force_null (postcode, saon, paon, street, locality, city, district));
COPY 27910954
オプション② Pagila データを投入する
MySQL のサンプルデータベース Sakila の PostgreSQL 移植である、Pagila のデータを投入します。
Pagila は GitHub に公開されているため、git clone
で GCE にデータを取得してpsql
で AlloyDB にデータを投入します。
Pagila のサンプルデータベースを作成する
$ git clone https://github.com/devrimgunduz/pagila.git
$ cd pagila
$ psql -h <internal_ip> -U postgres < pagila-schema.sql
$ psql -h <internal_ip> -U postgres < pagila-data.sql
GitHub の README ではクエリ例として、以下の内容が紹介されています。
SELECT
CONCAT(customer.last_name, ', ', customer.first_name) AS customer,
address.phone,
film.title
FROM
rental
INNER JOIN customer ON rental.customer_id = customer.customer_id
INNER JOIN address ON customer.address_id = address.address_id
INNER JOIN inventory ON rental.inventory_id = inventory.inventory_id
INNER JOIN film ON inventory.film_id = film.film_id
WHERE
rental.return_date IS NULL
AND rental_date < CURRENT_DATE
ORDER BY
title
LIMIT 5;
この時点で、Datadog DBM でデータの取得が行われ、Datadog コンソールから DBM の情報が確認できるようになり始めます。You have successfully set up Database Monitoring. Click here to see your databases hosts.
と表示されていれば、here
から DBM の Databases ページへ遷移します。
⑦ AlloyDB に負荷をかけて Datadog DBM で確認する
ここからは、ベンチマークツールのpgbench
で負荷をかけ、Datadog コンソール上で結果を確認します。
pgbench
は PosgreSQL に同梱されているため、前述の手順を行っていればそのまま利用できます。psql
による AlloyDB への接続と同様に、pgbench
コマンドで AlloyDB に負荷をかけます。-s
オプションによりかける負荷を決定できます。2
$ pgbench -i -s <SCALE_FACTOR> -U postgres -h <ALLOYDB_PRIVATE_IP> -d <DB_NAME>
負荷をかけることで、Datadog DBM の各ページに監視情報が表示され始めます。Databases ページには各データベースの概要とアクティビティを確認できます。
AlloyDB は公式にサポートされていないため、CPU, メモリなどのインフラストラクチャーのメトリクスを関連付けて表示することができません。(2023/12/15 現在)
Google Cloud integration によって取得できる AlloyDB のメトリクスは Metrics Explorer からgcp.alloydb.*
の形式で確認できます。
現在公開ベータ版で提供されている Metrics タブには、データベースの状態をあらわすメトリクスが自動的に表示されます。サポートされている Cloud SQL などのインフラストラクチャーのメトリクスもここに表示されます。
Query Metrics ページでは、正規化されたクエリ毎のパフォーマンスが表示されます。このクエリは複数台のホストがあっても、同一のクエリ構文であれば同一のものとしてまとめられます。
Query Samples ページでは、特定の時点で実行された単一のクエリの単位でのパフォーマンスやコンテキストを確認できます。これにより、クエリの実行待ちの原因やブロッククエリの特定などを行うことができます。
おわりに
Datadog DBM は RDBMS である PostgreSQL の監視をサポートしており、AlloyDB は完全な PostgreSQL 互換の高性能データベースサービスであるため、Datadog DBM で AlloyDB の監視が実現できます。
現時点では、インフラストラクチャーメトリクスとの関連付けての表示ができませんが、別途 AlloyDB integration により、Datadog 上でメトリクスの監視は実現可能です。
AlloyDB を利用することで性能が出ているか、高性能な AlloyDB を効率的に使いこなせているかなどをリアルタイムに監視するためにも Datadog DBM を是非ご検討ください🐶