Datadog DBM で AlloyDB を監視する

## はじめに
こんにちは、Datadog Japan で Sales Engineer をしている [**AoTo**](https://qiita.com/AoTo0330) です。

この投稿は **[<font color="#6495ED">AoTo Advent Calendar 2023</font>](https://qiita.com/advent-calendar/2023/aoto) 15日目**の記事です。

[**Datadog Database Monitoring**](https://docs.datadoghq.com/ja/database_monitoring/) では様々な RDBMS の監視をサポートしていますが、2022年5月22日に発表された Google Cloud の AlloyDB for PostgreSQL を現時点では正式にサポートしていません。

ですが、AlloyDB は [PostgreSQL の全ての機能をサポート](https://cloud.google.com/alloydb/docs/faq#features)しており、Datadog DBM でのクエリパフォーマンスの監視は**技術的には可能**です。今回は Datadog DBM の基本設定に始まり Datadog DBM で AlloyDB を監視する方法を解説するとともに、現時点での注意点に触れていきます。

:::note info
~~本内容は技術検証を目的としており、公式では一部の機能はサポートされていません。(2023/12/15 現在)
公式にサポートされる機能は、 [**Datadog DBM for PostgreSQL**](https://docs.datadoghq.com/ja/database_monitoring/setup_postgres/) をご参照ください。~~
↓
この実装方法は、2024年8月に公式にサポートが開始されました。
正式な設定方法は [**Setting Up Database Monitoring for Google AlloyDB managed Postgres**](https://docs.datadoghq.com/database_monitoring/setup_postgres/alloydb/?tab=host#install-the-alloydb-integration) をご参照ください。
:::

Google Cloud のリソースや AlloyDB のメトリクスデータを Datadog に収集したい場合は、[**Google Cloud Integration**](https://docs.datadoghq.com/ja/integrations/google_cloud_platform/#log-collection) をご活用ください。サポートされるメトリクスは [**AlloyDB integration**](https://docs.datadoghq.com/ja/integrations/google_cloud_alloydb/) をご参照ください。

ちなみに、インテグレーションのアーキテクチャについては「[3大クラウドのDatadog Integrations アーキテクチャ](https://qiita.com/AoTo0330/items/545a229fd33d92c01562)」で解説しています。

https://qiita.com/AoTo0330/items/545a229fd33d92c01562

## 概要
[**Datadog Database Monitoring**](https://docs.datadoghq.com/ja/database_monitoring/) は、RDBMS のクエリパフォーマンスをリアルタイムに監視するソリューションです。**DBM**　を利用することで、[**APM**](https://docs.datadoghq.com/ja/tracing/) で可視化できるアプリケーションからの DB クエリをはじめとする DB 操作の他に、<INS>データベースのインフラストラクチャ情報やデータベースから直接取得した**クエリ情報**</INS>によって RDBMS の正常性とパフォーマンスを可視化できるソリューションです。

[**AlloyDB**](https://cloud.google.com/alloydb/docs/overview) は Google Cloud 上で実行できるフルマネージドの **PostgreSQL 互換データベースサービス**です。AlloyDB は<INS>全ての PostgreSQL の機能をサポート</INS>していながら、<INS>標準の PostgreSQL と比較してトランザクションワークロードで**4倍以上**、分析クエリで**最大100倍**高速</INS>になり、**99.99% の可用性**を提供する、高機能・高性能・高可用性なソリューションです。

https://cloud.google.com/blog/ja/products/databases/alloydb-for-postgresql-intelligent-scalable-storage?hl=ja

Datadog DBM は PotgreSQL の**バージョン 9.6, 10, 11, 12, 13, 14** と**一部のバージョン 15** を利用するデータベースサービスの監視をサポートします。これに対し、AlloyDB は PosgtreSQL の**バージョン 14 とバージョン 15をプレビューで** をサポートしています。これはつまり、<INS>~~公式に名言はされていないが~~ Datadog DBM で AlloyDB が監視できる</INS>ことを意味します。

この時のアーキテクチャは「[クラウド管理型データベース](https://docs.datadoghq.com/ja/database_monitoring/architecture/)」のようになります。

![dbm_architecture_cloud-hosted.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/ef46b8d3-c120-10cc-b0c1-32234a3d5ef5.png)

Google Cloud 内のアーキテクチャは以下のようになります。

![AlloyDBM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/f8e19608-9fdd-f9fa-ddea-bfa27ec9bf5e.png)

## AlloyDB を作成して GCE から接続する
今回検証で利用する AlloyDB インスタンスは「[Google Cloudの新DBMS、AlloyDB for PostgreSQLを触ってみた Vol.1](https://www.topgate.co.jp/blog/techblog/29096)」を参考に作成し、負荷をかけています。

前提条件として、[Vertual Private Cloud(VPC)](https://cloud.google.com/vpc/docs/vpc?hl=ja) の作成は完了しているものとし、AlloyDB の作成から Datadog DBM の設定と検証手順をまとめます。

### ① AlloyDB API を有効化する
Google Cloud は全てのプロダクトに共通して、利用前にプロジェクトの単位でプロダクトの API を有効化する必要があります。

API の有効化は [API とサービス]ページから [+API とサービスの有効化]を選択し、[AlloyDB API]を検索して選択することで専用の API ページに遷移できます。[有効にする]を選択するとプロジェクト全体で AlloDB を利用できるようになります。

![AlloyDBAPI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/b1a0da3d-973f-d291-3cd6-92de848ce1af.jpeg)

### ② AlloyDB クラスタ・インスタンスを作成する
AlloyDB は複数のインスタンスをまとめるグループとして、クラスタから作成する必要があります。クラスタは作成時に**高可用性**、**高可用性(読み取りプールあり)**、**基本**、**基本(読み取りプールあり)** から選択できますが、後からも可用性や読み取りプールは柔軟に変更が可能です。

このクラスタ作成時に、**リージョン内で一意のクラスタ ID** と**フォルトの postgres データベースユーザーのパスワード**を設定します。さらに、AlloyDB は **VPC 内で作成されるデータベースサービス**のため、デプロイ先の VPC とネットワークの設定を行います。

さらに、AlloyDB クラスタには**最低1つのインスタンス**が必要となるため、**プライマリのインスタンス ID** とマシンの **CPU とメモリの組み合わせ**を設定します。これにより、<INS>AlloyDB は特定リージョンにクラスタを、特定 AZ にインスタンスをデプロイ</INS>して PostgreSQL 互換のデータベースサービスを利用開始できます。

### ③ AlloyDB に接続できる GCE を作成する
AlloyDB には Public IP が割り当てられず、**Private IP のみ**が VPC 内から割り当てられます。これに接続するためには、**同一の VPC 内**に仮想ホストである [**Google Compute Engine**](https://cloud.google.com/compute/docs/instances?hl=ja) などを準備する必要があります。

今回はこの 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)**](https://cloud.google.com/iap/docs/concepts-overview?hl=ja) による認証を使用して OS コンソールに SSH 接続できます。

こうして接続した GCE のコンソールから、PostgreSQL クライアントの`psql`を利用して AlloyDB へ接続できます。`psql`は PostgreSQL の[公式ドキュメント](https://www.postgresql.org/download/linux/debian/)からインストール方法を確認できます。今回は Debian へ `apt-get` を利用してインストールを行います。

**PostgreSQL クライアントのインストール**
```zsh
$ 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 に接続
```zsh
$ psql -h <ALLOYDB_PRIVATE_IP> -U postgres
Password for user postgres:
```

接続が完了すると、`postgres=>`というプロンプトが表示され、PostgreSQL(AlloyDB) に対する入力を行えるようになります。

:::note info
以降の解説では、AlloyDB への接続方法は省略します。
:::

### ⑤ Datadog Agent をインストールし、Datadog DBM を構成する
Datadog Agent は Datadog が公式で公開している sh ファイルを利用して、ワンライナーのコマンドでインストールを行えます。

**Datadog Agent のインストール**
```zsh
$ 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 ユーザーの作成**
```SQL
CREATE USER datadog WITH password '<PASSWORD>';
```

**監視情報への権限付与**
```SQL
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`関数を作成して、実行計画を記録します。

**実行計画の記録**
```SQL
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](https://docs.datadoghq.com/ja/integrations/postgres/?tab=host) の設定を行い、このファイル内で Datadog DBM に関連する情報の取得を有効化します。

Postgre integration 用の構成ファイルは Linux ディストリビューション OS の場合は、`etc/datadog-agent/conf.d/postgres.d`配下の`conf.yaml`となります。デフォルトで`conf.yaml.example`が用意されており、これをコピーして設定を行うことができます。

```yaml:postgres.d/conf.yaml
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 の再起動**
```zsh
$ sudo systemctl restart datadog-agent
```

<details><summary>DBM 有効化の確認</summary>
Datadog DBM が有効化されているか、データが取得されているかは`datadog-agent`コマンドで確認できます。

```zsh
$ 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
```


</details>


### ⑥ AlloyDB にデモデータを投入する
AlloyDB の監視ようにデモデータを投入し、負荷をかけます。この内容は「[Google Cloudの新DBMS、AlloyDB for PostgreSQLを触ってみた Vol.1](https://www.topgate.co.jp/blog/techblog/29096)」と同様に行います。

#### オプション① CSVデータを投入する
[イギリスの不動産データ](https://www.gov.uk/government/statistical-data-sets/price-paid-data-downloads)を CSV 形式で GCE に`wget`でダウンロードし、データベースとテーブルを作成し、AlloyDB にデータを投入します。

**`wget`でデータをダウンロード**
```zsh
$ wget http://prod.publicdata.landregistry.gov.uk.s3-website-eu-west-1.amazonaws.com/pp-monthly-update-new-version.csv
```

**データベースを作成**
```SQL
postgres=> CREATE DATABASE etude;
CREATE DATABASE
```

**テーブルを作成**
```SQL
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]
[^1]: 数 GB のデータ量のため、データの投入に数分かかります。
```SQL
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**](https://dev.mysql.com/doc/sakila/en/) の PostgreSQL 移植である、[**Pagila**](https://www.postgresql.org/ftp/projects/pgFoundry/dbsamples/pagila/) のデータを投入します。

Pagila は GitHub に公開されているため、`git clone`で GCE にデータを取得して`psql`で AlloyDB にデータを投入します。

**Pagila のサンプルデータベースを作成する**
```zsh
$ 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 ではクエリ例として、以下の内容が紹介されています。

```SQL
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 ページへ遷移します。

![DBM_Success.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/735fe944-381c-cded-f00f-15ed55b4a48d.jpeg)

### ⑦ AlloyDB に負荷をかけて Datadog DBM で確認する
ここからは、ベンチマークツールの`pgbench`で負荷をかけ、Datadog コンソール上で結果を確認します。

`pgbench`は PosgreSQL に同梱されているため、前述の手順を行っていればそのまま利用できます。`psql`による AlloyDB への接続と同様に、`pgbench`コマンドで AlloyDB に負荷をかけます。`-s`オプションによりかける負荷を決定できます。[^2]
[^2]: 行数を積算するため、過度に大きな値にしないよう注意しましょう。

```zsh
$ pgbench -i -s <SCALE_FACTOR> -U postgres -h <ALLOYDB_PRIVATE_IP> -d <DB_NAME>
```

負荷をかけることで、Datadog DBM の各ページに監視情報が表示され始めます。[**Databases ページ**](https://docs.datadoghq.com/database_monitoring/database_hosts/)には各データベースの概要とアクティビティを確認できます。

![DBM_Databases.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/d2ce3e80-0d04-e011-85c8-d4bd67acf015.jpeg)

:::note warn
AlloyDB は公式にサポートされていないため、CPU, メモリなどのインフラストラクチャーのメトリクスを関連付けて表示することができません。(2023/12/15 現在)
Google Cloud integration によって取得できる **AlloyDB のメトリクス**は Metrics Explorer から`gcp.alloydb.*`の形式で確認できます。
:::

現在公開ベータ版で提供されている **Metrics タブ**には、データベースの状態をあらわすメトリクスが自動的に表示されます。サポートされている Cloud SQL などのインフラストラクチャーのメトリクスもここに表示されます。

![DBM_MetricsTab.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/b43e99fd-3fd8-c8bc-0fcc-9882e4089897.jpeg)

[**Query Metrics ページ**](https://docs.datadoghq.com/ja/database_monitoring/query_metrics/)では、正規化されたクエリ毎のパフォーマンスが表示されます。このクエリは複数台のホストがあっても、同一のクエリ構文であれば同一のものとしてまとめられます。

![DBM_QueryMetrics.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/c843706c-17d1-4e5a-3ce9-b4016d882d83.jpeg)

[**Query Samples ページ**](https://docs.datadoghq.com/ja/database_monitoring/query_samples/)では、特定の時点で実行された単一のクエリの単位でのパフォーマンスやコンテキストを確認できます。これにより、クエリの実行待ちの原因やブロッククエリの特定などを行うことができます。

![DBM_QuerySamples.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/d5033170-1486-de51-4bcb-c53263530c11.jpeg)

## おわりに
Datadog DBM は RDBMS である **PostgreSQL の監視をサポート**しており、AlloyDB は**完全な PostgreSQL 互換**の高性能データベースサービスであるため、Datadog DBM で AlloyDB の監視が実現できます。

現時点では、インフラストラクチャーメトリクスとの関連付けての表示ができませんが、別途　[**AlloyDB integration**](https://docs.datadoghq.com/ja/integrations/google_cloud_alloydb/)　により、Datadog 上でメトリクスの監視は実現可能です。

AlloyDB を利用することで性能が出ているか、高性能な AlloyDB を効率的に使いこなせているかなどをリアルタイムに監視するためにも Datadog DBM を是非ご検討ください🐶