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, définissez le paramètre LOG_EVENT_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 des événements de table dynamique de niveau ERROR pour tous les objets pris en charge dans le compte, exécutez ALTER ACCOUNT SET LOG_EVENT_LEVEL :

    ALTER ACCOUNT SET LOG_EVENT_LEVEL = ERROR;
    

    Définir LOG_EVENT_LEVEL au niveau du compte s’applique aux événements de journal (type d’enregistrementEVENT) pour les charges de travail prises en charge dans le compte, y compris les tables dynamiques. Il ne remplace pas LOG_LEVEL pour les messages de journalisation des APIs de journalisation. Pour plus d’informations, voir Paramètres.

  • Pour capturer des événements de niveau INFO pour tous les objets pris en charge dans la base de données``my_db`` , exécutez ALTERDATABASE …SET LOG_EVENT_LEVEL :

    ALTER DATABASE my_db SET LOG_EVENT_LEVEL = INFO;
    

    Comme pour la définition du niveau sur le compte, la définition du niveau sur la base de données affecte les événements de journal pour les types d’objets pris en charge dans la base de données.

  • Pour capturer des événements de niveau WARN pour la table dynamique``my_dynamic_table``, exécutez ALTER DYNAMIC TABLE … SET LOG_EVENT_LEVEL :

    ALTER DYNAMIC TABLE my_dynamic_table SET LOG_EVENT_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.

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.

Note

La colonne timestamp dans le tableau des événements stocke les valeurs en UTC. Si vous utilisez une alerte programmée avec un filtre d’horodatage (par exemple, timestamp > DATEADD('minute', -5, CURRENT_TIMESTAMP())), convertissez l’horodatage actuel en UTC afin de garantir des comparaisons précises :

