动态表的事件表监控和警报

本主题讨论如何查询提供刷新状态信息的事件表,以及如何针对事件表中的新数据设置警报。

查询事件表以监控刷新

动态表刷新时,您可以将 Snowflake 配置为记录一个事件,该事件提供有关刷新操作状态的信息。该事件记录在与动态表关联的 活动事件表 中。

例如,假设 已将事件表与数据库关联。该数据库中的动态表刷新时,Snowflake 会将事件记录到该事件表中。

您可以查询此活动事件表中记录的事件以监控动态表刷新。

例如,要获取时间戳、动态表名、查询 ID,以及数据库 my_db 中动态表错误的错误消息,请执行以下操作:

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

以下示例检索架构 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"               |       |                  |             |                             |                   |                               |           |
|                         |                 |                         |       |          | }                                               |       |                  |             |                             |                   |                               |           |
+-------------------------+-----------------+-------------------------+-------+----------+-------------------------------------------------+-------+------------------+-------------+-----------------------------+-------------------+-------------------------------+-----------+

有关查询事件表时需要使用的角色,以及用于筛选结果的条件的信息,请参阅 设置新数据警报

设置新数据警报以监控刷新情况

如前所述,刷新动态表时,事件表中会记录一个事件,以指示刷新是成功还是失败。您可以设置 有新数据时发出警报,以监控事件表。您可以将警报配置为刷新失败时 发送通知

以下部分介绍如何设置事件日志记录以捕获事件、如何设置警报,以及如何解释事件表中记录的事件:

备注

记录动态表的事件会产生费用。请参阅 遥测数据收集成本

设置要捕获的事件的严重性级别

备注

如果您未设置严重性级别,则不会捕获任何事件。

要设置要记录到事件表的动态表事件,请 设置您要在时间表中捕获的事件的严重性级别。事件在以下级别捕获:

  • ERROR:刷新失败事件。

  • WARN:刷新上游动态表失败和刷新失败事件。

  • INFO:成功刷新事件、上游动态表刷新失败和刷新失败事件。

要设置级别,请为账户或对象设置 LOG_EVENT_LEVEL 参数。您可以为以下内容设置级别:

  • 账户中的所有对象。

  • 数据库或架构中的所有对象。

  • 特定的动态表。

