Snowflakeのデータに基づくアラートの設定

このトピックでは、Snowflake内のデータに基づいて、特定の条件下で定期的にアクションを実行するアラートを設定する方法について説明します。

概要

場合によっては、Snowflakeのデータが特定の条件を満たしたときに、通知を受信するか、アクションを実行することができます。たとえば、次の場合に通知を受信できるようにします。

  • ウェアハウスのクレジット使用状況が、現在のクォータの指定された割合だけ増加したとき。

  • パイプライン、タスク、マテリアライズドビューなどのリソース消費が、指定された量を超えて増加したとき。

  • データが、設定した特定のビジネスルールに準拠していないとき。

これを実行するには、Snowflakeアラートを設定できます。Snowflakeアラートは、以下を指定するスキーマレベルのオブジェクトです。

  • アラートをトリガーする条件(例: 完了するまでに1秒以上かかるクエリの存在)。

  • 条件が満たされたときに実行するアクション(例: メール通知を送信する、テーブル内のデータをキャプチャする、など)。

  • 条件を評価する時期と頻度(例: 24時間ごと、毎週日曜日の深夜、など)。

たとえば、クレジット消費がウェアハウスの特定の制限を超えたときにメール通知を送信するとします。これを30分ごとにチェックするとします。次のプロパティを使用してアラートを作成できます。

  • 条件: ウェアハウス(ACCOUNT_USAGE にある WAREHOUSE_METERING_HISTORY ビューの credits_used 列の合計)スキーマのクレジット消費量が、指定された制限を超えている。

  • アクション: 管理者にメールを送信する。

  • 頻度/スケジュール: 30分ごとにこの条件をチェックする。

アラートを作成する権限の付与

アラートを作成するには、次の権限を持つロールを使用する必要があります。

  • アカウントに対する EXECUTE ALERT 権限。

    注釈

    この権限は、 ACCOUNTADMIN ロールを持つユーザーのみが付与できます。

  • アラートを作成するスキーマに対する USAGE および CREATE ALERT 権限。

  • スキーマを含むデータベースに対する USAGE 権限。

  • アラートの実行に使用されるウェアハウスに対する USAGE 権限。

これらの権限をロールに付与するには、 GRANT <権限> コマンドを使用します。

たとえば、 my_schema という名前のスキーマでアラートを作成する権限を持つ、 my_alert_role という名前のカスタムロールを作成するとします。アラートでウェアハウス my_warehouse を使用するとします。

これを実行するには、

  1. ACCOUNTADMIN ロールを持つユーザーに、次を実行してもらいます。

    1. カスタムロールを作成します

      例:

      USE ROLE ACCOUNTADMIN;
      
      CREATE ROLE my_alert_role;
      
      Copy
    2. そのカスタムロールに EXECUTE ALERT グローバル権限を付与します。

      例:

      GRANT EXECUTE ALERT ON ACCOUNT TO ROLE my_alert_role;
      
      Copy
    3. ユーザーにカスタムロールを付与します。

      例:

      GRANT ROLE my_alert_role TO USER my_user;
      
      Copy
  2. データベース、スキーマ、およびウェアハウスの所有者により、アラートの作成に必要な権限をカスタムロールに付与してもらいます。

    • スキーマの所有者は、スキーマに対する CREATE ALERT および USAGE 権限を付与する必要があります。

      GRANT CREATE ALERT ON SCHEMA my_schema TO ROLE my_alert_role;
      GRANT USAGE ON SCHEMA my_schema TO ROLE my_alert_role;
      
      Copy
    • データベースの所有者は、データベースに対する USAGE 権限を付与する必要があります。

      GRANT USAGE ON DATABASE my_database TO ROLE my_alert_role;
      
      Copy
    • ウェアハウスの所有者は、ウェアハウスに対する USAGE 権限を付与する必要があります。

      GRANT USAGE ON WAREHOUSE my_warehouse TO ROLE my_alert_role;
      
      Copy

アラートの作成

gauge という名前のテーブルにある1つ以上の行の gauge_value 列に200を超える値がある場合には常に、現在のタイムスタンプを gauge_value_exceeded_history という名前のテーブルに挿入するとします。

次のアラートを作成できます。

  • gauge_value が200を超える条件を評価する。

  • この条件がtrueと評価された場合は、タイムスタンプを gauge_value_exceeded_history に挿入する。

