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.

Warehouses für Alerts wählen

Ein Alert erfordert ein Warehouse zur Ausführung. Sie können entweder das serverlose Computemodell oder ein virtuelles Warehouse, das Sie spezifizieren, verwenden.

Verwendung des serverlosen Computemodells (serverlose Alerts)

Alerts, die das serverlose Computemodell verwenden, werden serverlose Alerts genannt. Wenn Sie das serverlose Computemodell verwenden, passt Snowflake automatisch die Größe der für den Alert erforderlichen Computeressourcen an und skaliert sie. Snowflake bestimmt die ideale Größe der Computeressourcen für eine bestimmte Ausführung auf der Grundlage einer dynamischen Analyse der Statistiken zur letzten Ausführungen desselben Alerts. Die maximale Größe für die Ausführung eines serverlosen Alerts entspricht einem XXLARGE-Warehouse. Mehrere Workloads in Ihrem Konto teilen sich einen gemeinsamen Satz von Computeressourcen.

Die Abrechnung erfolgt ähnlich wie bei anderen serverlosen Features (z. B. serverlosen Aufgaben). Siehe Erläuterungen zu den Kosten von Alerts.

Verwenden eines virtuellen Warehouses, das Sie spezifizieren

Wenn Sie ein virtuelles Warehouse angeben möchten, müssen Sie ein Warehouse wählen, das für die SQL-Aktionen, die durch den Alert ausgeführt werden, angemessen dimensioniert ist. Richtlinien für die Auswahl eines Warehouses finden Sie unter Hinweise zu Warehouses.

Erläuterungen zu den Kosten von Alerts

Die Kosten, die mit der Ausführung eines Alerts zur Ausführung von SQL-Code verbunden sind, hängen von den für den Alert verwendeten Computeressourcen ab:

  • Bei serverlosen Alerts rechnet Snowflake Ihr Konto auf der Grundlage der Nutzung von Computeressourcen ab. Die Gebühren werden auf Basis der Gesamtnutzung der Ressourcen (einschließlich der Clouddienstnutzung) berechnet und in Computestunden (Compute-Hours) der Credit-Nutzung gemessen. Die Kosten für die Computestunden (Compute-Hours) hängen von der Größe des Warehouses und der Laufzeit der Abfrage ab. Weitere Informationen dazu finden Sie unter Serverlose Credit-Nutzung.

    Weitere Informationen zur Anzahl der von Benachrichtigungen verbrauchten Credits finden Sie in der in der „Serverless Feature Credit Table“ unter Snowflake Service Consumption Table.

    Um den Nutzungsverlauf von serverlosen Alerts anzuzeigen, rufen Sie die Funktion SERVERLESS_ALERT_HISTORY auf.

  • Bei Alarmen, die ein von Ihnen angegebenes virtuelles Warehouse verwenden, stellt Snowflake Ihrem Konto die Credit-Nutzung in Rechnung basierend auf der Warehouse-Nutzung, wenn ein Alert ausgeführt wird. Dies ist vergleichbar mit der Verwendung des Warehouses für die Ausführung der gleichen SQL-Anweisungen in einem Client oder in Snowsight. Die sekundengenaue Credit-Abrechnung und das automatische Anhalten des Warehouses sorgen für die notwendige Flexibilität, um mit größeren Warehouse-Größen zu beginnen und die Größe dann an Ihre Alert-Workloads anzupassen.

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.

  • Eine der folgenden Berechtigungen:

    • Die Berechtigung EXECUTE MANAGED ALERT für das Konto, wenn Sie einen serverlosen Alert erstellen.

    • Die Berechtigung USAGE für das Warehouse, das zur Ausführung des Alerts verwendet wird, wenn Sie ein virtuelles Warehouse für den Alert angeben.

  • 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.

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. Wenn Sie einen serverlosen Alert erstellen möchten, erteilen Sie dieser benutzerdefinierten Rolle die globale Berechtigung EXECUTE MANAGED ALERT.

      Beispiel:

      GRANT EXECUTE MANAGED ALERT ON ACCOUNT TO ROLE my_alert_role;
      
      Copy
    4. 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
    • Wenn Sie ein Warehouse für den Alert angeben möchten, muss der Eigentümer dieses Warehouses 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

    Wenn Sie einen serverlosen Alert erstellen, lassen Sie den Parameter WAREHOUSE weg:

    CREATE OR REPLACE ALERT my_alert
      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.

Klonen eines Alerts

Sie können einen Alert klonen (entweder mit CREATE ALERT … CLONE oder durch Klonen der Datenbank oder des Schemas, das den Alert enthält).

Wenn Sie einen serverlosen Alert klonen, brauchen Sie keine Rolle zu verwenden, die über die globale Berechtigung EXECUTE MANAGED ALERT verfügt. Sie können diese Meldung jedoch erst dann fortsetzen, wenn die Rolle, die Eigentümer des Alerts ist, die Berechtigung EXECUTE MANAGED ALERT erhalten hat.

Ü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.)

Anzeigen des Abfrageverlaufs eines serverlosen Alerts

Um den Abfrageverlauf eines serverlosen Alerts anzuzeigen, müssen Sie der Eigentümer des Alerts sein oder eine Rolle verwenden, die über die Berechtigung MONITOR oder OPERATE für den Alert selbst verfügt. (Dies unterscheidet sich von Alerts, die eines Ihrer Warehouses verwenden, für die Sie die Berechtigung MONITOR oder OPERATOR für das Warehouse benötigen.)

Angenommen, Sie möchten die Rolle my_alert_role verwenden, wenn Sie den Abfrageverlauf des Alerts my_alert anzeigen. Wenn my_alert_role nicht der Eigentümer von my_alert ist, müssen Sie dieser Rolle die Berechtigung MONITOR oder OPERATE für den Alert erteilen:

GRANT MONITOR ON ALERT my_alert TO ROLE my_alert_role;
Copy

Nachdem der Rolle diese Berechtigung erteilt wurde, können Sie mit der Rolle den Abfrageverlauf des Alerts anzeigen:

USE ROLE my_alert_role;
Copy
SELECT query_text FROM TABLE(INFORMATION_SCHEMA.QUERY_HISTORY())
  WHERE query_text LIKE '%Some condition%'
    OR query_text LIKE '%Some action%'
  ORDER BY start_time DESC;
Copy