New RelicでSnowflakeの使用状況を可視化してみよう

New RelicのSnowflake integrationを利用することで、Snowflakeのクエリ パフォーマンス、ストレージ システムやウェアハウスの状態、請求情報などを収集し可視化します。

![Dashboard](https://docs.newrelic.com/images/infrastructure_screenshot-full_snowflake-dashboard.webp)

# Snowflake integration with flex とは
Snowflake integration with flexは **New Relic Flex** でSQLクエリをSnowflakeに対して実行しACCOUNT_USAGEスキーマからデータを取得します。

https://docs.newrelic.com/jp/docs/infrastructure/host-integrations/host-integrations-list/flex-integration-tool-build-your-own-integration/

ACCOUNT_USAGEスキーマにはSnowflakeアカウントのオブジェクトメタデータと使用状況を表示するビューが用意されており、これらのビューからSnowflakeの利用状況を可視化できるようになります。

Snowflake integration with flexでは次のビューからデータを取得しています。
|ビュー|ビューに含まれるデータ|
|---|---|
AUTOMATIC_CLUSTERING_HISTORY|自動クラスタリングに対して請求されたクレジットの数など
DATABASE_STORAGE_USAGE_HISTORY|データベースの1日あたりの平均ストレージ使用量
DATA_TRANSFER_HISTORY|Snowflakeテーブルから別のクラウドストレージプロバイダーのネットワークに転送されたデータの履歴
LOGIN_HISTORY|Snowflakeユーザーによるログイン試行
METERING_HISTORY|アカウントの時間単位のクレジット使用状況
PIPE_USAGE_HISTORY|Snowflakeテーブルにロードされたデータの履歴
QUERY_HISTORY|Snowflakeクエリの履歴
REPLICATION_USAGE_HISTORY|指定したデータベースのレプリケーション履歴
STAGE_STORAGE_USAGE_HISTORY|アカウントのSnowflake内部ステージすべての1日あたりの平均データストレージ使用量
STORAGE_USAGE|1日あたりの平均データストレージ使用量
TABLE_STORAGE_METRICS|テーブルレベルのストレージ使用率情報
WAREHOUSE_LOAD_HISTORY|ウェアハウスのワークロード
WAREHOUSE_METERING_HISTORY|単一のウェアハウス（またはアカウント内にあるすべてのウェアハウス）における毎時のクレジット使用状況

ACCOUNT_USAGEスキーマの詳細については公式ドキュメントを参照してください。

https://docs.snowflake.com/ja/sql-reference/account-usage

:::note info
ACCOUNT_USAGEスキーマは最新のデータが反映されるまでの待機時間があります。
詳細は上記の公式ドキュメントをご確認ください。
:::

# はじめてみよう
それではSnowflake integration with flexをセットアップしてみましょう。
この手順ではLinux環境にSnowflake CLI クライアントとNew Relic Infrastructure Agentをインストールします。

New Relicのアカウントをお持ちでない方は **無料アカウント** を作成の上、お試しください！ **全機能使い放題のユーザー1名と100GBのデータ転送が無料** で使えます。

https://qiita.com/ktst79/items/5ee74b34e6adb8a7a6fa

Infrastructure Agentのインストールはこちらの記事も参考にしてください。

https://qiita.com/nr-mito/items/b11c4645cfc3f5ad6d8a

## 1. Snowflake CLI クライアントのインストール
SnowSQLが実行するためのSnowflake CLI クライアントをインストールします。
インストール手順は公式ドキュメントを参考にしてください。

https://docs.snowflake.com/ja/user-guide/snowsql

## 2. Snowflake integration with flexのセットアップ
1. New Relicの管理画面にログインし、[+ Integrations & Agents] -> [Snowflake] を選択します。
![NewRelic](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253766/edacacf7-15d2-f6f0-01de-2976583d5315.png)

1. [Begin installation] をクリックします。
![NewRelic](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253766/68961fa4-c416-581c-a319-9181261308f0.png)

1. User Keyを指定し、➁に表示されたコマンドをコピーしてLinux上で実行するとInfrastructure Agentのインストールが開始されます。
![NewRelic](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253766/753e289d-cd82-3fe1-292f-b1dd2659701a.png)

1. Infrastructure Agentが正常にインストールされたことを確認し、[Continue] をクリックします。

1. Snowflakeの「ACCOUNT」「USERNAME」「PASSWORD」を入力します。入力した値がSnowSQLのコマンドに反映されます(黄色)。
![NewRelic](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253766/137a1751-8c9c-92c9-8ad6-40e2229734a1.png)

1. 表示されたコマンドがLinux上で1分毎に実行されるようにcronを設定します。

    :::note info
    これらのコマンドによりSnowflakeにSQLクエリが実行され、コマンドの最後に指定された一時ファイルにデータが出力されます。New Relic Flexはこの一時ファイルを指定された間隔で読み取り、にインジェストします。

1. cronの設定が完了したら、[Continue] をクリックします。
1. New Relic Flexの構成ファイル (nri-snowflake-config.yml) を作成し、[Continue] をクリックします。
![NewRelic](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253766/fbfe4fc4-210c-9730-ef47-0a516f5dc78b.png)

    :::note info
    構成ファイル内の *interval* は 「**30ｓ**」に設定されています。cronで実行するSnowSQLは［**１分**］なので重複したデータがインジェストされる場合があります。SQLクエリの内容に応じてこれらの間隔を変更してください。


1. Infrastructure Agentを再起動し、[Continue] をクリックします。
1. [Test connection] をクリックし、データのインジェストを確認します。
![Snow06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253766/743980e7-5d52-56e9-5762-fc34dcd1cc4b.png)


1. Statusが「Successful」になることを確認し、[Continue] をクリックします。
1. ダッシュボードやアラートが追加されます。
![NewRelic](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253766/805ec716-4ca3-320b-5c92-1816b9ed5987.png)

1. [See your data] をクリックすると追加したダッシュボードを確認できます。
![NewRelic](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253766/f62f5f4b-c019-1813-b0dc-733d1ea4005c.png)

## データを確認してみよう

ダッシュボードには次のデータが表示されます。Snowflakeのパフォーマンスやコストの確認、改善などに活用してください。

- Overview
    - ストレージにスピルされたバイト数
    - ログイン履歴
    - ウェアハウスのパフォーマンス
- Query Performance
    - クエリの実行時間
- Storage
    - 平均データストレージ使用量
    - ストレージにスピルされたバイト数
- Billing
    - クレジットの使用状況

# Tips
ここではSnowflake integration with flexのSnowSQLコマンドやSQLクエリのカスタマイズについて補足します。ご利用の環境にあわせて試してみてください。

* SnowSQLのコマンドにユーザー名やパスワードを記述しない

    [+ Integrations & Agents] でガイドされるSnowSQLのコマンドにはアカウントやユーザー名などの接続パラメータが直接記述されています。セキュリティや保守性などの観点から、これらの情報はSnowSQLのconfigファイルに記述することをご検討ください。
    
    <details><summary>SnowSQL configの設定例</summary>

    ```設定例
    [connections]
    accountname = XXXXX
    username = YYYYY
    password = ZZZZZ
    ```
    </details>

    <details><summary>SnowSQLのコマンド例</summary>

    ```設定例
    snowsql -o output_format=json -o remove_comments=true -o header=true -o timing=false -o friendly=false -q .....
    ```
    </details>

    接続パラメータは以下のように名前付き接続定義で指定することもできます。

    <details><summary>SnowSQL configの設定例 (名前付き接続定義)</summary>

    ```設定例
    [connections.example]
    accountname = XXXXX
    username = YYYYY
    password = ZZZZZ
    ```
    </details>

    <details><summary>SnowSQLのコマンド例 (名前付き接続定義)</summary>

    ```設定例
    snowsql -c example -o output_format=json -o remove_comments=true -o header=true -o timing=false -o friendly=false -q .....
    ```
    </details>
    
https://docs.snowflake.com/ja/user-guide/snowsql-config


* データの期間範囲の調整
SQLクエリによってはすべての期間のデータを取得するため、インジェスト量が増えたり重複するデータが発生します。WHERE句で *START_TIME* カラムに対するフィルタ条件を指定してみてください。

    
    <details><summary>SQLクエリの例</summary>

    ```設定例
    SELECT QUERY_ID, QUERY_TEXT, (EXECUTION_TIME / 60000) AS EXEC_TIME, WAREHOUSE_NAME, USER_NAME, EXECUTION_STATUS FROM "SNOWFLAKE"."ACCOUNT_USAGE"."QUERY_HISTORY" WHERE EXECUTION_STATUS = '\''SUCCESS'\'' AND START_TIME > DATEADD("s", -60, current_timestamp()) ORDER BY EXECUTION_TIME DESC;
    ```
    :::note info
    この例では現在日時から60秒前以降のデータを対象にしています。時間はcronの実行間隔にあわせてみてください。 
    </details>

https://docs.snowflake.com/ja/sql-reference/functions/dateadd    

* レコードの日時をtimestampにマップする
    デフォルトではインジェストした日時が *timestamp* にマップされます。クエリの実行履歴(QUERY_HISTORY)などでは、そのクエリの実行日時が *timestamp* であれば調査がしやすくなります。
    *timestamp* を上書きするにはNew Relic Flexの構成ファイルでキーをリネームします。

    <details><summary>SQLクエリにSTART_TIMEを追加</summary>

    ```設定例
    SELECT START_TIME, QUERY_ID, QUERY_TEXT, (EXECUTION_TIME / 60000) AS EXEC_TIME, WAREHOUSE_NAME, USER_NAME, EXECUTION_STATUS FROM "SNOWFLAKE"."ACCOUNT_USAGE"."QUERY_HISTORY" WHERE EXECUTION_STATUS = '\''SUCCESS'\'' AND START_TIME > DATEADD("s", -60, current_timestamp()) ORDER BY EXECUTION_TIME DESC;
    ```
    </details>

    <details><summary>New Relic Flex 構成ファイルの変更例</summary>

    ```設定例
  - name: nri-flex
    interval: 30s
    config:
      name: snowflakeLongestQueries
      apis: 
        - name: snowflakeLongestQueries
          file: /home/ubuntu/dev/snowflake-longest-queries.json
      timestamp_conversion:
        START_TIME: TIMESTAMP::2006-01-02 15:04:05.000 -0700
      rename_keys:
        START_TIME: timestamp    
    ```
    </details>

# その他
New Relicでは、**新しい機能やその活用方法**について、QiitaやXで発信しています！
**無料でアカウント作成**も可能なのでぜひお試しください！

:::note info
New Relic株式会社の[X(旧Twitter)](https://x.com/NewRelicJapan) や [Qiita OrganizationOrganization](https://qiita.com/organizations/newrelic)では、
新機能を含む活用方法を公開していますので、ぜひフォローをお願いします。
:::

:::note info
無料のアカウントで試してみよう！
[New Relic フリープランで始めるオブザーバビリティ！](https://qiita.com/ktst79/items/5ee74b34e6adb8a7a6fa)
:::