これを実行する my_alert という名前のアラートを作成するには、

  1. アラートを作成する権限 を持つロールを使用していることを確認してください。

    そのロールを使用していない場合は、 USE ROLE コマンドを実行してそのロールを使用します。

  2. アラートを作成する予定のデータベースとスキーマを使用していることを確認します。

    そのデータベースとスキーマを使用していない場合は、 USE DATABASE および USE SCHEMA コマンドを実行して、そのデータベースとスキーマを使用します。

  3. CREATE ALERT コマンドを実行して、アラートを作成します。

    CREATE OR REPLACE ALERT my_alert
      WAREHOUSE = mywarehouse
      SCHEDULE = '1 minute'
      IF( EXISTS(
        SELECT gauge_value FROM gauge WHERE gauge_value>200))
      THEN
        INSERT INTO gauge_value_exceeded_history VALUES (current_timestamp());
    
    Copy

    CREATE ALERT コマンドの包括的な説明については、 CREATE ALERT をご参照ください。

    注釈

    アラートを作成すると、アラートはデフォルトで中断されます。アラートを実行するには、新しく作成したアラートを再開する必要があります。

  4. ALTER ALERT ... RESUME コマンドを実行してアラートを再開します。例:

    ALTER ALERT my_alert RESUME;
    
    Copy

アラートスケジュールに基づくタイムスタンプの指定

場合によっては、アラートスケジュールに基づいて条件またはアクションを定義する必要があります。

たとえば、テーブルに行が追加された時刻を表すタイムスタンプ列があり、正常に評価された最後のアラートと現在スケジュールされているアラートの間に新しい行が追加された場合にアラートを送信するとします。つまり、以下を評価します。

<now> - <last_execution_of_the_alert>
Copy

CURRENT_TIMESTAMP とアラートのスケジュールされた時刻を使用してこの時間範囲を計算する場合、計算された範囲には、アラートがスケジュールされた時刻とアラート条件が実際に評価される時刻との間の待ち時間が考慮されません。

代わりに、現在のスケジュールアラートと正常に評価された最後のアラートのタイムスタンプが必要な場合は、次の関数を使用します。

  • SCHEDULED_TIME は、現在のアラートがいつスケジュールされたかを表すタイムスタンプを返します。

  • LAST_SUCCESSFUL_SCHEDULED_TIME は、最後に正常に評価されたアラートがスケジュールされた時刻を表すタイムスタンプを返します。

これらの関数は、 SNOWFLAKE.ALERT スキーマ で定義されています。これらの関数を呼び出すには、 SNOWFLAKE.ALERT_VIEWER データベースロール が付与されたロールを使用する必要があります。このロールを別のロールに付与するには、 GRANT DATABASE ROLE コマンドを使用します。たとえば、このロールをカスタムロール alert_role に付与するには、次を実行します。

GRANT DATABASE ROLE SNOWFLAKE.ALERT_VIEWER TO ROLE alert_role;
Copy

次の例では、正常に評価されたアラートが最後にスケジュールされてから現在のアラートがスケジュールされているまでの間に新しい行が my_table に追加された場合に、メールメッセージを送信します。

CREATE OR REPLACE ALERT alert_new_rows
  WAREHOUSE = my_warehouse
  SCHEDULE = '1 MINUTE'
  IF (EXISTS (
      SELECT *
      FROM my_table
      WHERE row_timestamp BETWEEN SNOWFLAKE.ALERT.LAST_SUCCESSFUL_SCHEDULED_TIME()
       AND SNOWFLAKE.ALERT.SCHEDULED_TIME()
  ))
  THEN CALL SYSTEM$SEND_EMAIL(...);
Copy

アラートアクションの条件に対する SQL ステートメントの結果のチェック

アラートのアクションの中で、 SQL ステートメントの結果をチェックする必要がある場合:

  1. GET_CONDITION_QUERY_UUID 関数を呼び出して、 SQL ステートメントの条件に対するクエリ ID を取得します。

  2. クエリ ID を RESULT_SCAN 関数に渡して、 SQL ステートメントの実行結果を取得します。

例:

CREATE ALERT my_alert
  WAREHOUSE = my_warehouse
  SCHEDULE = '1 MINUTE'
  IF (EXISTS (
    SELECT * FROM my_source_table))
  THEN
    BEGIN
      LET condition_result_set RESULTSET :=
        (SELECT * FROM TABLE(RESULT_SCAN(SNOWFLAKE.ALERT.GET_CONDITION_QUERY_UUID())));
      ...
    END;
Copy

手動によるアラートの実行

場合によっては、手動でアラートを実行する必要があります。例:

  • 新しいアラートを作成する場合、アラートが期待通りに機能するかどうかを確認することをお勧めします。

  • データパイプラインの特定のポイントでアラートを実行したい場合があります。たとえば、ストアドプロシージャの呼び出しの最後にアラートを実行したい場合です。

