【Datadog x Snowflake】DatadogでSnowflakeを監視する時の事始

# 結論

- DatadogとSnowflakeを紐づける(中継する)サーバを用意しないといけない。
- Datadog Agentを用意したサーバにインストールする。
- Datadog Agentの初期設定だけで、ひとまずデフォルトのメトリクスやダッシュボードが見れるようになる。
- 本命はカスタムクエリ。カスタムクエリの書き方次第で任意のメトリクスを作成したり、如何様にでも監視項目をカスタマイズできる可能性を持つ。


# 流れ

## 前提

前提として、DatadogアカウントとSnowflakeアカウントは取得済みであるとする。

また、Datadog Agentをインストールするサーバは自端末とする。ここでは事始として、DatadogとSnowflakeの監視連携をサクッと行うことを目指す。

なお、ここでの自端末はmacを前提とした記載とする点はご了承いただきたい。

## 初期設定〜何か見えるようになるまで

1. Datadogのページにて、SnowflakeのIntegrationをインストールする

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475867/5bc8aad0-f062-25ed-3515-bc079774d185.png)

    検索窓から「snowflake」で検索し、GUI操作で簡単にインストールできる。
    インストール後、Snowflake IntegrationのConfigure画面を確認し、記載に従う。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475867/c57a9e13-06fb-f435-c140-7753e18bb767.png)

    この記載は場合分けで色々書いてあってややこしいので、端的にやるための手順を次に抜粋する。

1. 自端末にDatadog Agentをインストール

    ```bash
    datadog-agent integration install datadog-snowflake==2.0.1
    ```

    `2.0.1`は執筆時点でのバージョン指定のため、Configure画面の記載に合わせること。

    インストールが完了すると、macの画面右上に「犬の骨」のアイコンが見えるようになる。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475867/03661670-b032-3914-6424-2240667dcba5.png)

    Datadog Agentの管理画面が開けるようになる。
    「犬の骨」をクリックし、表示されたメニューから Open Web UI をクリックする。
    以下のような画面が出てくればOK。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475867/97001456-ad74-c579-08d1-0d0277d4e8c0.png)


1. Snowflakeアカウントで、Datadog用のロールを作成する

    一旦Datadog Agent(Web UI)は置いておく。
    DatadogのConfigure画面に記載されている以下の記述部分をコピーしておく。

    ```sql
    -- Create a new role intended to monitor Snowflake usage.
    create role DATADOG;
    
    -- Grant privileges on the SNOWFLAKE database to the new role.
    grant imported privileges on database SNOWFLAKE to role DATADOG;
    
    -- Create a user, skip this step if you are using an existing user.
    create user DATADOG_USER
    LOGIN_NAME = DATADOG_USER
    password = '<PASSWORD>'
    default_warehouse = <WAREHOUSE>
    default_role = DATADOG
    default_namespace = SNOWFLAKE.ACCOUNT_USAGE;
    
    -- Grant the monitor role to the user.
    grant role DATADOG to user <USER>;
    ```

    次に、Snowflakeのアカウントにログインして、Snowflakeのワークシート(SQL)上に貼り付けて実行する。

    上記の`<WAREHOUSE>`は、ここでDatadog用に新規作成しておくことをお勧めする。

    `<USER>`は、今操作しているユーザ(自分自身)でもいいが、せっかく作成した`DATADOG_USER` でいいと思う。
    
    サクッとやるとはいえ、Datadog Agentのサーバは後で差し替えることはあっても、Snowflake上の設定はそのまま使用するケースが多いと思われるため、あらかじめDatadog専用ロールを作っておくことをお勧めする。

1. 自端末で、`snowflake.d/conf.yaml` を編集する

    これは、先ほど確認したDatadog Agent(Web UI)でできるので、早速Web UIを活用する。

    Checks -> Manage Checks をクリックする。
    すると、「Select a check to configure.」と書かれた画面にたどり着く。
    画面左側にconfigファイルの一覧が表示されており、その中に「`snowflake.d/conf.yaml`」があるはずなので、それをクリックする。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475867/0d1f476c-c491-969a-108a-40eee405d6f8.png)

    Configure画面の記載の通り最低限以下の部分を編集する。

    ``` yaml
    ## @param account - string - required
    ## Name of your account (provided by Snowflake), including the platform and region if applicable.
    ## For more information on Snowflake account names,
    ## see https://docs.snowflake.com/en/user-guide/connecting.html#your-snowflake-account-name
    #
      - account: <ORG_NAME>-<ACCOUNT_NAME>
    
        ## @param user - string - required
        ## Login name for the user.
        #
        user: <USER>
    
        ## @param password - string - required
        ## Password for the user
        #
        password: <PASSWORD>
    
        ## @param role - string - required
        ## Name of the role to use.
        ##
        ## By default, the SNOWFLAKE database is only accessible by the ACCOUNTADMIN role. Snowflake recommends
        ## configuring a role specific for monitoring:
        ## https://docs.snowflake.com/en/sql-reference/account-usage.html#enabling-account-usage-for-other-roles
        #
        role: <ROLE>
    ```

    `<ORG_NAME>-<ACCOUNT_NAME>`はややこしいかもしれないが、「アカウント識別子」にあたるもの。
    特に`<ACCOUNT_NAME>`はアカウントロケーターを意味している。


    Snowflakeにログイン後、Snowsight画面の左下より確認できる。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475867/eb0024cb-2919-cc13-ce23-75eab6acfea2.png)


    `<USER>`、`<PASSWORD>`、`<ROLE>` は先ほど作成したものを指定する。
    
    ここまで設定できたら、Saveをクリックし、Datadog Agentを再起動する。

    Datadog Agentの再起動は、「犬の骨」をクリックした時に表示されたメニューから Restart をクリックすればOK。

