Configuration d’alertes basées sur des données dans Snowflake

Cette rubrique explique comment configurer une alerte qui exécute périodiquement une action dans des conditions spécifiques, en fonction des données de Snowflake.

Introduction

Dans certains cas, vous pouvez souhaiter être informé ou prendre des mesures lorsque les données contenues dans Snowflake remplissent certaines conditions. Par exemple, il se peut que vous vouliez recevoir une notification quand :

  • L’utilisation du crédit d’entrepôt augmente d’un certain pourcentage de votre quota actuel déterminé.

  • La consommation de ressources pour vos pipelines, tâches, vues matérialisées, etc. augmente au-delà d’un certain montant.

  • Vos données ne sont pas conformes à une règle de gestion particulière que vous avez mise en place.

Pour ce faire, vous pouvez configurer une alerte Snowflake. Une alerte Snowflake est un objet de niveau schéma qui spécifie :

  • Une condition qui déclenche l’alerte (par exemple, la présence de requêtes qui prennent plus d’une seconde pour se terminer).

  • L’action à exécuter lorsque la condition est remplie (par exemple, envoyer une notification par e-mail, saisir des données dans un tableau, etc.)

  • Quand et à quelle fréquence la condition doit être évaluée (par exemple, toutes les 24 heures, tous les dimanches à minuit, etc.)

Par exemple, supposons que vous souhaitiez envoyer une notification par e-mail lorsque la consommation de crédit dépasse une certaine limite pour un entrepôt. Supposons que vous vouliez vérifier cela toutes les 30 minutes. Vous pouvez créer une alerte avec les propriétés suivantes :

  • Condition : la consommation de crédit pour un entrepôt (la somme de la colonne credits_used dans la vue WAREHOUSE_METERING_HISTORY dans le schéma ACCOUNT_USAGE) dépasse une limite spécifiée.

  • Action : envoyer un e-mail à l’administrateur.

  • Fréquence / horaire : vérifier cette condition toutes les 30 minutes.

Attribution de privilèges pour créer des alertes

Afin de créer une alerte, vous devez utiliser un rôle qui dispose des privilèges suivants :

  • Le privilège EXECUTEALERT sur le compte.

    Note

    Ce privilège ne peut être accordé que par un utilisateur ayant le rôle ACCOUNTADMIN.

  • Les privilèges USAGE et CREATE ALERT sur le schéma dans lequel vous voulez créer l’alerte.

  • Le privilège USAGE sur la base de données contenant le schéma.

  • Le privilège USAGE sur l’entrepôt utilisé pour exécuter l’alerte.

Pour accorder ces privilèges à un rôle, utilisez la commande GRANT <privilèges>.

Par exemple, supposons que vous souhaitiez créer un rôle personnalisé nommé my_alert_role qui dispose des privilèges nécessaires pour créer une alerte dans le schéma nommé my_schema. Vous voulez que l’alerte utilise l’entrepôt my_warehouse.

Pour ce faire :

  1. Demandez à un utilisateur ayant le rôle ACCOUNTADMIN de faire ce qui suit :

    1. Créez le rôle personnalisé.

      Par exemple :

      USE ROLE ACCOUNTADMIN;
      
      CREATE ROLE my_alert_role;
      
      Copy
    2. Accordez le privilège global EXECUTE ALERT à ce rôle personnalisé.

      Par exemple :

      GRANT EXECUTE ALERT ON ACCOUNT TO ROLE my_alert_role;
      
      Copy
    3. Attribuez le rôle personnalisé à un utilisateur.

      Par exemple :

      GRANT ROLE my_alert_role TO USER my_user;
      
      Copy
  2. Demandez aux propriétaires de la base de données, du schéma et de l’entrepôt d’accorder les privilèges nécessaires à la création de l’alerte pour le rôle personnalisé :

    • Le propriétaire du schéma doit accorder les privilèges CREATE ALERT et USAGE sur le schéma :

      GRANT CREATE ALERT ON SCHEMA my_schema TO ROLE my_alert_role;
      GRANT USAGE ON SCHEMA my_schema TO ROLE my_alert_role;
      
      Copy
    • Le propriétaire de la base de données doit accorder le privilège USAGE sur la base de données :

      GRANT USAGE ON DATABASE my_database TO ROLE my_alert_role;
      
      Copy
    • Le propriétaire de l’entrepôt doit accorder le privilège USAGE sur l’entrepôt :

      GRANT USAGE ON WAREHOUSE my_warehouse TO ROLE my_alert_role;
      
      Copy

Création d’une alerte

Supposons que chaque fois qu’une ou plusieurs lignes d’une table nommée gauge ont une valeur dans la colonne gauge_value qui dépasse 200, vous voulez insérer l’horodatage actuel dans une table nommée gauge_value_exceeded_history.