例如:

  • 要捕获账户中所有受支持对象的 ERROR 级动态表事件,请执行 ALTER ACCOUNT SET LOG_EVENT_LEVEL

    ALTER ACCOUNT SET LOG_EVENT_LEVEL = ERROR;
    

    在账户级别设置 LOG_EVENT_LEVEL 适用于账户内受支持工作负载(包括动态表)的日志事件(记录类型 EVENT)。它不会取代针对来自日志记录 APIs 的日志消息所设置的 LOG_LEVEL。有关更多信息,请参阅 参数

  • 要捕获数据库 my_db 中所有受支持对象的 INFO 级事件,请执行 ALTER DATABASE ... SET LOG_EVENT_LEVEL

    ALTER DATABASE my_db SET LOG_EVENT_LEVEL = INFO;
    

    与在账户上设置级别的情况类似,在数据库上设置级别会影响数据库内受支持对象类型的日志事件。

  • 要捕获动态表 WARN 的 my_dynamic_table 级事件,请执行 :doc:`

    ALTER DYNAMIC TABLE my_dynamic_table SET LOG_EVENT_LEVEL = WARN;
    

设置新数据警报

设置日志记录事件的严重性级别后,您可以设置新数据警报,以监控事件表中是否有指示动态表刷新失败的新事件。在事件表中插入新行并满足警报中指定的条件时,将触发新数据警报。

备注

要创建新数据警报,您必须使用已被授予查询事件表所需权限的角色。

在警报条件中,要查询动态表事件,请选择 resource_attributes:"snow.executable.type" = 'DYNAMIC_TABLE' 的行。要缩小事件列表的范围,您可以筛选以下列:

  • 要将结果限制为特定数据库中的动态表,请使用 resource_attributes:"snow.database.name"

  • 要返回因动态表错误而刷新失败的事件,请使用 value:state = 'FAILED'

  • 要返回因上游动态表错误而刷新失败的事件,请使用 value:state = 'UPSTREAM_FAILURE'

有关为动态表事件记录的值的信息,请参阅 为动态表事件记录的信息

备注

事件表中的 timestamp 列将值存储在 UTC 中。如果您使用带有时间戳筛选器的计划警报(例如 timestamp > DATEADD('minute', -5, CURRENT_TIMESTAMP())),请将当前时间戳转换为 UTC 以确保准确比较:

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

例如,以下语句会创建新数据警报,在数据库 my_db 中动态表刷新失败时执行操作。该示例假定:

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;

为动态表事件记录的信息

当动态表刷新时,事件将记录到事件表中。以下各章节介绍表示事件的事件表行:

事件表列值

当动态表刷新时,将向事件表中插入具有以下值的行。

备注

如果列未在下面列出,则事件的列值为 NULL。

数据类型

描述

timestamp

TIMESTAMP_NTZ

事件创建时的 UTC 时间戳。

observed_timestamp

TIMESTAMP_NTZ

用于日志的 UTC 时间。目前,这与 timestamp 列中的值相同。

resource_attributes

OBJECT

属性,标识已刷新的动态表。

record_type

STRING

事件类型,即动态表刷新的 EVENT

record

OBJECT

关于动态表刷新状态的 详细信息

value

VARIANT

动态表刷新的状态,如果刷新失败,则为失败的错误消息。

resource_attributes 列中的键值对

resource_attributes 列包含具有以下键值对的 OBJECT 值:

属性名称

属性类型

描述

示例

snow.database.id

INTEGER

包含动态表的数据库的内部/系统生成的标识符。

12345

snow.database.name

VARCHAR

包含动态表的数据库的名称。

MY_DATABASE

snow.executable.id

INTEGER

已刷新的动态表的内部/系统生成的标识符。

12345

snow.executable.name

VARCHAR

已刷新的动态表的名称。

MY_DYNAMIC_TABLE

snow.executable.type

VARCHAR

对象的类型。值为动态表事件的 DYNAMIC_TABLE

DYNAMIC_TABLE

snow.owner.id

INTEGER

具有动态表 OWNERSHIP 权限的角色的内部/系统生成的标识符。

12345

snow.owner.name

VARCHAR

具有动态表 OWNERSHIP 权限的角色的名称。

MY_ROLE

snow.owner.type

VARCHAR

拥有对象的角色类型,例如 ROLE. 如果 Snowflake Native App 拥有该对象,则该值为 APPLICATION. 如果您删除该对象,则 Snowflake 会返回 NULL,原因是删除的对象不具有所有者角色。

ROLE

snow.query.id

VARCHAR

刷新动态表的查询的 ID。

01ba7614-0107-e56c-0000-a995024f304a

snow.schema.id

INTEGER

包含动态表的架构的内部/系统生成的标识符。

12345

snow.schema.name

VARCHAR

包含动态表的架构的名称。

MY_SCHEMA

snow.warehouse.id

INTEGER

用于刷新动态表的仓库的内部/系统生成的标识符。

12345

snow.warehouse.name

VARCHAR

用于刷新动态表的仓库的名称。

MY_WAREHOUSE

record 列中的键值对

record 列包含具有以下键值对的 OBJECT 值:

类型

描述

示例

name

VARCHAR

事件的名称。值为动态表刷新的 refresh.status

refresh.status

severity_text

VARCHAR

事件的严重性级别,为以下值之一:

  • INFO:刷新成功。

  • ERROR:刷新失败。

  • WARN:上游动态表刷新失败。

INFO

value 列中的键值对

value 列包含具有以下键值对的 VARIANT 值:

类型

描述

示例

state

VARCHAR

刷新状态,为以下值之一:

  • SUCCEEDED:刷新成功。

  • FAILED:刷新失败。

  • UPSTREAM_FAILURE:由于无法刷新此动态表所依赖的动态表,刷新失败。

SUCCEEDED

message

VARCHAR

如果 state 中的值为 FAILED,则此列包含错误消息。

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.

查询管道 Span 以跟踪刷新

除了 事件 外,Snowflake 还可以记录动态表刷新的管道 Span。事件和 Span 是两种不同的可观察性机制:

  • **事件**(由 LOG_LEVEL 控制)提供每次动态表刷新的日志,指示每次刷新是成功还是失败。

  • **Span**(由 TRACE_LEVEL 控制)提供更丰富的管道级可观察性,包括管道中的关联跟踪 IDs、跳过原因和依赖关系拓扑。

Span 会捕获不会生成事件的其他状态,包括由于上游跳过导致的 SKIPPED 刷新,周期而导致的刷新,或调度器为尽量减少动态表及其使用者延迟而跳过刷新的刷新周期。

备注

记录动态表的 Span 会产生费用。请参阅 遥测数据收集成本

启用管道 Span

要为动态表刷新启用管道 Span,请在数据库或模式级别,将 TRACE_LEVEL 参数设置为 ALWAYS

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

您还可以在数据库级别进行设置,以捕获数据库中所有动态表的 Span:

ALTER DATABASE my_db SET TRACE_LEVEL = 'ALWAYS';

查询 Span 数据

要查询动态表刷新的管道 Span,请筛选 record_type = 'SPAN'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;

Span 属性 (record_attributes)

每个 Span 行都会在 record_attributes 列中包含特定于动态表刷新的以下属性:

属性名称

类型

描述

snow.dynamic_table.state

STRING

刷新的状态:SUCCEEDEDFAILEDSKIPPED

snow.dynamic_table.state_reason

STRING

动态表被跳过或失败的原因。如果成功,则为 NULL。可能的值如下:

  • QUERY_FAILURE:刷新查询失败。

  • UPSTREAM_FAILURE:上游动态表刷新失败。

  • UPSTREAM_SKIP:跳过了上游动态表。

  • NOT_EFFECTIVE_TICK_TO_REFRESH:选择使用 时默认使用的角色和仓库。管道运行已经落后于计划,跳过此刷新操作以尽量减少此动态表及其使用者延迟。

snow.dynamic_table.data_timestamp

STRING

评估刷新时的事务时间戳。(这可能略早于刷新的实际时间。)动态表包含在该时间戳之前到达的基本对象中的所有数据。

备注

Span 覆盖 SKIPPED 状态(含原因 UPSTREAM_SKIPNOT_EFFECTIVE_TICK_TO_REFRESH),而这些状态不会产生事件。如果需要查看跳过的刷新,请使用 Span 而不是事件。

跟踪管道刷新

本节介绍如何使用管道 Span 端到端跟踪刷新周期:查找相关 Span、检索完整管道以及诊断故障或跳过。

管道场景示例

考虑一个由四个动态表组成的线性管道:

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

在此示例中,DT1DT2 刷新成功,但 DT3 由于查询错误而失败。因为 DT3 失败,会自动跳过 DT4,并注明原因 UPSTREAM_FAILURE

以下步骤展示了如何检索和解读此场景的管道 Span。

第 1 步:查找动态表的 Span

要调查特定动态表的刷新,请查询事件表以获取其最近的 Span。按数据库、模式和动态表名称进行筛选,以确保匹配正确的对象:

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

trace_id 值标识刷新周期。单次管道刷新中的所有动态表 Span 共享相同的 trace_id。在下一步中使用此值检索同一刷新周期中的所有 Span。

第 2 步:检索完整管道

查询共享相同 trace_id 的所有 Span,以查看刷新周期中的每个动态表。包括 record:"links" 以捕获依赖关系图,并包括 DATEDIFF 以计算每个刷新操作的持续时间:

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", ...}]              |
+----------+------------------+---------+-----------+-----------------+--------------------------------------+-------------------------+-------------------------+--------------+---------------------------------------------+

通过此结果,您可以全面了解刷新周期:

  • DT1DT2 成功(分别为 30 和 29 秒)。

  • DT3 由于查询失败,在 19 秒后失败。

  • DT4 因为其上游依赖项失败,被立即跳过(以零持续时间 Span 表示)。

  • UPSTREAM_LINKS 列按 span_id 显示每个动态表的直接依赖项。

第 3 步:确定失败或跳过的根本原因

当动态表被跳过或失败时,您可以通过 Span 链接跟踪其上游依赖项,以找出根本原因。此查询会将特定动态表的 Span 链接解析回管道中的其他 Span:

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

在此示例中,DT4 被跳过,因为它的上游依赖项 DT3 失败,原因是 QUERY_FAILURE。您可以使用 query_id 进一步调查失败的查询(例如,通过调用 GET_QUERY_OPERATOR_STATS 或查看 查询历史记录)。

对于更长的依赖关系链,请重复相同的模式:替换目标动态表名称以进一步向上游追溯,直到找到 state = 'FAILED'state_reason = 'QUERY_FAILURE' 的 Span,这就是根本原因。

了解失败对下游的影响

要查找哪些动态表受到特定失败的影响,请反向进行 Span 链路查找。此查询会查找其 record:"links" 引用了失败动态表的 span_id 的所有动态表:

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

这将返回失败的动态表的直接依赖项。要查找所有受影响的传递性动态表,请对每个依赖项的 span_id 重复该查询,从而进一步向下游追踪。

使用兼容 OpenTelemetry 的工具

动态表管道 Span 采用标准 OpenTelemetry 数据模型。因为刷新周期中的所有 Span 共享相同的 trace:"trace_id",因此您可以将它们从事件表导出到兼容 OpenTelemetry 的工具以生成可视化图表。

这些工具可以将管道呈现为跟踪时间线,显示每个动态表刷新操作的持续时间和状态,以及在 Span 链路中编码的依赖关系。