アラートを手動で実行するには、 EXECUTE ALERT コマンドを実行します。

EXECUTE ALERT my_alert;
Copy

EXECUTE ALERT コマンドは、アラート用に定義されたスケジュールとは無関係に、アラートの単一実行を手動でトリガーします。

このコマンドはインタラクティブに実行できます。このコマンドは、ストアドプロシージャまたはSnowflakeスクリプトブロック内から実行することもできます。

このコマンドを実行するために必要な権限と、中断、実行中、およびスケジュールされたアラートに対するこのコマンドの効果の詳細については、 EXECUTE ALERT を参照してください。

アラートの中断と再開

アラートが一時的に実行されないようにする必要がある場合は、 ALTER ALERT ... SUSPEND コマンドを実行してアラートを中断できます。例:

ALTER ALERT my_alert SUSPEND;
Copy

中断したのアラートを再開するには、 ALTER ALERT ... RESUME コマンドを実行します。例:

ALTER ALERT my_alert RESUME;
Copy

注釈

アラートの所有者でない場合、アラートを中断または再開するには、アラートの OPERATE 権限が必要です。

アラートの変更

アラートのプロパティを変更するには、 ALTER ALERT コマンドを実行します。例:

  • my_alert という名前のアラートのウェアハウスを my_other_warehouse に変更するには、次のコマンドを実行します。

    ALTER ALERT my_alert SET WAREHOUSE = my_other_warehouse;
    
    Copy
  • my_alert という名前のアラートが2分ごとに評価されるようにスケジュールを変更するには、次のコマンドを実行します。

    ALTER ALERT my_alert SET SCHEDULE = '2 minutes';
    
    Copy
  • my_alert という名前のアラートの条件を変更して、 gauge という名前のテーブルにある行の gauge_value 列に 300 より大きい値がある場合にアラートを受け取るようにするには、次のコマンドを実行します。

    ALTER ALERT my_alert MODIFY CONDITION EXISTS (SELECT gauge_value FROM gauge WHERE gauge_value>300);
    
    Copy
  • my_alert という名前のアラートのアクションを CALL my_procedure() に変更するには、次のコマンドを実行します。

    ALTER ALERT my_alert MODIFY ACTION CALL my_procedure();
    
    Copy

注釈

アラートのプロパティを変更するには、アラートの所有者である必要があります。

アラートのドロップ

アラートをドロップするには、 DROP ALERT コマンドを実行します。例:

DROP ALERT my_alert;
Copy

アラートが存在しない場合にエラーを出さずにアラートをドロップするには、次のように実行します。

DROP ALERT IF EXISTS my_alert;
Copy

注釈

アラートをドロップするには、アラートの所有者である必要があります。

アラートに関する詳細の表示

アカウント、データベース、またはスキーマで作成されたアラートをリストするには、 SHOW ALERTS コマンドを実行します。たとえば、現在のスキーマで作成されたアラートをリストするには、次のコマンドを実行します。

SHOW ALERTS;
Copy

このコマンドは、自分が所有するアラートと、 MONITOR または OPERATE 権限を持つアラートをリストします。

特定のアラートに関する詳細を表示するには、 DESCRIBE ALERT コマンドを実行します。例:

DESC ALERT my_alert;
Copy

注釈

アラートの所有者でない場合、アラートの詳細を表示するには、アラートの MONITOR または OPERATE 権限が必要です。

アラートの実行のモニター

アラートの実行をモニターするには、次を実行します。

  • アラートに対して指定されたアクションの結果を確認します。たとえば、アクションによってテーブルに行が挿入された場合は、テーブルに新しい行があるかどうかを確認できます。

  • 次のいずれかを使用して、アラート実行の履歴を表示します。

    • INFORMATION_SCHEMA スキーマの ALERT_HISTORY テーブル関数をクエリします。

      たとえば、過去1時間のアラートの実行を表示するには、次のステートメントを実行します。

      SELECT *
      FROM
        TABLE(INFORMATION_SCHEMA.ALERT_HISTORY(
          SCHEDULED_TIME_RANGE_START
            =>dateadd('hour',-1,current_timestamp())))
      ORDER BY SCHEDULED_TIME DESC;
      
      Copy
    • 共有 SNOWFLAKE データベースにある ACCOUNT_USAGE スキーマの ALERT_HISTORY ビューをクエリします。

クエリ履歴では、クエリを実行したユーザーの名前は SYSTEM になります。(アラートは システムサービス によって実行されます。)