Einrichten von Alerts auf Grundlage von Daten in Snowflake

Unter diesem Thema wird erklärt, wie Sie einen Alert einrichten, der auf Basis der Daten in Snowflake unter bestimmten Bedingungen regelmäßig eine Aktion ausführt.

Einführung

In Fällen, in denen Daten in Snowflake bestimmte Bedingungen erfüllen, möchten Sie möglicherweise benachrichtigt werden oder Maßnahmen ergreifen. Sie könnten beispielweise in folgenden Fällen eine Benachrichtigung erhalten:

  • Die Credit-Nutzung eines Warehouses erhöht sich um einen angegebenen Prozentsatz Ihres aktuellen Kontingents.

  • Der Ressourcenverbrauch Ihrer Pipelines, Aufgaben, materialisierten Ansichten usw. übersteigt einen bestimmten Wert.

  • Ihre Daten entsprechen nicht einer bestimmten, von Ihnen eingerichteten Geschäftsregel.

Zu diesem Zweck können Sie einen Snowflake Alert einrichten. Ein Snowflake Alert ist ein Objekt auf Schemaebene, das Folgendes angibt:

  • Eine Bedingung, die den Alert auslöst (z. B. das Vorhandensein von Abfragen, die länger als eine Sekunde dauern, bis sie abgeschlossen sind).

  • Die Aktion, die ausgeführt werden soll, wenn die Bedingung erfüllt ist (z. B. Senden einer E-Mail-Benachrichtigung, Erfassen einiger Daten in einer Tabelle usw.).

  • Wann und wie oft die Bedingung ausgewertet werden soll (z. B. alle 24 Stunden, jeden Sonntag um Mitternacht usw.).

Angenommen, Sie möchten eine E-Mail-Benachrichtigung senden, wenn der Credit-Verbrauch eines Warehouses ein bestimmtes Limit überschreitet. Angenommen, Sie möchten dies alle 30 Minuten überprüfen. Sie können einen Alert mit den folgenden Eigenschaften erstellen:

  • Bedingung: Der Credit-Verbrauch für ein Warehouse (die Summe der Spalte credits_used in der Ansicht WAREHOUSE_METERING_HISTORY des Schemas ACCOUNT_USAGE) überschreitet einen bestimmten Grenzwert.

  • Aktion: E-Mail an den Administrator senden.

  • Häufigkeit/Zeitplan: Alle 30 Minuten diese Bedingung prüfen.

Erteilen von Berechtigungen zum Erstellen von Alerts

Zum Erstellen eines Alerts benötigen Sie eine Rolle, die über die folgenden Berechtigungen verfügt:

  • Die Berechtigung EXECUTE ALERT für das Konto.

    Bemerkung

    Diese Berechtigung kann nur von einem Benutzer mit der Rolle ACCOUNTADMIN erteilt werden.

  • Die Berechtigungen USAGE und CREATE ALERT für das Schema, in dem der Alert erstellt werden soll.

  • Die Berechtigung USAGE für die Datenbank, in der sich das Schema befindet.

  • Die Berechtigung USAGE für das Warehouse, das zum Ausführen des Alerts verwendet wird.

Um diese Berechtigungen einer Rolle zuzuweisen, verwenden Sie den Befehl GRANT <Berechtigungen>.

Angenommen, Sie möchten eine kundenspezifische Rolle mit dem Namen my_alert_role erstellen, die über die Berechtigung verfügt, einen Alert im Schema my_schema zu erstellen. Sie möchten, dass der Alert das Warehouse my_warehouse verwendet.