1. 再起動後、しばらく待ってからDatadogの画面を確認する

    Dashboards -> Snowflake で以下のような画面が確認できる。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475867/4d4bc62c-b253-7874-1b8e-2e2f012f04f1.png)

    何らかの数値が入っていれば、連携の初期設定としてはOK。
    ダッシュボードの`account` からconfigに記載したアカウント識別子が表示されていることを確認すると良い。

    また、Metricsの画面も確認する。
    Metricsの検索画面で「`Snowflake`」で検索して、Snowflakeのメトリクスが見えるようになっていればOK。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475867/7fe46018-c7bd-ed09-2bff-89ae920249a9.png)

## カスタマイズしてみる

いよいよカスタマイズ。
カスタムクエリを仕込むことで可能となる。

1. 自端末で、`snowflake.d/conf.yaml` を編集する

    Datadog AgentのWeb UIを活用する。

    `custom_queries:` と書いてある行まで行き、クエリを記述する。

    クエリ例を掲載する。
    ただし、この例は明確に何かを監視したいがためのSQLではなく、カスタマイズの例・挙動の変化をみるためのものと割り切って見ていただきたい。

    ``` yaml
    - query: select count(*), DATABASE_NAME, SCHEMA_NAME, WAREHOUSE_NAME from QUERY_HISTORY group by 2, 3, 4;
    columns:
      - name: query.total
        type: gauge
      - name: database_name
        type: tag
      - name: schema_name
        type: tag
      - name: warehouse_name
        type: tag
    tags:
      - test:snowflake
    ```

    同様に、保存して再起動する。

1. 再起動後、しばらく待ってからDatadogの画面を確認する

    先ほどと同様に、Metricsの検索画面で「`Snowflake`」で検索する。

    この時、カスタムクエリで定義したSnowflakeのメトリクスが見えるようになっていればOK。上記の例では「query.total」というものが見えるようになる。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475867/9faab3b0-f980-9804-9091-94397babeca2.png)


### とりあえず押さえておきたいカスタマイズのポイント
    
#### 任意メトリクス

カスタムクエリのcolmunsに記載した項目で「type: gauge」と指定したものが、そのままメトリクスとして表示されるようになる。

typeが`gauge`、`count`、`rate` 等ならメトリクスになるとの事。
詳細は、Datadogの[ドキュメント](https://docs.datadoghq.com/ja/metrics/types/?tab=count)を参照して理解を深める。


#### グループ化の単位

カスタムクエリのcolmunsに記載した項目で「type: tag」と指定したものが、DatadogのMetricsの画面で `sum by` `avg by` 等でグループ化する際に指定することができる項目名として表示される。

この設定がそのままモニター（アラート）設定する際の、マルチモニタの単位となる。(例えば、ユーザ名毎、ロール名毎、ウェアハウス名毎、等)

ここまで分かれば、あとはカスタムしまくるだけ。

# ぼやき

DatadogでSnowflakeを監視しようと思った時に最初に見るであろうDatadogの[公式ドキュメント](https://docs.datadoghq.com/ja/integrations/snowflake/)。

これを見て思ったこと。

###### Datadog Agentってなんやねん...

- ここ文脈では、SnowflakeとDatadogを中継するやつ
    - Snowflakeにアクセスしてデータを取得する
    - 取得したデータをDatadogに送信する
- どこぞのサーバにインストールしないといけないやつ

###### どこにインストールするねん...

Datadogの[ドキュメント](https://docs.datadoghq.com/ja/integrations/snowflake/)より、

> `datadog-agent integration install datadog-snowflake==2.0.1`

唐突にこんなコマンドが出てくるので、ビビる。

インターネットに接続が可能な何らかのパソコンやサーバ（物理、仮想問わない)を用意して、そこで実行する必要がある、ということだった。

###### snowflake.d/conf.yaml ってどこにあるの？

これもドキュメントやインターネットを彷徨っていると、唐突にconfigファイルのパスについて言及されてくるように見えるが、Datadog Agentをインストールしたサーバ上にあると解釈する。

例えば、macにデフォルト設定でインストールすると、以下のパスにある。

 `/opt/datadog-agent/etc/conf.d/snowflake.d/conf.yaml`

Datadogのアカウントにログインして、WebUIの何処かから見えるような代物ではない。(そう思っていた時期があった...)

###### SnowflakeアカウントとDatadogのアカウントを用意して、クラウドだけで監視設定を完結させたいのだが...

残念ながら(今は)できない。

誰もがこれを想像、あるいは期待して調査するであろう事柄。
例えばAWSだったら、サーバレス([Datadog Forwarder](https://docs.datadoghq.com/ja/logs/guide/forwarder/?tab=cloudformation))で実現できるし、同じ感覚でできないものかと期待してしまう。

調べた時点(2023/7)では、この事実を端的に述べてくれている方がいなかったので、ここに書いてみた。

Snowflake上にホスティング機能があれば、あるいはDatadog Agentの仕組みが見直されれば...。