Surveillance des tables d’événements et alertes pour les tables dynamiques¶
Ce sujet explique comment interroger une table d’événements qui fournit des informations sur votre statut d’actualisation et comment configurer des alertes sur les nouvelles données d’une table d’événements.
Interrogation d’une table d’événements pour surveiller les actualisations¶
Lorsqu’une table dynamique est rafraîchie, vous pouvez configurer Snowflake pour qu’il enregistre un événement qui fournit des informations sur le statut de l’opération d’actualisation. L’événement est enregistré dans la table d’événements actifs associée à la table dynamique.
Par exemple, supposons que vous ayez associé une table d’événements à une base de données. Lorsqu’une table dynamique de cette base de données est actualisée, Snowflake enregistre un événement dans cette table.
Vous pouvez effectuer une requête sur les événements connectés dans cette table d’événements active pour surveiller les actualisations de votre table dynamique.
Par exemple, pour obtenir l’horodatage, le nom de la table dynamique, l’ID de requête et le message d’erreur pour les erreurs avec les tables dynamiques dans la base de données my_db
, procédez comme suit :
SELECT
timestamp,
resource_attributes:"snow.executable.name"::VARCHAR AS dt_name,
resource_attributes:"snow.query.id"::VARCHAR AS query_id,
value:message::VARCHAR AS error
FROM my_event_table
WHERE
resource_attributes:"snow.executable.type" = 'DYNAMIC_TABLE' AND
resource_attributes:"snow.database.name" = 'MY_DB' AND
value:state = 'FAILED'
ORDER BY timestamp DESC;
+-------------------------+------------------+--------------------------------------+---------------------------------------------------------------------------------+
| TIMESTAMP | DT_NAME | QUERY_ID | ERROR |
|-------------------------+------------------+--------------------------------------+---------------------------------------------------------------------------------|
| 2025-02-17 21:40:45.444 | MY_DYNAMIC_TABLE | 01ba7614-0107-e56c-0000-a995024f304a | SQL compilation error: |
| | | | Failure during expansion of view 'MY_DYNAMIC_TABLE': SQL compilation error: |
| | | | Object 'MY_DB.MY_SCHEMA.MY_BASE_TABLE' does not exist or not authorized. |
+-------------------------+------------------+--------------------------------------+---------------------------------------------------------------------------------+
L’exemple suivant récupère toutes les colonnes pour les erreurs en amont avec les tables dynamiques dans le schéma my_schema
:
SELECT *
FROM my_event_table
WHERE
resource_attributes:"snow.executable.type" = 'DYNAMIC_TABLE' AND
resource_attributes:"snow.schema.name" = 'MY_SCHEMA' AND
value:state = 'UPSTREAM_FAILURE'
ORDER BY timestamp DESC;
+-------------------------+-----------------+-------------------------+-------+----------+-------------------------------------------------+-------+------------------+-------------+-----------------------------+-------------------+-------------------------------+-----------+
| TIMESTAMP | START_TIMESTAMP | OBSERVED_TIMESTAMP | TRACE | RESOURCE | RESOURCE_ATTRIBUTES | SCOPE | SCOPE_ATTRIBUTES | RECORD_TYPE | RECORD | RECORD_ATTRIBUTES | VALUE | EXEMPLARS |
|-------------------------+-----------------+-------------------------+-------+----------+-------------------------------------------------+-------+------------------+-------------+-----------------------------+-------------------+-------------------------------+-----------|
| 2025-02-17 21:40:45.486 | NULL | 2025-02-17 21:40:45.486 | NULL | NULL | { | NULL | NULL | EVENT | { | NULL | { | NULL |
| | | | | | "snow.database.id": 49, | | | | "name": "refresh.status", | | "state": "UPSTREAM_FAILURE" | |
| | | | | | "snow.database.name": "MY_DB", | | | | "severity_text": "WARN" | | } | |
| | | | | | "snow.executable.id": 487426, | | | | } | | | |
| | | | | | "snow.executable.name": "MY_DYNAMIC_TABLE_2", | | | | | | | |
| | | | | | "snow.executable.type": "DYNAMIC_TABLE", | | | | | | | |
| | | | | | "snow.owner.id": 2601, | | | | | | | |
| | | | | | "snow.owner.name": "DATA_ADMIN", | | | | | | | |
| | | | | | "snow.owner.type": "ROLE", | | | | | | | |
| | | | | | "snow.schema.id": 411, | | | | | | | |
| | | | | | "snow.schema.name": "MY_SCHEMA" | | | | | | | |
| | | | | | } | | | | | | | |
+-------------------------+-----------------+-------------------------+-------+----------+-------------------------------------------------+-------+------------------+-------------+-----------------------------+-------------------+-------------------------------+-----------+
Pour plus d’informations sur le rôle que vous devez utiliser pour interroger la table des événements et sur les conditions que vous pouvez utiliser pour filtrer les résultats, voir Paramétrer une alerte en cas de nouvelles données.
Définir des alertes sur les nouvelles données pour surveiller les mises à jour¶
Comme indiqué précédemment à l’adresse, lorsqu’une table dynamique est actualisée, un événement est connecté à la table des événements pour indiquer si l’actualisation a réussi ou échoué. Vous pouvez paramétrer une alerte sur les nouvelles données pour surveiller la table des événements. Vous pouvez configurer l’alerte de manière à ce que envoie une notification en cas d’échec de l’actualisation.
Les sections suivantes expliquent comment configurer la connexion des événements pour enregistrer les événements, comment configurer l’alerte et comment interpréter les événements enregistrés dans la table des événements :
Note
Connecter les événements pour les tables dynamiques engendre des coûts. Voir Coûts de la collecte de données de télémétrie.
Définition du niveau de gravité des événements sur capturer¶
Note
Si vous n’avez pas défini le niveau de gravité, aucun événement ne sera capturé.
Pour configurer l’enregistrement des événements de la table dynamique dans la table des événements, définissez le niveau de gravité des événements que vous souhaitez capturer dans la table des événements. Les événements sont saisis aux niveaux suivants :
ERROR
: actualiser les événements d’échec.WARN
: échecs d’actualisation des tables dynamiques en amont et événements d’échec d’actualisation.INFO
: les événements d’actualisation réussis, les échecs d’actualisation des tables dynamiques en amont et les événements d’échec d’actualisation.
Pour définir le niveau, il convient de définir le paramètre LOG_LEVEL pour le compte ou l’objet. Vous pouvez définir le niveau pour :
Tous les objets du compte.
Tous les objets d’une base de données ou d’un schéma.
Une table dynamique spécifique.
Par exemple :
Pour capturer les événements et les messages de niveau ERROR pour tous les objets du compte, exécutez ALTER ACCOUNT SET LOG_LEVEL :
ALTER ACCOUNT SET LOG_LEVEL = ERROR;
Notez que ce niveau affecte tous les types d’objets du compte, y compris les UDFs, les procédures stockées, les tables dynamiques et les tâches.
Pour capturer les événements et les messages de niveau INFO pour tous les objets de la base de données
my_db
, exécutez ALTER DATABASE … SET LOG_LEVEL :ALTER DATABASE my_db SET LOG_LEVEL = INFO;
Comme dans le cas de la définition du niveau du compte, la définition du niveau de la base de données affecte tous les types d’objets de la base de données, y compris les UDFs, les procédures stockées, les tables dynamiques et les tâches.
Pour capturer les événements de niveau WARNpour la table dynamique
my_dynamic_table
, exécutez ALTER DYNAMIC TABLE … SET LOG_LEVEL :ALTER DYNAMIC TABLE my_dynamic_table SET LOG_LEVEL = WARN;
Paramétrer une alerte en cas de nouvelles données¶
Après avoir défini le niveau de gravité des événements de journalisation, vous pouvez configurer une alerte sur les nouvelles données pour surveiller la table d’événements à la recherche de nouveaux événements indiquant une défaillance dans l’actualisation de la table dynamique. Une alerte sur les nouvelles données est déclenchée lorsque de nouvelles lignes sont insérées dans la table de l’événement et remplissent la condition spécifiée dans l’alerte.
Note
Pour créer l’alerte sur de nouvelles données, vous devez utiliser un rôle qui a reçu les privilèges nécessaires pour interroger la table des événements.
Si la condition d’alerte interroge la table d’événements par défaut (SNOWFLAKE.TELEMETRY.EVENTS) ou la vue prédéfinie (SNOWFLAKE.TELEMETRY.EVENTS_VIEW la vue), voir Rôles pour l’accès à la table d’événements par défaut et EVENTS_VIEW.
Pour gérer l’accès à la vue EVENTS_VIEW, voir Gérer l’accès à la vue EVENTS_VIEW.
Si la condition d’alerte interroge une table d’événements personnalisée, voir Privilèges de contrôle d’accès pour les tables d’événements.
Pour gérer l’accès à une table d’événements personnalisée, voir Gestion de l’accès aux données des tables d’événements.
Dans la condition d’alerte, pour effectuer une requête sur les événements de la table dynamique, sélectionnez les lignes où resource_attributes:"snow.executable.type" = 'DYNAMIC_TABLE'
. Pour réduire la liste des événements, vous pouvez filtrer sur les colonnes suivantes :
Pour limiter les résultats aux tables dynamiques d’une base de données spécifique, utilisez
resource_attributes:"snow.database.name"
.Pour renvoyer les événements où l’actualisation a échoué en raison d’une erreur avec la table dynamique, utilisez
value:state = 'FAILED'
.Pour renvoyer les événements dans lesquels l’actualisation a échoué en raison d’une erreur avec une table dynamique en amont, utilisez
value:state = 'UPSTREAM_FAILURE'
.
Pour obtenir des informations sur les valeurs connectées pour un événement de table dynamique, voir Informations journalisées pour les événements de table dynamique.
Par exemple, l’instruction suivante crée une alerte sur les nouvelles données qui exécute une action lorsque les actualisations échouent pour les tables dynamiques de la base de données my_db
. L’exemple part du principe que :
Votre table d’événements active est la table d’événements par défaut <label-logging_event_table_default> (SNOWFLAKE.TELEMETRY.EVENTS).
Vous avez mis en place une intégration de notification par webhook pour ce canal Slack.
CREATE ALERT my_alert_on_dt_refreshes
IF( EXISTS(
SELECT * FROM SNOWFLAKE.TELEMETRY.EVENT_TABLE
WHERE resource_attributes:"snow.executable.type" = 'dynamic_table'
AND resource_attributes:"snow.database.name" = 'my_db'
AND record_attributes:"event.name" = 'refresh.status'
AND record:"severity_text" = 'ERROR'
AND value:"state" = 'FAILED'))
THEN
BEGIN
LET result_str VARCHAR;
(SELECT ARRAY_TO_STRING(ARRAY_ARG(name)::ARRAY, ',') INTO :result_str
FROM (
SELECT resource_attributes:"snow.executable.name"::VARCHAR name
FROM TABLE(RESULT_SCAN(SNOWFLAKE.ALERT.GET_CONDITION_QUERY_UUID()))
LIMIT 10
)
);
CALL SYSTEM$SEND_SNOWFLAKE_NOTIFICATION(
SNOWFLAKE.NOTIFICATION.TEXT_PLAIN(:result_str),
'{"my_slack_integration": {}}'
);
END;
Informations journalisées pour les événements de table dynamique¶
Lorsqu’une table dynamique est rafraîchie, un événement est connecté à la table des événements. Les sections suivantes décrivent la ligne de la table des événements qui représente l’événement :
Valeurs des colonnes de la table des événements¶
Lorsqu’une table dynamique est actualisée, une ligne contenant les valeurs suivantes est insérée dans la table des événements.
Note
Si une colonne n’est pas listée ci-dessous, la valeur de la colonne est NULL pour l’événement.
Colonne |
Type de données |
Description |
---|---|---|
|
TIMESTAMP_NTZ |
L’horodatage UTC de la création d’un événement. |
|
TIMESTAMP_NTZ |
Un horaire UTC utilisé pour les journaux. Actuellement, il s’agit de la même valeur que celle qui figure dans la colonne |
|
OBJECT |
Attributs qui identifient la table dynamique qui a été rafraîchie. |
|
STRING |
Le type d’événement, qui est |
|
OBJECT |
Détails du statut d’actualisation de la table dynamique. |
|
VARIANT |
Le statut d’actualisation de la table dynamique et, si l’actualisation a échoué, le message d’erreur correspondant. |
Paires de valeurs clés dans la colonne resource_attributes
¶
La colonne resource_attributes
contient une valeur OBJECT avec les paires clés-valeurs suivantes :
Nom d’attribut |
Type d’attribut |
Description |
Exemple |
---|---|---|---|
|
INTEGER |
L’identificateur interne/généré par le système de la base de données contenant la table dynamique. |
|
|
VARCHAR |
Le nom de la base de données contenant la table dynamique. |
|
|
INTEGER |
L’identificateur interne/généré par le système de la table dynamique qui a été actualisée. |
|
|
VARCHAR |
Le nom de la table dynamique qui a été actualisée. |
|
|
VARCHAR |
Le type de l’objet. La valeur est |
|
|
INTEGER |
L’identificateur interne/généré par le système du rôle avec le privilège OWNERSHIP sur la table dynamique. |
|
|
VARCHAR |
Le nom du rôle ayant le privilège OWNERSHIP sur la table dynamique. |
|
|
VARCHAR |
Type de rôle qui possède l’objet, par exemple |
|
|
VARCHAR |
ID de la requête qui a actualisé la table dynamique. |
|
|
INTEGER |
L’identificateur interne/généré par le système du schéma contenant la table dynamique. |
|
|
VARCHAR |
Le nom du schéma contenant la table dynamique. |
|
|
INTEGER |
L’identificateur interne/généré par le système de l’entrepôt utilisé pour actualiser la table dynamique. |
|
|
VARCHAR |
Le nom de l’entrepôt utilisé pour actualiser la table dynamique. |
|
Paires de valeurs clés dans la colonne record
¶
La colonne record
contient une valeur OBJECT avec les paires clés-valeurs suivantes :
Clé |
Type |
Description |
Exemple |
---|---|---|---|
|
VARCHAR |
Le nom de l’événement. La valeur est |
|
|
VARCHAR |
Le niveau de gravité de l’événement, qui correspond à l’une des valeurs suivantes :
|
|
Paires de valeurs clés dans la colonne value
¶
La colonne value
contient une valeur VARIANT avec les paires clés-valeurs suivantes :
Clé |
Type |
Description |
Exemple |
---|---|---|---|
|
VARCHAR |
L’état de l’actualisation, qui peut prendre l’une des valeurs suivantes :
|
|
|
VARCHAR |
Si la valeur de |
|