Snowflake で監視や定期的なモニタリングを実施するとよい観点と方法をまとめてみた

Snowflake で監視や定期的なモニタリングを実施するとよい観点と方法をまとめてみた

Clock Icon2025.01.24

とーかみです。

Snowflake を使っていく上で監視を設定したり、監視までは不要でも定期的にチェックするとよい観点と確認方法をまとめてみました。

監視の設定と Amazon SNS 経由で通知する方法については以下の記事にまとめていますので参考にしていただければと思います。

https://dev.classmethod.jp/articles/receive-snowflake-alert-notifications-via-amazon-sns/

ベストプラクティス:なんでもかんでも監視しない

この記事で紹介するもの以外にも、やろうと思えば監視できることは(Snowflake に限らず)いろいろあります。

だからといってなんでもかんでも監視するのはやめましょう!

検知した際の対応が追いつかなかったり、静観するものが多くなって対応が必要なものを見逃したりしやすくなります。
また、「監視をやめる」のはとてもハードルが高いです。

すぐにアクションが必要でなさそうなものは定期的なチェックからはじめましょう。

以降、本題です。

チェックするとよい観点

  • クエリエラー
  • クエリ実行時間
  • ストレージ使用量
  • クレジット消費量
  • 仮想ウェアハウスの状態
  • ユーザーアクティビティ
  • メタデータ

クエリエラー

クエリエラーは QUERY_HISTORY ビューから確認できます。

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

特定のクエリのエラーを確認することもできますが、運用の中ではエラーの傾向を分析する用途でも使用できます。

スケジュールクエリとユーザーによるクエリで実行する仮想ウェアハウスを分けている場合は、仮想ウェアハウス単位で絞ることでスケジュールクエリのみエラー通知をするような使い方もできます。

SELECT
    QUERY_ID,
    USER_NAME,
    START_TIME,
    END_TIME,
    ERROR_CODE,
    ERROR_MESSAGE
FROM 
    TABLE(INFORMATION_SCHEMA.QUERY_HISTORY(
        end_time_range_start=>dateadd('hours',-1,current_timestamp()),
        end_time_range_end=>current_timestamp(), -- 直近 1 時間
        result_limit=>10000
    ))
WHERE 
    ERROR_CODE IS NOT NULL
    -- AND WAREHOUSE_NAME = '<warehouse_name>'
    -- AND DATABASE_NAME = '<database_name>'
    -- AND SCHEMA_NAME = '<schema_name>'
ORDER BY 
    START_TIME DESC;

クエリ実行時間

クエリ実行時間も QUERY_HISTORY ビューから確認できます。

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

SELECT
    EXECUTION_TIME / 1000 AS EXECUTION_TIME_SECONDS,
    QUERY_ID,
    START_TIME,
    END_TIME
FROM 
    TABLE(INFORMATION_SCHEMA.QUERY_HISTORY(
        end_time_range_start=>dateadd('hours',-1,current_timestamp()),
        end_time_range_end=>current_timestamp(), -- 直近 1 時間
        result_limit=>10000
    ))
-- WHERE 
--     EXECUTION_TIME > 60000 -- 実行に 60 秒以上かかっている
ORDER BY 
    EXECUTION_TIME DESC;

QUERY_HISTORY ビューには、上記のサンプルクエリに記載している他にも時間やデータ量に関連するカラムがあるので詳細な分析が可能です。

また、クエリ実行時に QUERY_TAG を設定しておきクエリの種類ごとに分析するような使い方もできます。
QUERY_HISTORY は以下のように設定します。

ALTER SESSION SET QUERY_TAG = 'クエリ検証用';

ストレージ使用量

ストレージ使用量は複数のビューで確認することができます。

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

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

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

-- アカウント全体のステージのストレージ使用量
SELECT * FROM SNOWFLAKE.ACCOUNT_USAGE.STAGE_STORAGE_USAGE_HISTORY
WHERE USAGE_DATE BETWEEN dateadd('days',-10,current_date()) AND current_date()
ORDER BY USAGE_DATE DESC;

-- データベース単位
SELECT *
FROM table(INFORMATION_SCHEMA.DATABASE_STORAGE_USAGE_HISTORY(
    dateadd('days',-10,current_date()),current_date() -- 直近 10 日分
    )
)
ORDER BY USAGE_DATE DESC;

