動的テーブルのイベントテーブル監視とアラート¶
このトピックでは、リフレッシュステータスに関する情報を提供するイベントテーブルをクエリする方法と、イベントテーブルの新しいデータに関するアラートをセットアップする方法について説明します。
リフレッシュを監視するためにイベントテーブルをクエリします。¶
動的テーブルがリフレッシュされたときに、リフレッシュ操作のステータスに関する情報を提供するイベントを記録するようにSnowflakeを構成できます。イベントは、動的テーブルに関連付けられた アクティブ イベント テーブル に記録されます。
例えば、 イベントテーブルをデータベースに関連付けた とします。データベースの動的テーブルが更新されると、Snowflakeはそのイベントテーブルにイベントを記録します。
このアクティブ・イベント・テーブルにログ記録されたイベントをクエリして、動的テーブルの更新を監視できます。
た と えば、データベース my_db の動的テーブルを使用したエラーについて、タイムスタンプ、動的テーブル名、クエリ ID、およびエラーメッセージを取得するには、以下のようにします。
以下の例は、スキーマ my_schema の動的テーブルを持つアップストリーム・エラーの全列を取得します。
イベントテーブルをクエリするために必要なロールや、結果をフィルターするために使用できる条件については、 新しいデータのアラート設定 を参照してください。
新しいデータに対するアラートをセットし、更新を監視します。¶
前述したように、動的テーブルがリフレッシュされると、リフレッシュが成功したか失敗したかを示すイベントがイベント・テーブルにログ記録されます。イベントテーブルを監視するために、 新しいデータに対してアラート をセットすることができます。リフレッシュが失敗したときに 通知を送信する ようにアラートを構成できます。
次のセクションでは、イベントをキャプチャするためのイベントログのセットアップ方法、アラートのセットアップ方法、イベントテーブルに記録されたイベントの解釈方法について説明します。
注釈
動的テーブルのイベントのログにはコストがかかります。テレメトリーデータ収集の費用 をご参照ください。
キャプチャするイベントの重大度レベルのセット¶
注釈
重大度レベルをセットしないと、イベントはキャプチャされません。
イベント・テーブルに記録する動的テーブル・イベントを設定するには、イベント・テーブルに記録する イベントの重大度レベルをセットします。イベントは以下のレベルで捕捉されます。
ERROR: 失敗イベントをリフレッシュします。WARN: アップストリーム動的テーブルのリフレッシュ失敗およびリフレッシュ失敗イベント。INFO: リフレッシュ成功イベント、アップストリーム動的テーブルのリフレッシュ失敗イベント、リフレッシュ失敗イベント。
レベルを設定するには、アカウントまたはオブジェクトの LOG_EVENT_LEVEL パラメーターを設定します。次のレベルを設定できます。
アカウント内のすべてのオブジェクト。
データベースまたはスキーマ内のすべてのオブジェクト。
特定の動的テーブル。
例:
アカウントでサポートされているすべてのオブジェクトに対して ERROR レベルの動的テーブルイベントをキャプチャするには、 ALTER ACCOUNT SET LOG_EVENT_LEVEL を実行します。
アカウントレベルでの
LOG_EVENT_LEVELの設定は、動的テーブルを含む、アカウントでサポートされているワークロードのログイベント(記録タイプ EVENT )に適用されます。APIs のロギングによるログメッセージに関する LOG_LEVEL は置き換えられません。詳細については、 パラメーター をご参照ください。my_dbデータベースでサポートされているすべてのオブジェクトの INFO レベルのイベントをキャプチャするには、 ALTER DATABASE ... SET LOG_EVENT_LEVEL を実行します。アカウントにレベルを設定する場合と同様に、データベースにレベルを設定すると、データベース内でサポートされているオブジェクトタイプのログイベントに影響します。
my_dynamic_table動的テーブルのWARN レベルのイベントをキャプチャするには、 ALTER DYNAMIC TABLE ... SET LOG_EVENT_LEVEL を実行します。
新しいデータのアラート設定¶
ログ・イベントの重大度レベルを設定した後、動的なテーブル更新の失敗を示す新しいイベントをイベント・テーブルで監視するために、新しいデータに対するアラートを設定できます。新しいデータに関するアラートは、イベントテーブルの新しい行が挿入され、アラートで指定された条件を満たすとトリガーされます。
注釈
新しいデータに対してアラートを作成するには、イベント・テーブルをクエリするために必要な権限を付与されたロールを使用する必要があります。
アラート条件がデフォルトのイベントテーブル (SNOWFLAKE.TELEMETRY.EVENTS) または定義済みのビュー (SNOWFLAKE.TELEMETRY.EVENTS_VIEW ビュー) にクエリする場合は、 デフォルトのイベント・テーブルと EVENTS_VIEW へのアクセスのロール を参照してください。
EVENTS_VIEW 表示へのアクセスを管理するには、 EVENTS_VIEW 表示へのアクセス管理 を参照してください。
アラート条件がカスタムイベントテーブルにクエリする場合は、 イベントテーブルのアクセス制御権限 を参照してください。
カスタムイベントテーブルへのアクセスを管理するには、 イベントテーブルデータへのアクセスの管理 を参照してください。
resource_attributes:"snow.executable.type" = 'DYNAMIC_TABLE' アラート条件では、動的テーブル・イベントをクエリするには、行を選択します。イベントリストを絞り込むには、以下の列でフィルターをかけることができます。
結果を特定のデータベース内の動的テーブルに限定するには、
resource_attributes:"snow.database.name"を使用します。動的テーブルのエラーによりリフレッシュに失敗したイベントを返すには、
value:state = 'FAILED'を使用します。上流の動的テーブルでエラーが発生し、リフレッシュに失敗したイベントを返すには、
value:state = 'UPSTREAM_FAILURE'を使用します。
動的テーブル・イベントでログに記録される値に関する情報は、 動的テーブルイベントのログ情報 を参照してください。
注釈
イベントテーブルの timestamp 列は、値をUTCで格納します。タイムスタンプフィルターでスケジュールされたアラートを使用する場合(例: timestamp > DATEADD('minute', -5, CURRENT_TIMESTAMP()) )、正確な比較を行うために現在のタイムスタンプをUTCに変換します。
例えば、次のステートメントは、データベース my_db 内の動的テーブルのリフレッシュに失敗した場合にアクションを実行する新しいデータに対するアラートを作成します。例では次を前提としています。
アクティブなイベントテーブルが デフォルトのイベントテーブル (SNOWFLAKE.TELEMETRY.EVENTS)になる。
そのSlackチャンネルに対して Webhook通知統合をセット している。
動的テーブルイベントのログ情報¶
動的テーブルが更新されると、イベントがイベント・テーブルにログ記録されます。以下のセクションでは、イベントを表すイベント・テーブル行について説明します。
イベントテーブル列値¶
動的テーブルが更新されると、以下の値を持つ行がイベント・テーブルに挿入されます。
注釈
列が以下にリストされていない場合、その列の値はイベントに対して NULL です。
列 |
データ型 |
説明 |
|---|---|---|
|
TIMESTAMP_NTZ |
イベント作成時の UTC タイムスタンプ。 |
|
TIMESTAMP_NTZ |
ログに使用される時間は UTC です。現在、これは |
|
OBJECT |
|
|
STRING |
イベントタイプ、 |
|
OBJECT |
|
|
VARIANT |
resource_attributes 列のキー値・ペア¶
resource_attributes 列には、以下のキー値ペアを持つ OBJECT 値が含まれます。
属性名 |
属性タイプ |
説明 |
例 |
|---|---|---|---|
|
INTEGER |
動的テーブルを含むデータベースの内部/システム生成識別子。 |
|
|
VARCHAR |
動的テーブルを含むデータベース名。 |
|
|
INTEGER |
リフレッシュされた動的テーブルの内部/システム生成識別子。 |
|
|
VARCHAR |
リフレッシュされた動的テーブルの名前。 |
|
|
VARCHAR |
オブジェクトのタイプ。動的テーブル・イベントの値は |
|
|
INTEGER |
動的テーブルで OWNERSHIP 権限を持つロールの内部/システム生成識別子。 |
|
|
VARCHAR |
動的テーブルの OWNERSHIP 権限を持つロールの名前。 |
|
|
VARCHAR |
オブジェクトを所有するロールのタイプ。例えば |
|
|
VARCHAR |
動的テーブルを更新したクエリの ID |
|
|
INTEGER |
動的テーブルを含むスキーマの内部/システム生成識別子。 |
|
|
VARCHAR |
動的テーブルを含むスキーマの名前。 |
|
|
INTEGER |
動的テーブルの更新に使用されるウェアハウスの内部/システム生成識別子。 |
|
|
VARCHAR |
動的テーブルのリフレッシュに使用されるウェアハウスの名前。 |
|
record 列のキー値・ペア¶
record 列には、以下のキー値ペアを持つ OBJECT 値が含まれます。
キー |
型 |
説明 |
例 |
|---|---|---|---|
|
VARCHAR |
イベントの名前。動的テーブルリフレッシュに対して、値は |
|
|
VARCHAR |
イベントの重大度レベル(以下の値のいずれか)。
|
|
value 列のキー値・ペア¶
value 列には、以下のキー値ペアを持つ VARIANT 値が含まれます。
キー |
型 |
説明 |
例 |
|---|---|---|---|
|
VARCHAR |
リフレッシュの状態。以下の値のいずれかになります。
|
|
|
VARCHAR |
|
|
リフレッシュをトレースするためにパイプラインスパンをクエリする¶
:ref:` イベント <label-dynamic_tables_monitoring_sql_events>` に加えて、Snowflakeは動的テーブルリフレッシュのパイプラインスパンを記録できます。イベントとスパンは、2つの別々の可観測性メカニズムです。
イベント ( LOG_LEVEL によって制御される)は、動的テーブルのリフレッシュごとにログを提供し、各リフレッシュが成功したか失敗したかを示します。
スパン ( TRACE_LEVEL によって制御される)は、パイプライン全体の相関トレース IDs 、スキップの理由、および依存関係のトポロジーを含む、より豊富なパイプラインレベルの観測可能性を提供します、
スパンは、動的テーブルとそのコンシューマーのラグを最小限に抑えるために、スケジューラがリフレッシュをスキップした上流のスキップやリフレッシュサイクルによる SKIPPED リフレッシュを含む、イベントが出力されない追加の状態をキャプチャします。
注釈
動的テーブルのスパンを記録すると、コストが発生します。テレメトリーデータ収集の費用 をご参照ください。
パイプラインのスパンを有効にする¶
動的テーブルのリフレッシュのためにパイプラインスパンを有効にするには、 TRACE_LEVEL パラメーターを ALWAYS データベースまたはスキーマレベルで設定します。
また、データベースレベルでこれを設定すると、データベース内のすべての動的テーブルのスパンをキャプチャすることもできます。
スパンデータをクエリする¶
動的テーブルリフレッシュのパイプラインスパンをクエリするには、record_type = 'SPAN' および record:"name" = 'table_refresh' の場合の行に対してフィルターします。
スパン属性( record_attributes )¶
各スパン行には、動的テーブルリフレッシュに固有の record_attributes 列内の次の属性が含まれます。
属性名 |
型 |
説明 |
|---|---|---|
|
STRING |
リフレッシュの状態: |
|
STRING |
動的テーブルがスキップまたは失敗した理由。成功での NULL 。可能な値:
|
|
STRING |
リフレッシュが評価されたときのトランザクションのタイムスタンプ。(実際のリフレッシュの時間より少し前になる可能性があります。このタイムスタンプより前に到着したベースオブジェクト内のすべてのデータが動的テーブルに含まれています。 |
注釈
どのイベントが出力されないかについて、スパンは SKIPPED 状態( UPSTREAM_SKIP および NOT_EFFECTIVE_TICK_TO_REFRESH 理由付き)をカバーします。リフレッシュのスキップを可視化する必要がある場合は、イベントの代わりにスパンを使用します。
トレース IDs およびスパンリンクとパイプラインの相関¶
スパンのユニークな機能は、パイプラインレベルの相関です。リフレッシュサイクルに複数の動的テーブルのリフレッシュ操作が含まれる場合、結果として得られるすべてのスパンは同じ trace:"trace_id" を共有します。これにより、単一のリフレッシュサイクルで発生したリフレッシュ操作のフルセットを再構築することができます。
各スパンには、各上流依存関係の span_id をリストする record:"links" 配列も含まれます。たとえば、 DT_B が DT_A に依存する場合、 DT_B の record:"links" に DT_A の span_id が表示されます。
record:"status":"code" フィールドは、成功とスキップの場合は STATUS_CODE_OK 、および失敗の場合は STATUS_CODE_ERROR です。
たとえば、1回のリフレッシュサイクルですべての動的テーブルリフレッシュ操作を相関させるには、同じ trace_id のスパンに対してクエリを実行します。
パイプラインのリフレッシュをトレースする¶
このセクションでは、パイプラインスパンを使用してリフレッシュサイクルをエンドツーエンドでトレースする方法について説明します。関連するスパンを見つけ、完全なパイプラインを取得し、失敗またはスキップを診断します。
パイプラインシナリオの例¶
4つの動的テーブルの線形パイプラインを考えてみましょう。
この例では DT1 および DT2 は正常にリフレッシュされますが、 DT3 はクエリエラーにより失敗します。DT3 は失敗したため、 DT4 は UPSTREAM_FAILURE の理由で自動的にスキップされます。
次のステップは、このシナリオでパイプラインスパンを取得して解釈する方法を示しています。
ステップ1: 動的テーブルのスパンを見つける¶
特定の動的テーブルのリフレッシュを調査するには、その最新のスパンのイベントテーブルをクエリします。データベース、スキーマ、および動的テーブル名でフィルターして、正しいオブジェクトに一致するようにします。
trace_id 値はリフレッシュサイクルを識別します。単一のパイプライン内のすべての動的テーブルスパンは、同じ trace_id を共有します。次のステップでこの値を使用して、同じリフレッシュサイクルからすべてのスパンを取得します。
ステップ2:フルパイプラインを取得する¶
同じ trace_id を共有するすべてのスパンのクエリを実行して、リフレッシュサイクルのすべての動的テーブルを表示します。record:"links" 含めて依存関係グラフおよび DATEDIFF をキャプチャし、各リフレッシュ操作の時間を計算します。
この結果から、リフレッシュサイクルの全体像を見ることができます。
DT1およびDT2に成功しました(それぞれ30秒と29秒)。クエリの失敗により、19秒後に
DT3に失敗しました。DT4は、上流の依存関係が失敗したため、すぐにスキップされました(期間ゼロスパンで表されました)。UPSTREAM_LINKS列は、span_idによって各動的テーブルの直接依存関係を表示します。
ステップ3:失敗またはスキップの根本的な原因を特定する¶
動的テーブルがスキップされたり失敗したりした場合は、スパンリンクを介して上流の依存関係をトレースし、根本的な原因を見つけることができます。このクエリは、特定の動的テーブルのスパンリンクをパイプライン内の他のスパンに解決します。
この例では DT4 は、 QUERY_FAILURE で失敗した上流の依存関係 DT3 のためにスキップされました。query_id を使用して失敗したクエリをさらに調査することができます(例: GET_QUERY_OPERATOR_STATS を呼び出す、または :doc:` クエリ履歴 </sql-reference/account-usage/query_history>` をチェックする)。
より長い依存関係のチェーンの場合は、同じパターンを繰り返します。ターゲットの動的テーブル名を置き換えて、根本的な原因である state = 'FAILED' および state_reason = 'QUERY_FAILURE' のあるスパンに達するまで上流に移動します。
失敗の下流影響を検索する¶
どの動的テーブルが特定の失敗の影響を受けたかを特定するには、スパンリンクの検索を逆にします。このクエリは、record:"links" が失敗した動的テーブルの span_id を参照するすべての動的テーブルを検索します。
これは失敗した動的テーブルの直接の依存関係を返します。一時的に影響を受けるすべての動的テーブルを見つけるには、各依存関係の span_id でクエリを繰り返し、さらに下流に移動します。
OpenTelemetry 互換ツールを使用する¶
動的テーブルパイプラインのスパンは、標準 OpenTelemetry データモデルに従います。リフレッシュサイクルのすべてのスパンは同じ trace:"trace_id" を共有するため、それらをイベントテーブルから可視化のための OpenTelemetry 互換ツールにエクスポートできます。
これらのツールはパイプラインをトレースタイムラインとしてレンダリングし、各動的テーブルのリフレッシュ操作の期間とステータス、およびスパンリンクにエンコードされた依存関係を表示します。