动态表的事件表监控和警报¶
本主题讨论如何查询提供刷新状态信息的事件表,以及如何针对事件表中的新数据设置警报。
查询事件表以监控刷新¶
动态表刷新时,您可以将 Snowflake 配置为记录一个事件,该事件提供有关刷新操作状态的信息。该事件记录在与动态表关联的 活动事件表 中。
例如,假设 已将事件表与数据库关联。该数据库中的动态表刷新时,Snowflake 会将事件记录到该事件表中。
您可以查询此活动事件表中记录的事件以监控动态表刷新。
例如,要获取时间戳、动态表名、查询 ID,以及数据库 my_db 中动态表错误的错误消息,请执行以下操作:
以下示例检索架构 my_schema 中动态表的上游错误的所有列:
有关查询事件表时需要使用的角色,以及用于筛选结果的条件的信息,请参阅 设置新数据警报。
设置新数据警报以监控刷新情况¶
如前所述,刷新动态表时,事件表中会记录一个事件,以指示刷新是成功还是失败。您可以设置 有新数据时发出警报,以监控事件表。您可以将警报配置为刷新失败时 发送通知。
以下部分介绍如何设置事件日志记录以捕获事件、如何设置警报,以及如何解释事件表中记录的事件:
备注
记录动态表的事件会产生费用。请参阅 遥测数据收集成本。
设置要捕获的事件的严重性级别¶
备注
如果您未设置严重性级别,则不会捕获任何事件。
要设置要记录到事件表的动态表事件,请 设置您要在时间表中捕获的事件的严重性级别。事件在以下级别捕获:
ERROR:刷新失败事件。WARN:刷新上游动态表失败和刷新失败事件。INFO:成功刷新事件、上游动态表刷新失败和刷新失败事件。
要设置级别,请为账户或对象设置 LOG_EVENT_LEVEL 参数。您可以为以下内容设置级别:
账户中的所有对象。
数据库或架构中的所有对象。
特定的动态表。
例如:
要捕获账户中所有受支持对象的 ERROR 级动态表事件,请执行 ALTER ACCOUNT SET LOG_EVENT_LEVEL:
在账户级别设置
LOG_EVENT_LEVEL适用于账户内受支持工作负载(包括动态表)的日志事件(记录类型 EVENT)。它不会取代针对来自日志记录 APIs 的日志消息所设置的 LOG_LEVEL。有关更多信息,请参阅 参数。要捕获数据库
my_db中所有受支持对象的 INFO 级事件,请执行 ALTER DATABASE ... SET LOG_EVENT_LEVEL:与在账户上设置级别的情况类似,在数据库上设置级别会影响数据库内受支持对象类型的日志事件。
要捕获动态表 WARN 的
my_dynamic_table级事件,请执行 :doc:`:
设置新数据警报¶
设置日志记录事件的严重性级别后,您可以设置新数据警报,以监控事件表中是否有指示动态表刷新失败的新事件。在事件表中插入新行并满足警报中指定的条件时,将触发新数据警报。
备注
要创建新数据警报,您必须使用已被授予查询事件表所需权限的角色。
如果警报条件查询默认事件表 (SNOWFLAKE.TELEMETRY.EVENTS)或预定义视图(SNOWFLAKE.TELEMETRY.EVENTS_VIEW 视图),请参阅 访问默认事件表和 EVENTS_VIEW 的角色。
要管理 EVENTS_VIEW 视图的访问权限,请参阅 管理对 EVENTS_VIEW 视图的访问权限。
如果警报条件查询自定义事件表,请参阅 事件表的访问控制权限。
要管理自定义事件表的访问权限,请参阅 管理对事件表数据的访问。
在警报条件中,要查询动态表事件,请选择 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 以确保准确比较:
例如,以下语句会创建新数据警报,在数据库 my_db 中动态表刷新失败时执行操作。该示例假定:
您的活动事件表是 默认事件表 (SNOWFLAKE.TELEMETRY.EVENTS)。
您已为该 Slack 通道 设置 Webhook 通知集成。
为动态表事件记录的信息¶
当动态表刷新时,事件将记录到事件表中。以下各章节介绍表示事件的事件表行:
事件表列值¶
当动态表刷新时,将向事件表中插入具有以下值的行。
备注
如果列未在下面列出,则事件的列值为 NULL。
resource_attributes 列中的键值对¶
resource_attributes 列包含具有以下键值对的 OBJECT 值:
属性名称 |
属性类型 |
描述 |
示例 |
|---|---|---|---|
|
INTEGER |
包含动态表的数据库的内部/系统生成的标识符。 |
|
|
VARCHAR |
包含动态表的数据库的名称。 |
|
|
INTEGER |
已刷新的动态表的内部/系统生成的标识符。 |
|
|
VARCHAR |
已刷新的动态表的名称。 |
|
|
VARCHAR |
对象的类型。值为动态表事件的 |
|
|
INTEGER |
具有动态表 OWNERSHIP 权限的角色的内部/系统生成的标识符。 |
|
|
VARCHAR |
具有动态表 OWNERSHIP 权限的角色的名称。 |
|
|
VARCHAR |
拥有对象的角色类型,例如 |
|
|
VARCHAR |
刷新动态表的查询的 ID。 |
|
|
INTEGER |
包含动态表的架构的内部/系统生成的标识符。 |
|
|
VARCHAR |
包含动态表的架构的名称。 |
|
|
INTEGER |
用于刷新动态表的仓库的内部/系统生成的标识符。 |
|
|
VARCHAR |
用于刷新动态表的仓库的名称。 |
|
record 列中的键值对¶
record 列包含具有以下键值对的 OBJECT 值:
键 |
类型 |
描述 |
示例 |
|---|---|---|---|
|
VARCHAR |
事件的名称。值为动态表刷新的 |
|
|
VARCHAR |
事件的严重性级别,为以下值之一:
|
|
value 列中的键值对¶
value 列包含具有以下键值对的 VARIANT 值:
键 |
类型 |
描述 |
示例 |
|---|---|---|---|
|
VARCHAR |
刷新状态,为以下值之一:
|
|
|
VARCHAR |
如果 |
|
查询管道 Span 以跟踪刷新¶
除了 事件 外,Snowflake 还可以记录动态表刷新的管道 Span。事件和 Span 是两种不同的可观察性机制:
**Span**(由 TRACE_LEVEL 控制)提供更丰富的管道级可观察性,包括管道中的关联跟踪 IDs、跳过原因和依赖关系拓扑。
Span 会捕获不会生成事件的其他状态,包括由于上游跳过导致的 SKIPPED 刷新,周期而导致的刷新,或调度器为尽量减少动态表及其使用者延迟而跳过刷新的刷新周期。
备注
记录动态表的 Span 会产生费用。请参阅 遥测数据收集成本。
启用管道 Span¶
要为动态表刷新启用管道 Span,请在数据库或模式级别,将 TRACE_LEVEL 参数设置为 ALWAYS:
您还可以在数据库级别进行设置,以捕获数据库中所有动态表的 Span:
查询 Span 数据¶
要查询动态表刷新的管道 Span,请筛选 record_type = 'SPAN' 且 record:"name" = 'table_refresh' 的行:
Span 属性 (record_attributes)¶
每个 Span 行都会在 record_attributes 列中包含特定于动态表刷新的以下属性:
属性名称 |
类型 |
描述 |
|---|---|---|
|
STRING |
刷新的状态: |
|
STRING |
动态表被跳过或失败的原因。如果成功,则为 NULL。可能的值如下:
|
|
STRING |
评估刷新时的事务时间戳。(这可能略早于刷新的实际时间。)动态表包含在该时间戳之前到达的基本对象中的所有数据。 |
备注
Span 覆盖 SKIPPED 状态(含原因 UPSTREAM_SKIP 和 NOT_EFFECTIVE_TICK_TO_REFRESH),而这些状态不会产生事件。如果需要查看跳过的刷新,请使用 Span 而不是事件。
通过跟踪 IDs 和 Span 链接建立的管道关联¶
Span 的一项独特功能是管道级别的关联。当刷新周期包括多个动态表的刷新操作时,所有生成的 Span 将共享相同的 trace:"trace_id"。这使您可以重建在单个刷新周期中发生的完整刷新操作集合。
每个 Span 还包括一个 record:"links" 数组,该数组会列出每个上游依赖项的 span_id。例如,如果 DT_B 依赖 DT_A,则 DT_A 的 span_id 会出现在 DT_B 的 record:"links" 中
record:"status":"code" 字段为 STATUS_CODE_OK 表示成功和跳过,而 STATUS_CODE_ERROR 则表示失败。
例如,要关联单个刷新周期中的所有动态表刷新操作,请查询具有相同 trace_id 的 Span:
跟踪管道刷新¶
本节介绍如何使用管道 Span 端到端跟踪刷新周期:查找相关 Span、检索完整管道以及诊断故障或跳过。
管道场景示例¶
考虑一个由四个动态表组成的线性管道:
在此示例中,DT1 和 DT2 刷新成功,但 DT3 由于查询错误而失败。因为 DT3 失败,会自动跳过 DT4,并注明原因 UPSTREAM_FAILURE。
以下步骤展示了如何检索和解读此场景的管道 Span。
第 1 步:查找动态表的 Span¶
要调查特定动态表的刷新,请查询事件表以获取其最近的 Span。按数据库、模式和动态表名称进行筛选,以确保匹配正确的对象:
trace_id 值标识刷新周期。单次管道刷新中的所有动态表 Span 共享相同的 trace_id。在下一步中使用此值检索同一刷新周期中的所有 Span。
第 2 步:检索完整管道¶
查询共享相同 trace_id 的所有 Span,以查看刷新周期中的每个动态表。包括 record:"links" 以捕获依赖关系图,并包括 DATEDIFF 以计算每个刷新操作的持续时间:
通过此结果,您可以全面了解刷新周期:
DT1和DT2成功(分别为 30 和 29 秒)。DT3由于查询失败,在 19 秒后失败。DT4因为其上游依赖项失败,被立即跳过(以零持续时间 Span 表示)。UPSTREAM_LINKS列按span_id显示每个动态表的直接依赖项。
第 3 步:确定失败或跳过的根本原因¶
当动态表被跳过或失败时,您可以通过 Span 链接跟踪其上游依赖项,以找出根本原因。此查询会将特定动态表的 Span 链接解析回管道中的其他 Span:
在此示例中,DT4 被跳过,因为它的上游依赖项 DT3 失败,原因是 QUERY_FAILURE。您可以使用 query_id 进一步调查失败的查询(例如,通过调用 GET_QUERY_OPERATOR_STATS 或查看 查询历史记录)。
对于更长的依赖关系链,请重复相同的模式:替换目标动态表名称以进一步向上游追溯,直到找到 state = 'FAILED' 且 state_reason = 'QUERY_FAILURE' 的 Span,这就是根本原因。
了解失败对下游的影响¶
要查找哪些动态表受到特定失败的影响,请反向进行 Span 链路查找。此查询会查找其 record:"links" 引用了失败动态表的 span_id 的所有动态表:
这将返回失败的动态表的直接依赖项。要查找所有受影响的传递性动态表,请对每个依赖项的 span_id 重复该查询,从而进一步向下游追踪。
使用兼容 OpenTelemetry 的工具¶
动态表管道 Span 采用标准 OpenTelemetry 数据模型。因为刷新周期中的所有 Span 共享相同的 trace:"trace_id",因此您可以将它们从事件表导出到兼容 OpenTelemetry 的工具以生成可视化图表。
这些工具可以将管道呈现为跟踪时间线,显示每个动态表刷新操作的持续时间和状态,以及在 Span 链路中编码的依赖关系。