Gehen Sie dabei wie folgt vor:

  1. Ein Benutzer mit der Rolle ACCOUNTADMIN führt Folgendes aus:

    1. Kundenspezifische Rolle erstellen

      Beispiel:

      USE ROLE ACCOUNTADMIN;
      
      CREATE ROLE my_alert_role;
      
      Copy
    2. Kundenspezifischer Rolle die globale Berechtigung EXECUTE ALERT zuweisen

      Beispiel:

      GRANT EXECUTE ALERT ON ACCOUNT TO ROLE my_alert_role;
      
      Copy
    3. Kundenspezifische Rolle einem Benutzer zuweisen

      Beispiel:

      GRANT ROLE my_alert_role TO USER my_user;
      
      Copy
  2. Die Eigentümer von Datenbank, Schemas und Warehouses erteilen der kundenspezifischen Rolle die für das Erstellen des Alerts erforderlichen Berechtigungen:

    • Der Eigentümer des Schemas muss die Berechtigungen CREATE ALERT und USAGE für das Schema erteilen:

      GRANT CREATE ALERT ON SCHEMA my_schema TO ROLE my_alert_role;
      GRANT USAGE ON SCHEMA my_schema TO ROLE my_alert_role;
      
      Copy
    • Der Eigentümer der Datenbank muss die Berechtigung USAGE für die Datenbank erteilen:

      GRANT USAGE ON DATABASE my_database TO ROLE my_alert_role;
      
      Copy
    • Der Eigentümer des Warehouses muss die Berechtigung USAGE für das Warehouse erteilen:

      GRANT USAGE ON WAREHOUSE my_warehouse TO ROLE my_alert_role;
      
      Copy

Erstellen eines Alerts

Angenommen, dass immer dann, wenn in einer oder mehreren Zeilen einer Tabelle gauge der Wert in der Spalte gauge_value 200 überschreitet, der aktuelle Zeitstempel in eine Tabelle mit dem Namen gauge_value_exceeded_history eingefügt werden soll.

Sie können einen Alert mit folgenden Merkmalen erstellen:

  • Wertet die Bedingung aus, dass gauge_value größer als 200 ist.

  • Fügt den Zeitstempel in gauge_value_exceeded_history ein, wenn die Auswertung der Bedingung „wahr“ ergibt.

Um einen Alert mit dem Namen my_alert zu erstellen, gehen Sie wie folgt vor:

  1. Überprüfen Sie, ob Sie eine Rolle verwenden, die die Berechtigungen zum Erstellen eines Alerts hat.

    Wenn Sie diese Rolle nicht verwenden, führen Sie den Befehl USE ROLE aus, um diese Rolle zu verwenden.

  2. Überprüfen Sie, ob Sie die Datenbank und das Schema verwenden, in dem der Alert erstellt werden soll.

    Wenn Sie diese Datenbank und dieses Schema nicht verwenden, führen Sie die Befehle USE DATABASE und USE SCHEMA aus, um diese Datenbank und dieses Schema zu verwenden.

  3. Führen Sie den Befehl CREATE ALERT aus, um den Alert zu erstellen:

    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

    Eine vollständige Beschreibung des Befehls CREATE ALERT finden Sie unter CREATE ALERT.

    Bemerkung

    Wenn Sie einen Alert erstellen, wird dieser standardmäßig auf „Unterbrochen“ gesetzt. Sie müssen den neu erstellten Alert fortsetzen, damit der Alert ausgeführt werden kann.

  4. Aktivieren Sie den Alert, indem Sie den Befehl ALTER ALERT … RESUME ausführen. Beispiel:

    ALTER ALERT my_alert RESUME;
    
    Copy

Angeben von Zeitstempeln auf Grundlage von Alert-Zeitplänen

In einigen Fällen müssen Sie eine Bedingung oder eine Aktion definieren, die auf dem Alert-Zeitplan basiert.

Angenommen, eine Tabelle hat eine Zeitstempelspalte, die angibt, wann eine Zeile hinzugefügt wurde, und Sie möchten einen Alert senden, wenn zwischen dem letzten erfolgreich ausgewerteten Alert und dem aktuell geplanten Alert neue Zeilen hinzugefügt wurden. Mit anderen Worten, Sie möchten Folgendes auswerten:

<now> - <last_execution_of_the_alert>
Copy

Wenn Sie CURRENT_TIMESTAMP und die geplante Zeit des Alerts verwenden, um diesen Zeitbereich zu berechnen, berücksichtigt der berechnete Bereich nicht die Latenz zwischen dem Zeitpunkt, an dem der Alert geplant ist, und dem Zeitpunkt, an dem die Alert-Bedingung tatsächlich ausgewertet wird.