Vous pouvez créer une alerte qui :

  • Evalue la condition que gauge_value dépasse 200.

  • Insère l’horodatage dans gauge_value_exceeded_history si cette condition est évaluée sur true.

Pour créer une alerte nommée my_alert qui effectue cela :

  1. Vérifiez que vous utilisez un rôle qui a les privilèges nécessaires pour créer une alerte.

    Si vous n’utilisez pas ce rôle, exécutez la commande USE ROLE pour utiliser ce rôle.

  2. Vérifiez que vous utilisez la base de données et le schéma dans lesquels vous prévoyez de créer l’alerte.

    Si vous n’utilisez pas cette base de données et ce schéma, exécutez les commandes USE DATABASE et USE SCHEMA pour utiliser cette base de données et ce schéma.

  3. Exécutez la commande CREATE ALERT pour créer l’alerte.

    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

    Pour une description complète de la commande CREATE ALERT, reportez-vous à CREATE ALERT.

    Note

    Lorsque vous créez une alerte, celle-ci est suspendue par défaut. Vous devez reprendre l’alerte nouvellement créée pour que l’alerte s’exécute.

  4. Reprenez l’alerte en exécutant la commande ALTER ALERT … RESUME. Par exemple :

    ALTER ALERT my_alert RESUME;
    
    Copy

Spécification des horodatages basés sur les programmes d’alerte

Dans certains cas, vous pouvez avoir besoin de définir une condition ou une action basée sur le programme d’alerte.

Par exemple, supposons qu’une table possède une colonne d’horodatage qui représente le moment où une ligne a été ajoutée, et que vous souhaitez envoyer une alerte si de nouvelles lignes ont été ajoutées entre la dernière alerte évaluée avec succès et l’alerte programmée actuelle. En d’autres termes, vous voulez évaluer :

<now> - <last_execution_of_the_alert>
Copy

Si vous utilisez CURRENT_TIMESTAMP et l’heure prévue de l’alerte pour calculer cette plage de temps. La plage calculée ne tient pas compte de la latence entre l’heure à laquelle l’alerte est prévue et l’heure à laquelle la condition d’alerte est effectivement évaluée.

Au lieu de cela, lorsque vous avez besoin des horodatages de l’alerte programmée actuelle et de la dernière alerte qui a été évaluée avec succès, utilisez les fonctions suivantes :

  • SCHEDULED_TIME renvoie l’horodatage représentant la date à laquelle l’alerte actuelle a été programmée.

  • LAST_SUCCESSFUL_SCHEDULED_TIME renvoie l’horodatage représentant la date à laquelle la dernière alerte évaluée avec succès a été programmée.

Ces fonctions sont définies dans le schéma SNOWFLAKE.ALERT. Pour appeler ces fonctions, vous devez utiliser un rôle possédnant le SNOWFLAKE.ALERT_VIEWERrôle de la base de données. Pour accorder ce rôle à un autre rôle, utilisez la commande GRANT DATABASE ROLE. Par exemple, pour accorder ce rôle au rôle personnalisé alert_role, exécutez :

GRANT DATABASE ROLE SNOWFLAKE.ALERT_VIEWER TO ROLE alert_role;
Copy

L’exemple suivant envoie un message électronique si de nouvelles lignes ont été ajoutées à my_table entre le moment où la dernière alerte évaluée avec succès a été programmée et le moment où l’alerte actuelle a été programmée :

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

Vérification des résultats de l’instruction SQL pour la condition de l’action d’alerte

Dans l’action d’une alerte, si vous devez vérifier les résultats de l’instruction SQL pour la condition :

  1. Appelez la fonction GET_CONDITION_QUERY_UUID pour obtenir l’ID de la requête pour l’instruction SQL de la condition.

  2. Transmettez l’ID de la requête à la fonction RESULT_SCAN pour obtenir les résultats de l’exécution de l’instruction SQL.

Par exemple :

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

Exécution manuelle des alertes

Dans certains cas, il se peut que vous deviez exécuter une alerte manuellement. Par exemple :

  • Si vous créez une nouvelle alerte, vous voudrez peut-être vérifier que l’alerte fonctionne comme prévu.

  • Il se peut que vous souhaitiez exécuter l’alerte à un point précis de votre pipeline de données. Par exemple, vous pourriez vouloir exécuter l’alerte à la fin de l’appel d’une procédure stockée.

Pour exécuter une alerte manuellement, exécutez la commande EXECUTE ALERT:

EXECUTE ALERT my_alert;
Copy

La commande EXECUTE ALERT déclenche manuellement l’exécution unique d’une alerte, indépendamment de la programmation définie pour l’alerte.