-- テーブル単位のストレージ使用量
SELECT * FROM SNOWFLAKE.ACCOUNT_USAGE.TABLE_STORAGE_METRICS;

クレジット消費量

クレジット消費量は WAREHOUSE_METERING_HISTORY ビューから確認できます。

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

日ごと、仮想ウェアハウスごとに集計する場合は以下のようなクエリになります。

SELECT 
    WAREHOUSE_NAME,
    SUM(CREDITS_USED) AS TOTAL_CREDITS,
    DATE_TRUNC('DAY', START_TIME) AS USAGE_DATE
FROM 
    SNOWFLAKE.ACCOUNT_USAGE.WAREHOUSE_METERING_HISTORY
WHERE 
    START_TIME >= CURRENT_DATE - 7
GROUP BY 
    WAREHOUSE_NAME, USAGE_DATE
ORDER BY 
    USAGE_DATE DESC, TOTAL_CREDITS DESC;

仮想ウェアハウスの負荷状態

仮想ウェアハウスの負荷状態は WAREHOUSE_LOAD_HISTORY ビューから確認できます。

例えば AVG_QUEUED_LOADAVG_QUEUED_PROVISIONING はキューに入ったクエリの負荷を表していて、この値が大きいということはクエリのリクエストに対して仮想ウェアハウスのリソースが枯渇している状態のため仮想ウェアハウスのスペックアップを検討するというような使い方です。

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

SELECT 
    WAREHOUSE_NAME,
    AVG(AVG_RUNNING) AS AVG_CONCURRENT_QUERIES,
    AVG(AVG_QUEUED_LOAD) AS AVG_QUEUED_QUERIES,
    AVG(AVG_BLOCKED) AS AVG_BLOCKED_QUERIES,
    DATE_TRUNC('HOUR', START_TIME) AS HOUR
FROM 
    SNOWFLAKE.ACCOUNT_USAGE.WAREHOUSE_LOAD_HISTORY
WHERE 
    START_TIME >= CURRENT_DATE - 1
GROUP BY 
    WAREHOUSE_NAME, HOUR
ORDER BY 
    HOUR DESC;

ユーザーアクティビティ

ログインなどのユーザーアクティビティは LOGIN_HISTORY ビューから確認できます。
失敗したログインも記録されるため、ユーザーからの問合せや不正アクセスの検知のような使い方ができます。

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

SELECT 
    *
FROM 
    SNOWFLAKE.ACCOUNT_USAGE.LOGIN_HISTORY
WHERE 
    EVENT_TIMESTAMP >= CURRENT_DATE - 7
ORDER BY 
    EVENT_TIMESTAMP DESC;

メタデータ

他にも INFORMATION_SCHEMASNOWFLAKE.ACCOUNT_USAGE スキーマには、アカウント内のメタデータ、実行ログが記録されています。

定期的なモニタリング以外の調査用途でも活用できるさまざまな情報があるので、調べてみることをおすすめします。

https://docs.snowflake.com/ja/sql-reference/info-schema

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

例)最近変更されたテーブル

SELECT 
    TABLE_SCHEMA,
    TABLE_NAME,
    CREATED,
    LAST_ALTERED
FROM 
    INFORMATION_SCHEMA.TABLES
WHERE 
    LAST_ALTERED >= CURRENT_DATE - 7
ORDER BY 
    LAST_ALTERED DESC;

例)最近失敗した Snowpipe でのデータロード

SELECT 
    *
FROM 
    SNOWFLAKE.ACCOUNT_USAGE.PIPE_USAGE_HISTORY
WHERE 
    END_TIME >= CURRENT_DATE - 7
ORDER BY 
    END_TIME DESC;

Snowsight からも確認できる

モニタリングや管理者メニューからもクエリやストレージ、料金についての情報が確認できます。

料金アラートも設定できるので、クレジットの消費状況の検知やトレースを行うことができます。

参考 : パフォーマンス最適化ガイド

以下のページに Snowflake のパフォーマンスチューニングにための調査ガイドが公開されています。

https://quickstarts.snowflake.com/guide/resource_optimization_performance_optimization/

まとめ

Snowflake を運用していくなかでモニタリングしていく観点と方法をまとめました。

代表的なものを記載していますが、それぞれの環境にあわせてカスタマイズしながらご利用いただければと思います。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.