Wenn Sie stattdessen die Zeitstempel des aktuellen Zeitplan-Alerts und des letzten erfolgreich ausgewerteten Alerts benötigen, verwenden Sie die folgenden Funktionen:

  • SCHEDULED_TIME gibt den Zeitstempel zurück, der angibt, wann der aktuelle Alert geplant wurde.

  • LAST_SUCCESSFUL_SCHEDULED_TIME gibt den Zeitstempel zurück, der angibt, wann der letzte erfolgreich ausgewertete Alert geplant wurde.

Diese Funktionen sind im Schema SNOWFLAKE.ALERT definiert. Um diese Funktionen aufzurufen, müssen Sie eine Rolle verwenden, der die Datenbankrolle SNOWFLAKE.ALERT_VIEWER zugewiesen wurde. Um diese Rolle einer anderen Rolle zuzuweisen, verwenden Sie den Befehl GRANT DATABASE ROLE. Um diese Rolle beispielsweise der kundenspezifische Rolle alert_role zuzuweisen, führen Sie Folgendes aus:

GRANT DATABASE ROLE SNOWFLAKE.ALERT_VIEWER TO ROLE alert_role;
Copy

Im folgenden Beispiel wird eine E-Mail-Meldung gesendet, wenn zwischen dem Zeitpunkt, an dem der letzte erfolgreich ausgewertete Alert geplant wurde, und dem Zeitpunkt, an dem der aktuelle Alert geplant wurde, neue Zeilen zu my_table hinzugefügt wurden:

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

Prüfen der Ergebnisse der SQL-Anweisung für die Bedingung in der Alert-Aktion

Innerhalb der Aktion eines Alerts, wenn Sie die Ergebnisse der SQL-Anweisung auf die Bedingung prüfen müssen:

  1. Rufen Sie die Funktion GET_CONDITION_QUERY_UUID auf, um die Abfrage-ID der SQL-Anweisung für die Bedingung zu erhalten.

  2. Übergeben Sie die Abfrage-ID an die Funktion RESULT_SCAN, um die Ergebnisse der Ausführung dieser SQL-Anweisung zu erhalten.

Beispiel:

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

Manuelles Ausführen von Alerts

In einigen Fällen müssen Sie einen Alert manuell ausführen. Beispiel:

  • Wenn Sie einen neuen Alert erstellen, möchten Sie vielleicht überprüfen, ob der Alert so funktioniert, wie Sie es erwarten.

  • Vielleicht möchten Sie den Alert an einem bestimmten Punkt in Ihrer Datenpipeline ausführen. Zum Beispiel könnten Sie den Alert am Ende eines Aufrufs einer gespeicherten Prozedur ausführen wollen.

Um einen Alert manuell auszuführen, führen Sie den Befehl EXECUTE ALERT aus:

EXECUTE ALERT my_alert;
Copy

Der Befehl EXECUTE ALERT löst manuell eine einzelne Ausführung eines Alerts aus, unabhängig von dem für den Alert definierten Zeitplan.

Sie können diesen Befehl interaktiv ausführen. Sie können diesen Befehl auch innerhalb einer gespeicherten Prozedur oder eines Snowflake Scripting-Blocks ausführen.

Weitere Informationen zu den Berechtigungen, die zur Ausführung dieses Befehls erforderlich sind, und zu den Auswirkungen dieses Befehls auf angehaltene, aktive und geplante Alerts finden Sie unter EXECUTE ALERT.

Unterbrechen und Fortsetzen eines Alerts

Wenn Sie verhindern möchten, dass ein Alert vorübergehend ausgeführt wird, können Sie den Alert durch Ausführen des Befehls ALTER ALERT … SUSPEND unterbrechen. Beispiel:

ALTER ALERT my_alert SUSPEND;
Copy

Um einen unterbrochenen Alert fortzusetzen, führen Sie den Befehl ALTER ALERT … RESUME aus. Beispiel:

ALTER ALERT my_alert RESUME;
Copy

Bemerkung

Wenn Sie nicht der Eigentümer des Alerts sind, müssen Sie über die Berechtigung OPERATE für den Alert verfügen, um den Alert zu unterbrechen oder fortzusetzen.

Ändern eines Alerts

