Snowflake で監視や定期的なモニタリングを実施するとよい観点と方法をまとめてみた
とーかみです。
Snowflake を使っていく上で監視を設定したり、監視までは不要でも定期的にチェックするとよい観点と確認方法をまとめてみました。
監視の設定と Amazon SNS 経由で通知する方法については以下の記事にまとめていますので参考にしていただければと思います。
ベストプラクティス:なんでもかんでも監視しない
この記事で紹介するもの以外にも、やろうと思えば監視できることは(Snowflake に限らず)いろいろあります。
だからといってなんでもかんでも監視するのはやめましょう!
検知した際の対応が追いつかなかったり、静観するものが多くなって対応が必要なものを見逃したりしやすくなります。
また、「監視をやめる」のはとてもハードルが高いです。
すぐにアクションが必要でなさそうなものは定期的なチェックからはじめましょう。
以降、本題です。
チェックするとよい観点
- クエリエラー
- クエリ実行時間
- ストレージ使用量
- クレジット消費量
- 仮想ウェアハウスの状態
- ユーザーアクティビティ
- メタデータ
クエリエラー
クエリエラーは 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
ビューから確認できます。
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 = 'クエリ検証用';
ストレージ使用量
ストレージ使用量は複数のビューで確認することができます。
-- アカウント全体のステージのストレージ使用量
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
ビューから確認できます。
日ごと、仮想ウェアハウスごとに集計する場合は以下のようなクエリになります。
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_LOAD
や AVG_QUEUED_PROVISIONING
はキューに入ったクエリの負荷を表していて、この値が大きいということはクエリのリクエストに対して仮想ウェアハウスのリソースが枯渇している状態のため仮想ウェアハウスのスペックアップを検討するというような使い方です。
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
ビューから確認できます。
失敗したログインも記録されるため、ユーザーからの問合せや不正アクセスの検知のような使い方ができます。
SELECT
*
FROM
SNOWFLAKE.ACCOUNT_USAGE.LOGIN_HISTORY
WHERE
EVENT_TIMESTAMP >= CURRENT_DATE - 7
ORDER BY
EVENT_TIMESTAMP DESC;
メタデータ
他にも INFORMATION_SCHEMA
や SNOWFLAKE.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 のパフォーマンスチューニングにための調査ガイドが公開されています。
まとめ
Snowflake を運用していくなかでモニタリングしていく観点と方法をまとめました。
代表的なものを記載していますが、それぞれの環境にあわせてカスタマイズしながらご利用いただければと思います。