Vous pouvez exécuter cette commande de manière interactive. Vous pouvez également exécuter cette commande à partir d’une procédure stockée ou d’un bloc de script Snowflake.

Pour plus de détails sur les privilèges requis pour exécuter cette commande et sur l’effet de cette commande sur les alertes suspendues, en cours d’exécution et programmées, consultez EXECUTE ALERT.

Suspension et reprise d’une alerte

Si vous devez empêcher l’exécution temporaire d’une alerte, vous pouvez la suspendre en exécutant la commande ALTER ALERT … SUSPEND. Par exemple :

ALTER ALERT my_alert SUSPEND;
Copy

Pour reprendre une alerte suspendue, exécutez la commande ALTER ALERT … RESUME. Par exemple :

ALTER ALERT my_alert RESUME;
Copy

Note

Si vous n’êtes pas le propriétaire de l’alerte, vous devez avoir le privilège OPERATE sur l’alerte pour suspendre ou reprendre l’alerte.

Modification d’une alerte

Pour modifier les propriétés d’une alerte, exécutez la commande ALTER ALERT. Par exemple :

  • Pour changer l’entrepôt de l’alerte nommée my_alert en my_other_warehouse, exécutez :

    ALTER ALERT my_alert SET WAREHOUSE = my_other_warehouse;
    
    Copy
  • Pour modifier le programme de l’alerte nommée my_alert afin qu’elle soit évaluée toutes les 2 minutes, exécutez :

    ALTER ALERT my_alert SET SCHEDULE = '2 minutes';
    
    Copy
  • Pour modifier la condition de l’alerte nommée my_alert afin d’être alerté si des lignes de la table nommée gauge ont des valeurs supérieures à 300 dans la colonne gauge_value, exécutez :

    ALTER ALERT my_alert MODIFY CONDITION EXISTS (SELECT gauge_value FROM gauge WHERE gauge_value>300);
    
    Copy
  • Pour modifier l’action de l’alerte nommée my_alert en CALL my_procedure(), exécutez :

    ALTER ALERT my_alert MODIFY ACTION CALL my_procedure();
    
    Copy

Note

Vous devez être le propriétaire de l’alerte pour modifier les propriétés de l’alerte.

Destruction d’une alerte

Pour détruire une alerte, exécutez la commande DROP ALERT. Par exemple :

DROP ALERT my_alert;
Copy

Pour supprimer une alerte sans déclencher d’erreur si l’alerte n’existe pas, exécutez :

DROP ALERT IF EXISTS my_alert;
Copy

Note

Vous devez être le propriétaire de l’alerte pour supprimer l’alerte.

Affichage des détails à propos d’une alerte

Pour dresser la liste des alertes créées dans un compte, une base de données ou un schéma, exécutez la commande SHOW ALERTS. Par exemple, pour dresser la liste des alertes qui ont été créées dans le schéma actuel, exécutez la commande suivante :

SHOW ALERTS;
Copy

Cette commande dresse la liste des alertes dont vous êtes propriétaire et des alertes pour lesquelles vous disposez du privilège MONITOR ou OPERATE.

Pour voir les détails d’une alerte spécifique, exécutez la commande DESCRIBE ALERT. Par exemple :

DESC ALERT my_alert;
Copy

Note

Si vous n’êtes pas le propriétaire de l’alerte, vous devez avoir le privilège MONITOR ou OPERATE sur l’alerte pour en voir les détails.

Suivi de l’exécution des alertes

Pour surveiller l’exécution des alertes, vous pouvez :

  • Vérifier les résultats de l’action qui a été spécifiée pour l’alerte. Par exemple, si l’action a inséré des lignes dans un tableau, vous pouvez vérifier la présence de nouvelles lignes dans le tableau.

  • Voir l’historique des exécutions d’alertes en utilisant l’une des méthodes suivantes :

    • La fonction de table ALERT_HISTORY dans le schéma INFORMATION_SCHEMA.

      Par exemple, pour voir les exécutions d’alertes au cours de la dernière heure, exécutez l’instruction suivante :

      SELECT *
      FROM
        TABLE(INFORMATION_SCHEMA.ALERT_HISTORY(
          SCHEDULED_TIME_RANGE_START
            =>dateadd('hour',-1,current_timestamp())))
      ORDER BY SCHEDULED_TIME DESC;
      
      Copy
    • La vue ALERT_HISTORY dans le schéma ACCOUNT_USAGE de la base de données partagée SNOWFLAKE.

Dans l’historique des requêtes, le nom de l’utilisateur qui a exécuté la requête sera SYSTEM. (Les alertes sont exécutées par le service système.)