🕌

【Snowflake】Event Table にログ情報を登録してみよう!

2024/10/09に公開

はじめに

こんにちは!システムサポートの斎藤です!

みなさんは、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公式ドキュメントの以下もご参照ください。
https://docs.snowflake.com/en/developer-guide/logging-tracing/logging-tracing-overview

Event Table を使ってみよう!

それでは、実際に Event Table を設定して、動作の確認をしてみましょう!

なお、本記事における設定内容は、以下の Snowflake 公式のチュートリアルを参考にしています。
https://docs.snowflake.com/en/developer-guide/logging-tracing/tutorials/logging-tracing-getting-started#introduction

注意
Event Table の作成・設定において、以下が必要ですので事前にご確認ください。

  • ご利用のユーザーが、ACCOUNTADMINロールを使用可能であること
  • ご利用のユーザーが、ご利用の Snowflake アカウントの Ownership 権限を持っていること

Event Table の作成

まずは Event Table を作成して、アカウントに紐づけます。
以下の手順で実行してください。

  1. Snowsight (Snowflake の WebUI) にサインインし、SQLワークシートを開きます。

  2. ロールを ACCOUNTADMIN に切り替えます。

USE ROLE ACCOUNTADMIN;
  1. 今回の設定で使用するデータベース、およびウェアハウスを作成します。
CREATE OR REPLACE DATABASE tutorial_log_trace_db;

CREATE OR REPLACE WAREHOUSE tutorial_log_trace_wh
  WAREHOUSE_TYPE = STANDARD
  WAREHOUSE_SIZE = XSMALL;
  1. Event Table を作成します。
CREATE OR REPLACE EVENT TABLE tutorial_event_table;
  1. 今回使用する Snowflakeアカウントに対して、④で作成した Event Table を紐づけます。
ALTER ACCOUNT SET EVENT_TABLE = tutorial_log_trace_db.public.tutorial_event_table;
  1. アカウントに対して、Event Table が無事紐づいているかを確認します。
SHOW PARAMETERS LIKE 'event_table' IN ACCOUNT;

ログメッセージの出力・確認

次に、作成した Event Table にログメッセージが出力されるか、ユーザー定義関数を作成・実行して確認してみましょう。

  1. ログレベルを「INFO」に設定します。
ALTER SESSION SET LOG_LEVEL = INFO;

※指定したレベル、およびより重大なレベルのメッセージがイベントテーブルに登録されます。
 設定可能なログレベルについては、以下をご参照ください。
https://docs.snowflake.com/sql-reference/parameters#log-level
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"
$$;
  1. 作成した関数を実行します。
SELECT log_trace_data();
  1. 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 にトレースイベントが出力されるか、こちらも別のユーザー定義関数を作成・実行して確認してみましょう。

  1. トレースレベルを「ON_EVENT」に設定します。
ALTER SESSION SET TRACE_LEVEL = ON_EVENT;

※指定したレベルに応じた範囲のトレースイベントがイベントテーブルに登録されます。
 設定可能なトレースレベルについては、以下をご参照ください。
https://docs.snowflake.com/sql-reference/parameters#label-trace-level
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"
$$;
  1. 作成した関数を実行します。
SELECT log_trace_data();
  1. 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 を設定し、レベルや出力内容を細かく指定することで、より運用イメージに近い形でログ情報を管理することが可能です。
皆さんもぜひ活用してみてください!

https://www.sts-inc.co.jp/snowflake/

Discussion