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.

Dans ce chapitre :

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.

  • Vous recevez une demande d’accès aux données provenant d’un utilisateur non autorisé.

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

Note

Actuellement, les objets d’alerte ne prennent pas en charge la réplication.

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 myalert
      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 myalert 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 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

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 myalert SUSPEND;
Copy

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

ALTER ALERT myalert RESUME;
Copy

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

Destruction d’une alerte

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

DROP ALERT myalert;
Copy

Affichage des détails des alertes

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

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

DESC ALERT myalert;
Copy

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.

Note

Les requêtes exécutées par les alertes n’apparaissent que dans l’historique des alertes, pas dans l’historique des requêtes. Pour obtenir des détails sur les requêtes exécutées par les alertes, vous pouvez passer les IDs de requête de la condition et de l’action à la fonction RESULT_SCAN.