timestamp > DATEADD('minute', -5, CONVERT_TIMEZONE('UTC', CURRENT_TIMESTAMP()))

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 dans la base de données my_db. L’exemple suppose que :

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:"name" = 'refresh.status'
        AND record:"severity_text" = 'ERROR'
        AND value:"state" = 'FAILED'))
  THEN
    BEGIN
      LET result_str VARCHAR;
      (SELECT ARRAY_TO_STRING(ARRAY_AGG(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

TIMESTAMP_NTZ

L’horodatage UTC de la création d’un événement.

observed_timestamp

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

resource_attributes

OBJECT

Attributs qui identifient la table dynamique qui a été rafraîchie.

record_type

STRING

Le type d’événement, qui est EVENT pour les actualisations de tables dynamiques.

record

OBJECT

Détails du statut d’actualisation de la table dynamique.

value

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

snow.database.id

INTEGER

L’identificateur interne/généré par le système de la base de données contenant la table dynamique.

12345

snow.database.name

VARCHAR

Le nom de la base de données contenant la table dynamique.

MY_DATABASE

snow.executable.id

INTEGER

L’identificateur interne/généré par le système de la table dynamique qui a été actualisée.

12345

snow.executable.name

VARCHAR

Le nom de la table dynamique qui a été actualisée.

MY_DYNAMIC_TABLE

snow.executable.type

VARCHAR

Le type de l’objet. La valeur est DYNAMIC_TABLE pour les événements de table dynamique.

DYNAMIC_TABLE

snow.owner.id

INTEGER

L’identificateur interne/généré par le système du rôle avec le privilège OWNERSHIP sur la table dynamique.

12345

snow.owner.name

VARCHAR

Le nom du rôle ayant le privilège OWNERSHIP sur la table dynamique.

MY_ROLE

snow.owner.type

VARCHAR

Type de rôle qui possède l’objet, par exemple ROLE. . Si une Snowflake Native App est propriétaire de l’objet, la valeur est APPLICATION. . Snowflake renvoie NULL si vous supprimez l’objet, car un objet supprimé n’a pas de rôle propriétaire.

ROLE

snow.query.id

VARCHAR

ID de la requête qui a actualisé la table dynamique.

01ba7614-0107-e56c-0000-a995024f304a

snow.schema.id

INTEGER

L’identificateur interne/généré par le système du schéma contenant la table dynamique.

12345

snow.schema.name

VARCHAR

Le nom du schéma contenant la table dynamique.

MY_SCHEMA

snow.warehouse.id

INTEGER

L’identificateur interne/généré par le système de l’entrepôt utilisé pour actualiser la table dynamique.

12345

snow.warehouse.name

VARCHAR

Le nom de l’entrepôt utilisé pour actualiser la table dynamique.

MY_WAREHOUSE

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

name

VARCHAR

Nom de l’événement. La valeur est``refresh.status`` pour l’actualisation des tables dynamiques.

refresh.status

severity_text

VARCHAR

Le niveau de gravité de l’événement, qui correspond à l’une des valeurs suivantes :

  • INFO : l’actualisation a réussi.

  • ERROR : l’actualisation a échoué.

  • WARN : l’actualisation d’une table dynamique en amont a échoué.

INFO

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

state

VARCHAR

L’état de l’actualisation, qui peut prendre l’une des valeurs suivantes :

  • SUCCEEDED : l’actualisation a réussi.

  • FAILED : l’actualisation a échoué.

  • UPSTREAM_FAILURE : l’actualisation a échoué en raison d’un échec de l’actualisation d’une table dynamique dont dépend cette table dynamique.

SUCCEEDED

message

VARCHAR

Si la valeur de state est FAILED, cette colonne contient un message d’erreur.

SQL compilation error:\nFailure during expansion of view 'MY_DYNAMIC_TABLE': SQL compilation error:\nObject 'MY_DB.MY_SCHEMA.MY_BASE_TABLE' does not exist or not authorized.

Interroger les spans des pipelines pour tracer les actualisations

En plus des événements, Snowflake peut enregistrer des spans de pipeline pour les actualisations des tables dynamiques. Les événements et les spans sont deux mécanismes d’observabilité distincts :

  • Événements (contrôlés par LOG_LEVEL) fournissent des journaux par actualisation de table dynamique, indiquant si chaque actualisation a réussi ou échoué.

  • Plages (contrôlé par:ref:TRACE_LEVEL<label-trace_level>) fournissent une observabilité plus riche au niveau du pipeline, y compris les IDs de traces corrélés sur un pipeline, les motifs d’actualisations omises et la topologie des dépendance.

Les spans capturent des états supplémentaires pour lesquels les événements ne sont pas émis, notamment les actualisations SKIPPED en raison d’omissions en amont ou de cycles d’actualisation où le planificateur a ignoré l’actualisation afin de minimiser la latence de la table dynamique et de ses consommateurs.

Note

L’enregistrement des spans pour les tables dynamiques entraîne des coûts. Voir Coûts de la collecte de données de télémétrie.

Activer les spans de pipeline

Pour activer les spans de pipeline pour les actualisations des tables dynamiques, définissez le paramètre TRACE_LEVEL sur ALWAYS au niveau de la base de données ou du schéma :

ALTER SCHEMA my_db.my_schema SET TRACE_LEVEL = 'ALWAYS';

Vous pouvez également définir ce paramètre au niveau de la base de données pour capturer les spans de toutes les tables dynamiques de la base de données :

ALTER DATABASE my_db SET TRACE_LEVEL = 'ALWAYS';

Interroger les données des spans

Pour interroger les spans de pipeline pour les actualisations des tables dynamiques, filtrez les lignes où record_type = 'SPAN' et record:"name" = 'table_refresh' :

SELECT
    resource_attributes:"snow.executable.name"::STRING AS dt_name,
    record_attributes:"snow.dynamic_table.state"::STRING AS state,
    record_attributes:"snow.dynamic_table.state_reason"::STRING AS state_reason,
    record_attributes:"snow.dynamic_table.data_timestamp"::STRING AS data_timestamp,
    trace:"trace_id"::STRING AS trace_id,
    trace:"span_id"::STRING AS span_id,
    record:"status":"code"::STRING AS status_code
  FROM my_event_table
  WHERE record_type = 'SPAN'
    AND record:"name" = 'table_refresh'
  ORDER BY start_timestamp ASC;

Attributs de span (record_attributes)

Chaque ligne de span comprend les attributs suivants dans la colonne record_attributes, spécifique aux actualisations des tables dynamiques :

Nom d’attribut

Type

Description

snow.dynamic_table.state

STRING

L’état de l’actualisation :SUCCEEDED, FAILED ou SKIPPED.

snow.dynamic_table.state_reason

STRING

Pourquoi la table dynamique a été ignorée ou pourquoi elle a échoué. NULL sur la réussite. Valeurs possibles :

  • QUERY_FAILURE : la requête d’actualisation a échoué.

  • UPSTREAM_FAILURE : une table dynamique en amont ne s’est pas actualisée.

  • UPSTREAM_SKIP : une table dynamique en amont a été ignorée.

  • NOT_EFFECTIVE_TICK_TO_REFRESH : Le pipeline fonctionne déjà en retard par rapport à la planification. Il ignore cette opération d’actualisation pour réduire la latence de cette table dynamique et de ses consommateurs.

snow.dynamic_table.data_timestamp

STRING

L’horodatage transactionnel au moment où l’actualisation a été évaluée. (Il se peut que cette date soit légèrement antérieure à l’heure réelle de l’actualisation.) Toutes les données, dans les objets de base, qui sont arrivées avant cet horodatage sont incluses dans la table dynamique.

Note

Les spans couvrent les états SKIPPED (avec les motifs``UPSTREAM_SKIP`` et NOT_EFFECTIVE_TICK_TO_REFRESH) pour lesquels les événements ne sont pas émis. Si vous avez besoin de visibilité sur les actualisations ignorées, utilisez des spans à la place des événements.

Tracer une actualisation de pipeline

Cette section explique comment utiliser les spans de pipeline pour tracer un cycle d’actualisation de bout en bout : rechercher des spans appropriés, récupérer le pipeline complet et diagnostiquer des défaillances ou des omissions.

Exemple de scénario de pipeline

Considérons un pipeline linéaire de quatre tables dynamiques :

DT1 --> DT2 --> DT3 --> DT4

Dans cet exemple,``DT1`` et DT2 s’actualisent correctement, mais DT3 échoue en raison d’une erreur de requête. Étant donné que DT3 est un échec, DT4 est automatiquement ignoré avec le motif UPSTREAM_FAILURE.

Les étapes suivantes montrent comment récupérer et interpréter les spans de pipeline pour ce scénario.

Étape 1 : Rechercher le span d’une table dynamique

Pour étudier l’actualisation d’une table dynamique spécifique, interrogez la table des événements pour trouver son span le plus récent. Filtrez par nom de base de données, de schéma et de table dynamique pour vous assurer que vous faites correspondre l’objet correct :

SELECT
    trace:"span_id"::STRING AS span_id,
    trace:"trace_id"::STRING AS trace_id,
    resource_attributes:"snow.executable.name"::STRING AS dt_name,
    record_attributes:"snow.dynamic_table.data_timestamp"::STRING AS data_timestamp,
    record_attributes:"snow.dynamic_table.state"::STRING AS state,
    record_attributes:"snow.dynamic_table.state_reason"::STRING AS state_reason,
    resource_attributes:"snow.query.id"::STRING AS query_id,
    start_timestamp,
    timestamp AS end_timestamp
  FROM my_event_table
  WHERE record_type = 'SPAN'
    AND record:"name" = 'table_refresh'
    AND resource_attributes:"snow.database.name" = 'MY_DB'
    AND resource_attributes:"snow.schema.name" = 'MY_SCHEMA'
    AND resource_attributes:"snow.executable.name" = 'DT3'
  ORDER BY start_timestamp DESC
  LIMIT 5;
+----------+------------------+---------+-------------------------+-----------+--------------+--------------------------------------+-------------------------+-------------------------+
| SPAN_ID  | TRACE_ID         | DT_NAME | DATA_TIMESTAMP          | STATE     | STATE_REASON | QUERY_ID                             | START_TIMESTAMP          | END_TIMESTAMP           |
|----------+------------------+---------+-------------------------+-----------+--------------+--------------------------------------+-------------------------+-------------------------|
| a1b2c3d4 | 4f3e2d1c0b9a8877 | DT3     | 2026-02-13T10:00:00.000 | FAILED    | QUERY_FAILURE| 01ba7614-0107-e56c-0000-a995024f304a | 2026-02-13 10:02:01.000 | 2026-02-13 10:02:20.000 |
| e5f6a7b8 | 7a8b9c0d1e2f3344 | DT3     | 2026-02-13T09:55:00.000 | SUCCEEDED | NULL         | 01ba7614-0107-e56c-0000-a995024f2f9b | 2026-02-13 09:57:01.000 | 2026-02-13 09:57:18.000 |
+----------+------------------+---------+-------------------------+-----------+--------------+--------------------------------------+-------------------------+-------------------------+

La valeur trace_id identifie le cycle d’actualisation. Tous les spans de tables dynamiques dans une même actualisation de pipeline partagent le même trace_id. Utilisez cette valeur à l’étape suivante pour récupérer tous les spans du même cycle d’actualisation.

Étape 2 : Récupérer le pipeline complet

Interrogez tous les spans qui partagent le même trace_id pour voir chaque table dynamique dans le cycle d’actualisation. Incluez record:"links" pour capturer le graphique de dépendance et DATEDIFF pour calculer la durée de chaque opération d’actualisation :

SELECT
    trace:"span_id"::STRING AS span_id,
    trace:"trace_id"::STRING AS trace_id,
    resource_attributes:"snow.executable.name"::STRING AS dt_name,
    record_attributes:"snow.dynamic_table.state"::STRING AS state,
    record_attributes:"snow.dynamic_table.state_reason"::STRING AS state_reason,
    resource_attributes:"snow.query.id"::STRING AS query_id,
    start_timestamp,
    timestamp AS end_timestamp,
    DATEDIFF('second', start_timestamp, timestamp) AS duration_sec,
    record:"links" AS upstream_links
  FROM my_event_table
  WHERE record_type = 'SPAN'
    AND record:"name" = 'table_refresh'
    AND trace:"trace_id" = '4f3e2d1c0b9a8877'
  ORDER BY start_timestamp ASC;
+----------+------------------+---------+-----------+-----------------+--------------------------------------+-------------------------+-------------------------+--------------+---------------------------------------------+
| SPAN_ID  | TRACE_ID         | DT_NAME | STATE     | STATE_REASON    | QUERY_ID                             | START_TIMESTAMP          | END_TIMESTAMP           | DURATION_SEC | UPSTREAM_LINKS                              |
|----------+------------------+---------+-----------+-----------------+--------------------------------------+-------------------------+-------------------------+--------------+---------------------------------------------|
| f1e2d3c4 | 4f3e2d1c0b9a8877 | DT1     | SUCCEEDED | NULL            | 01ba7614-0107-e56c-0000-a995024f3001 | 2026-02-13 10:01:00.000 | 2026-02-13 10:01:30.000 |           30 | []                                          |
| b5a6c7d8 | 4f3e2d1c0b9a8877 | DT2     | SUCCEEDED | NULL            | 01ba7614-0107-e56c-0000-a995024f3002 | 2026-02-13 10:01:31.000 | 2026-02-13 10:02:00.000 |           29 | [{"span_id": "f1e2d3c4", ...}]              |
| a1b2c3d4 | 4f3e2d1c0b9a8877 | DT3     | FAILED    | QUERY_FAILURE   | 01ba7614-0107-e56c-0000-a995024f304a | 2026-02-13 10:02:01.000 | 2026-02-13 10:02:20.000 |           19 | [{"span_id": "b5a6c7d8", ...}]              |
| c9d0e1f2 | 4f3e2d1c0b9a8877 | DT4     | SKIPPED   | UPSTREAM_FAILURE| NULL                                 | 2026-02-13 10:02:20.000 | 2026-02-13 10:02:20.000 |            0 | [{"span_id": "a1b2c3d4", ...}]              |
+----------+------------------+---------+-----------+-----------------+--------------------------------------+-------------------------+-------------------------+--------------+---------------------------------------------+

À partir de ce résultat, vous pouvez voir une vue complète du cycle d’actualisation :

  • DT1 et DT2 ont réussi (30 et 29 secondes respectivement).

  • DT3 a échoué après 19 secondes en raison de l’échec d’une requête.

  • DT4 a été ignoré immédiatement (représenté par un span de durée zéro), parce que sa dépendance en amont a échoué.

  • La colonne UPSTREAM_LINKS montre les dépendances directes de chaque table dynamique par span_id.

Étape 3 : Identifier la cause profonde d’un échec ou d’une omission

Lorsqu’une table dynamique est ignorée ou échoue, vous pouvez tracer ses dépendances en amont par le biais des liens de span afin de trouver la cause principale. Cette requête résout les liens de span d’une table dynamique spécifique vers les autres spans du pipeline :

WITH pipeline AS (
  SELECT
    trace:"span_id"::STRING AS span_id,
    resource_attributes:"snow.executable.name"::STRING AS dt_name,
    record_attributes:"snow.dynamic_table.state"::STRING AS state,
    record_attributes:"snow.dynamic_table.state_reason"::STRING AS state_reason,
    resource_attributes:"snow.query.id"::STRING AS query_id,
    record:"links" AS upstream_links
  FROM my_event_table
  WHERE record_type = 'SPAN'
    AND record:"name" = 'table_refresh'
    AND record_attributes:"snow.dynamic_table.data_timestamp" = '2026-02-13T10:00:00.000'
),
target_links AS (
  SELECT f.value:"span_id"::STRING AS upstream_span_id
  FROM pipeline,
  LATERAL FLATTEN(input => upstream_links) f
  WHERE dt_name = 'DT4'
)
SELECT
  p.dt_name AS upstream_dt,
  p.state AS upstream_state,
  p.state_reason AS upstream_reason,
  p.query_id AS upstream_query_id
FROM target_links tl
JOIN pipeline p ON tl.upstream_span_id = p.span_id;
+-------------+----------------+-----------------+--------------------------------------+
| UPSTREAM_DT | UPSTREAM_STATE | UPSTREAM_REASON | UPSTREAM_QUERY_ID                    |
|-------------+----------------+-----------------+--------------------------------------|
| DT3         | FAILED         | QUERY_FAILURE   | 01ba7614-0107-e56c-0000-a995024f304a |
+-------------+----------------+-----------------+--------------------------------------+

Dans cet exemple, DT4 a été ignoré, car sa dépendance en amont DT3 a échoué avec QUERY_FAILURE. Vous pouvez utiliser l’query_id pour examiner la requête qui a échoué (par exemple, en appelant GET_QUERY_OPERATOR_STATS ou en vérifiant l’historique des requêtes).

Pour les chaînes de dépendances plus longues, répétez le même schéma : remplacez le nom de la table dynamique cible pour aller plus en amont jusqu’à ce que vous atteigniez un span avec state = 'FAILED' et state_reason = 'QUERY_FAILURE', qui est la cause principale.

Déterminer l’impact en aval d’une défaillance

Pour savoir quelles tables dynamiques ont été affectées par une défaillance spécifique, inversez la recherche du lien de span. Cette requête recherche toutes les tables dynamiques dont les record:"links" référencent l’span_id de la table dynamique ayant échoué :

WITH pipeline AS (
  SELECT
    trace:"span_id"::STRING AS span_id,
    resource_attributes:"snow.executable.name"::STRING AS dt_name,
    record_attributes:"snow.dynamic_table.state"::STRING AS state,
    record_attributes:"snow.dynamic_table.state_reason"::STRING AS state_reason,
    record:"links" AS upstream_links
  FROM my_event_table
  WHERE record_type = 'SPAN'
    AND record:"name" = 'table_refresh'
    AND record_attributes:"snow.dynamic_table.data_timestamp" = '2026-02-13T10:00:00.000'
)
SELECT p.dt_name, p.state, p.state_reason
FROM pipeline p,
LATERAL FLATTEN(input => p.upstream_links) f
WHERE f.value:"span_id"::STRING = 'a1b2c3d4';
+---------+---------+-----------------+
| DT_NAME | STATE   | STATE_REASON    |
|---------+---------+-----------------|
| DT4     | SKIPPED | UPSTREAM_FAILURE|
+---------+---------+-----------------+

Cela renvoie les dépendances directes de la table dynamique ayant échoué. Pour trouver toutes les tables dynamiques affectées de façon transitoire, répétez la requête avec l’span_id de chaque dépendant pour aller plus en aval.

Utiliser des outils compatibles OpenTelemetry

Les spans de pipeline de table dynamique suivent le modèle de données OpenTelemetry standard. Parce que tous les spans d’un cycle d’actualisation partagent le même trace:"trace_id", vous pouvez les exporter depuis la table des événements vers les outils compatibles OpenTelemetry pour la visualisation.

Ces outils peuvent restituer le pipeline sous la forme d’une chronologie de trace, montrant la durée et le statut de l’opération d’actualisation de chaque table dynamique, ainsi que les relations de dépendance codées dans les liens de span.