【Snowflake】Event Table にログ情報を登録してみよう!
はじめに
こんにちは!システムサポートの斎藤です!
みなさんは、Snowflake でログを管理する方法ってご存知ですか?
Snowflake には Event Table (イベントテーブル)という機能があり、事前に設定しておくことで、ユーザー定義関数やストアドプロシージャを実行した際にログ情報を登録することが可能です。
エラー発生時の情報収集・原因調査をスムーズに行う上で、非常に有効な機能と言えます。
今回はSnowflakeのEvent Table を使って、ログメッセージとトレースイベントを登録するための設定を紹介します!
本記事で分かること
本記事では、Snowflake 上に Event Table を作成し、Snowflakeのユーザー定義関数を実行した際のイベントメッセージおよびトレースイベントを登録する設定方法を解説します。
具体的には以下の内容について理解することができます。
- Snowflake での Event Table の作成・設定方法
- ユーザー定義関数の実行時にイベントメッセージを Event Table に登録する方法
- ユーザー定義関数の実行時にトレースイベントを Event Table に登録する方法
Event Table とは?
Snowflake では Event Table という、Snowflake ユーザー定義関数やストアドプロシージャのハンドラーコードで生成されたイベントデータを登録するためのテーブルを作成・設定することができます。
以下の特徴があります。
- 通常のテーブルとは異なり、仮テーブル(TEMPORARY)や一時テーブル(TRANSIENT)のような独自のオブジェクト・タイプ
- 事前定義された独自の列を備えるテーブルのため、ユーザー側での列の定義は不要
- Event table を作成してアカウントへの紐づけを設定することで、以後ログメッセージやトレースデータとして出力した内容がイベントテーブルに自動登録
- ログレベルやトレースレベルを指定することで、欲しい種類のデータのみを登録することも可能
※機能の詳細については、Snowflake公式ドキュメントの以下もご参照ください。
Event Table を使ってみよう!
それでは、実際に Event Table を設定して、動作の確認をしてみましょう!
なお、本記事における設定内容は、以下の Snowflake 公式のチュートリアルを参考にしています。
注意
Event Table の作成・設定において、以下が必要ですので事前にご確認ください。
- ご利用のユーザーが、ACCOUNTADMINロールを使用可能であること
- ご利用のユーザーが、ご利用の Snowflake アカウントの Ownership 権限を持っていること
Event Table の作成
まずは Event Table を作成して、アカウントに紐づけます。
以下の手順で実行してください。
-
Snowsight (Snowflake の WebUI) にサインインし、SQLワークシートを開きます。
-
ロールを ACCOUNTADMIN に切り替えます。
USE ROLE ACCOUNTADMIN;
- 今回の設定で使用するデータベース、およびウェアハウスを作成します。
CREATE OR REPLACE DATABASE tutorial_log_trace_db;
CREATE OR REPLACE WAREHOUSE tutorial_log_trace_wh
WAREHOUSE_TYPE = STANDARD
WAREHOUSE_SIZE = XSMALL;
- Event Table を作成します。
CREATE OR REPLACE EVENT TABLE tutorial_event_table;
- 今回使用する Snowflakeアカウントに対して、④で作成した Event Table を紐づけます。
ALTER ACCOUNT SET EVENT_TABLE = tutorial_log_trace_db.public.tutorial_event_table;
- アカウントに対して、Event Table が無事紐づいているかを確認します。
SHOW PARAMETERS LIKE 'event_table' IN ACCOUNT;
ログメッセージの出力・確認
次に、作成した Event Table にログメッセージが出力されるか、ユーザー定義関数を作成・実行して確認してみましょう。
- ログレベルを「INFO」に設定します。
ALTER SESSION SET LOG_LEVEL = INFO;
※指定したレベル、およびより重大なレベルのメッセージがイベントテーブルに登録されます。
設定可能なログレベルについては、以下をご参照ください。
2. ユーザー定義関数を作成します。
CREATE OR REPLACE FUNCTION log_trace_data()
RETURNS VARCHAR
LANGUAGE PYTHON
RUNTIME_VERSION = 3.8
HANDLER = 'run'
AS $$
# logging モジュールをインポートし、loggerオブジェクト「tutorial_logger」を作成
import logging
logger = logging.getLogger("tutorial_logger")
def run():
# INFOレベルで、任意のログメッセージを登録
logger.info("Logging from Python function.")
return "SUCCESS"
$$;
- 作成した関数を実行します。
SELECT log_trace_data();
- Event Table にログメッセージが登録されていることを確認します。
※登録が完了するまでに若干のラグがあります。
SELECT
TIMESTAMP AS time,
RESOURCE_ATTRIBUTES['snow.executable.name'] as executable,
RECORD['severity_text'] AS severity,
VALUE AS message
FROM
tutorial_log_trace_db.public.tutorial_event_table
WHERE
RECORD_TYPE = 'LOG'
AND SCOPE['name'] = 'tutorial_logger';
それぞれの出力列の意味は、以下のとおりです。
出力列 | 意味 |
---|---|
TIME | エントリが作成された時刻 (TIMESTAMP 列から) |
EXECUTABLE | ユーザー定義関数の名前とパラメーター (RESOURCE_ATTRIBUTES 列の属性「snow.executable.name」から) |
SEVERITY | ログ・エントリーの重大度 (RECORD カラムの属性「severity_text」から) |
MESSAGE | ログ・メッセージ (VALUE 列から) |
トレースイベントの出力・確認
最後に、作成した Event Table にトレースイベントが出力されるか、こちらも別のユーザー定義関数を作成・実行して確認してみましょう。
- トレースレベルを「ON_EVENT」に設定します。
ALTER SESSION SET TRACE_LEVEL = ON_EVENT;
※指定したレベルに応じた範囲のトレースイベントがイベントテーブルに登録されます。
設定可能なトレースレベルについては、以下をご参照ください。
2. トレースイベントを出力するユーザー定義関数を作成します。
CREATE OR REPLACE FUNCTION log_trace_data()
RETURNS VARCHAR
LANGUAGE PYTHON
-- データ収集に用いるSnowflakeのテレメトリパッケージ「snowflake-telemetry-python」を実行環境に追加
PACKAGES = ('snowflake-telemetry-python')
RUNTIME_VERSION = 3.8
HANDLER = 'run'
AS $$
import logging
logger = logging.getLogger("tutorial_logger")
# 「snowflake-telemetry-python」をインポート
from snowflake import telemetry
def run():
telemetry.set_span_attribute("example.proc.run", "begin")
# スパン(実行対象)に記録するイベント「event_with_attributes」を追加
telemetry.add_event("event_with_attributes", {"example.key1": "value1", "example.key2": "value2"})
logger.info("Logging from Python function.")
return "SUCCESS"
$$;
- 作成した関数を実行します。
SELECT log_trace_data();
- Event Table にトレースイベントが登録されていることを確認します。
※登録が完了するまでに若干のラグがあります。
SELECT
TIMESTAMP AS time,
RESOURCE_ATTRIBUTES['snow.executable.name'] AS handler_name,
RECORD['name'] AS event_name,
RECORD_ATTRIBUTES AS attributes
FROM
tutorial_log_trace_db.public.tutorial_event_table
WHERE
RECORD_TYPE = 'SPAN_EVENT'
AND HANDLER_NAME LIKE 'LOG_TRACE_DATA%';
それぞれの出力列の意味は、以下のとおりです。
出力列 | 意味 |
---|---|
TIME | エントリが作成された時刻 (TIMESTAMP 列から) |
HANDLER_NAME | ユーザー定義関数の名前とパラメーター (RESOURCE_ATTRIBUTES 列の属性「snow.executable.name」から) |
EVENT_NAME | 関数とともに追加されたイベントの名前 (RECORD カラムの属性「add_eventname」から) |
ATTRIBUTES | イベントに付随して追加された属性 (RECORD_ATTRIBUTES列から) |
まとめ
本記事では、以下について学習しました。
- Snowflake での Event Table の作成・設定方法
- ユーザー定義関数の実行時にイベントメッセージを Event Table に登録する方法
- ユーザー定義関数の実行時にトレースイベントを Event Table に登録する方法
Event Table を設定し、レベルや出力内容を細かく指定することで、より運用イメージに近い形でログ情報を管理することが可能です。
皆さんもぜひ活用してみてください!
Discussion