Um die Eigenschaften eines Alerts zu ändern, führen Sie den Befehl ALTER ALERT aus. Beispiel:

  • Um das Warehouse für den Alert my_alert in my_other_warehouse zu ändern, führen Sie Folgendes aus:

    ALTER ALERT my_alert SET WAREHOUSE = my_other_warehouse;
    
    Copy
  • Um den Zeitplan für den Alert my_alert so zu ändern, dass er alle 2 Minuten ausgewertet wird, führen Sie Folgendes aus:

    ALTER ALERT my_alert SET SCHEDULE = '2 minutes';
    
    Copy
  • Um die Bedingung für den Alert my_alert so zu ändern, dass Sie gewarnt werden, wenn in der Tabelle gauge Zeilen der Spalte gauge_value Werte aufweisen, die größer als 300 sind, führen Sie Folgendes aus:

    ALTER ALERT my_alert MODIFY CONDITION EXISTS (SELECT gauge_value FROM gauge WHERE gauge_value>300);
    
    Copy
  • Um die Aktion für den Alert mit dem Namen my_alert in CALL my_procedure() zu ändern, führen Sie Folgendes aus:

    ALTER ALERT my_alert MODIFY ACTION CALL my_procedure();
    
    Copy

Bemerkung

Sie müssen der Eigentümer des Alerts sein, um die Eigenschaften des Alerts ändern zu können.

Löschen eines Alerts

Um einen Alert zu löschen, führen Sie den Befehl DROP ALERT aus. Beispiel:

DROP ALERT my_alert;
Copy

Um eine Meldung zu löschen, ohne einen Fehler zu erzeugen, wenn der Alert nicht existiert, führen Sie aus:

DROP ALERT IF EXISTS my_alert;
Copy

Bemerkung

Sie müssen der Eigentümer des Alerts sein, um die den Alert löschen zu können.

Anzeigen von Details zu einem Alert

Um die Alerts aufzulisten, die in einem Konto, einer Datenbank oder einem Schema erstellt wurden, führen Sie den Befehl SHOW ALERTS aus. Um beispielsweise die Alerts aufzulisten, die im aktuellen Schema erstellt wurden, führen Sie den folgenden Befehl aus:

SHOW ALERTS;
Copy

Dieser Befehl listet die Alerts auf, deren Eigentümer Sie sind, und die Alerts, für die Sie die Berechtigung MONITOR oder OPERATE haben.

Um Details zu einem bestimmten Alert anzuzeigen, führen Sie den Befehl DESCRIBE ALERT aus. Beispiel:

DESC ALERT my_alert;
Copy

Bemerkung

Wenn Sie nicht der Eigentümer des Alerts sind, müssen Sie die Berechtigung MONITOR oder OPERATE für den Alert haben, um die Details des Alerts anzeigen zu können.

Überwachen der Ausführung von Alerts

Um die Ausführung der Alerts zu überwachen, können Sie Folgendes tun:

  • Überprüfen Sie die Ergebnisse der Aktion, die für den Alert angegeben wurde. Wenn durch die Aktion beispielsweise Zeilen in eine Tabelle eingefügt werden sollten, können Sie die Tabelle auf neue Zeilen überprüfen.

  • Zeigen Sie den Verlauf der Alert-Ausführungen an, indem Sie eine der folgenden Optionen verwenden:

    • Die Tabellenfunktion ALERT_HISTORY im Schema INFORMATION_SCHEMA.

      Um beispielsweise die Ausführungen von Alerts in der letzten Stunde anzuzeigen, führen Sie die folgende Anweisung aus:

      SELECT *
      FROM
        TABLE(INFORMATION_SCHEMA.ALERT_HISTORY(
          SCHEDULED_TIME_RANGE_START
            =>dateadd('hour',-1,current_timestamp())))
      ORDER BY SCHEDULED_TIME DESC;
      
      Copy
    • Die Ansicht ALERT_HISTORY im Schema ACCOUNT_USAGE der freigegebenen SNOWFLAKE-Datenbank.

Im Abfrageverlauf wird als Name für den Benutzer, der die Abfrage ausgeführt hat, der Wert SYSTEM angezeigt. (Die Alerts werden vom Systemdienst ausgeführt.)