New Relic APMでSnowflakeのSQLクエリを確認してみよう

New Relic APMはアプリケーションから発行されたSQLクエリの実行回数やパフォーマンス、SQL文などを確認できます。この記事ではSnowflakeに発行されたSQLクエリを可視化してみます。

APMの概要について理解されたい方は以下の記事をご確認ください。

https://qiita.com/nr-mito/items/74bf587bc97128403d9e

# はじめてみよう
今回は「[Integrating Snowflake with Spring Boot](https://medium.com/@kavyababu/using-snowflake-with-spring-boot-8a176a6a4a52)」で公開されている、アプリケーションをAmazon Linux 2023上で構築しNew Relic APMを導入してみます。

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

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

## 1. アプリケーションのインストール
1. Amazon Linux 2023にJavaとgitをインストールします。
    ```
    sudo yum install java git
    ```
1. アプリケーションをCloneします。
    ```
    git clone https://github.com/kavyababu7/springboot-snowflake-connect
    ```
1. プロジェクトディレクトリに移動します
    ```
    cd springboot-snowflake-connect
    ```

## 2. アプリケーションの設定
1. pom.xmlに記述されているSnowflake JDBCの依存関係のバージョンを変更します。

    ```pom.xml
    <dependency>
        <groupId>net.snowflake</groupId>
        <artifactId>snowflake-jdbc</artifactId>
        <version>3.13.29</version>
    </dependency>
    ```

1. Snowflakeの接続プロパティを設定します。

    ```src/main/resources/application.properties
    spring.datasource.username=<USERNAME>
    spring.datasource.password=<PASSWORD>
    spring.datasource.driverClassName=net.snowflake.client.jdbc.SnowflakeDriver
    snowflake.account=<SNOWFLAKE ACCOUNT>
    snowflake.schema=<SCHEMA>
    snowflake.database.name=<DATABASE NAME>
    snowflake.warehouse=<WAREHOUSE NAME>
    # Snowflake connection properties
    spring.datasource.url=jdbc:snowflake://${snowflake.account}.snowflakecomputing.com/?db=${snowflake.database.name}&schema=${snowflake.schema}&warehouse=${snowflake.warehouse}&JDBC_QUERY_RESULT_FORMAT=JSON

    spring.jpa.properties.hibernate.dialect=EmptyDialect
    ```

    :::note info
    クエリ結果をJSON形式で取得するため *spring.datasource.url* に **&JDBC_QUERY_RESULT_FORMAT=JSON** を追加してください

1. hibernate dialectを処理するための空のdialectを作成します。

    ```src/main/java/EmptyDialect.java
    import org.hibernate.dialect.Dialect;

    public class EmptyDialect extends Dialect {}
    ```

## 3. サンプルデータの投入
1. Snowflakeにテーブルを作成しデータを追加します。

    ```SQL
    create or replace TABLE NEWR.PUBLIC.T_CAR (
    	CAR_ID NUMBER(4,0),
    	CAR_NAME VARCHAR(10),
    	CAR_MODEL VARCHAR(10),
    	CAR_MAKE_YEAR NUMBER(4,0),
    	NUMBER_PLATE VARCHAR(4)
    );
    
    INSERT INTO NEWR."PUBLIC".T_CAR (CAR_ID, CAR_NAME, CAR_MODEL, CAR_MAKE_YEAR, NUMBER_PLATE) VALUES(1, 'CAR1', 'MODEL1', 2024, '1');
    INSERT INTO NEWR."PUBLIC".T_CAR (CAR_ID, CAR_NAME, CAR_MODEL, CAR_MAKE_YEAR, NUMBER_PLATE) VALUES(2, 'CAR2', 'MODEL2', 2024, '2');
    ```

## 4. アプリケーションの動作確認
1. アプリケーションを起動します。

    ```Shell
    ./mvnw clean package
    java -jar target/*.jar
    ```

1. ブラウザでアクセスできることを確認します。本アプリケーションはデフォルトでTCP:8080でListenします。

    ```URL
    http://<URL>:8080/api/cars?numberPlate=1
    ```
![Snowflake](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253766/116f92d5-f0b0-186d-fc60-45bebfe6e0d0.png)

1. 起動確認できたらアプリケーションを *Ctrl + C* で停止します。

# 5. New Relic APMの導入

Spring BootにAPM Agentを導入しますが、弊社エンジニアが別の記事で手順を公開していますので、そちらを参考に導入してください。
[APM Agentを導入] -> [Amazon Linux 2023にインストール]

https://qiita.com/nr-mito/items/4fcdef036777e6d28787#apm-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%82%92%E5%B0%8E%E5%85%A5

:::note info
New Relic上に表示されるアプリケーション名は元の記事の画像にある「petclinic」ではなく、本アプリケーションを識別しやすい名称を入力してください
:::

## 6. SQLクエリの確認
1. New Relicの [APM & Services] から今回追加したアプリケーションを選択します。
1. [Summary] の [Transactions] セクションから「*api/cars (GET)*」の 「Slowest trace」に表示される値をを選択します。
![Snowflake](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253766/28d1f449-5d57-3cca-c727-e6694a8b5c9a.png)

1. [Transaction trace] セクションから **** を選択すると、[Attribute]にSQLクエリが表示されます。
![Snowflake](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253766/80207adb-2746-bed8-92c0-7e9c08eff61b.png)

1. [Database queries] タブからもSQLクエリを確認することができます。
![Snowflake04](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253766/a2c9fe82-f05d-a7f6-2428-75c830da83b9.png)

- - - 
New Relic APMの簡単なセットアップで、JavaアプリケーションからSnowflakeに発行されるSQLクエリがNew Relic APMで確認できるようになりました。
皆さんのアプリケーションの品質維持や改善にぜひご活用ください！

# その他
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)
:::