Snowflake 应用程序中的可观察性

通过 Snowflake 内置的可观察性,您可以确保您的应用程序尽可能高效地运行。使用本主题中描述的实践和功能,您可以充分利用可观察性功能,向您展示可在哪些方面改进代码。

什么是可观察性?

在可观察系统中,您可以通过系统生成的外部证据(包括遥测数据、提醒和通知在内的证据)了解内部正在发生的事情。

通过它提供的内部功能证据,可观察性让您可以更轻松地对生产系统上难以理解的行为进行故障排除。在分布式系统中尤其如此。在分布式系统中,通过观察收集的证据让您可以了解多个组件的行为。您可以分析从生产环境中收集的数据,而不是中断生产环境来诊断问题。

使用可可观察的系统,您可以开始回答以下问题:

  • 系统的性能如何?

  • 延迟在哪里?是什么原因造成的?

  • 为什么特定的组件或流程无法正常工作?

  • 可以做出哪些改进?

Snowflake 中的可观察性

Snowflake 支持一种模型,该模型提供内置的可观察数据,同时还允许您在需要的地方添加更多仪器。虽然 Snowflake 支持日志、指标和跟踪等遥测数据(这是可观测性的典型特征),但它还包括其他可用于跟踪系统使用情况和性能的功能。

下面列出了可用于接收和分析系统性能和使用情况的功能。

收集的遥测数据

当您的应用程序生成日志、指标和跟踪时,Snowflake 会在事件表中收集这些遥测数据。使用 Snowsight,您可以浏览数据,寻找模式。

您可以向事件表发出自定义遥测,以提供特定域的上下文信息,从而加快调试速度。

历史记录表

使用以下视图及其关联表来监控您账户中的所有使用情况。

提醒和通知

提醒允许自定义设置触发条件、操作和计划,并结合用于主动监控的通知集成。

使用第三方工具实现可扩展性

Snowflake 事件表 采用 OpenTelemetry (https://opentelemetry.io/docs/) 标准,因此 Snowflake 遥测可以轻松地被其他生态系统工具使用。

收集遥测数据进行分析

当应用程序中的代码执行时,您可以让 Snowflake 从代码中收集数据,告诉您应用程序的内部状态。使用这些遥测数据(在 Snowflake 事件表 [您的账户 默认有一个] 中收集),您可以寻找瓶颈和其他优化机会。

遥测数据必须在代码执行时发出。Snowflake 代表您的代码发出一些遥测数据,而无需您对代码进行检测。您还可以使用 Snowflake APIs 附带的功能,从代码的特定部分发出遥测数据。

如下所述,您可以查询事件表或使用捕获 Snowsight 中数据的可视化,以分析收集的数据。

遥测数据的类型

为确保您收集的遥测数据具有广泛用途,Snowflake 遥测基于标准 OpenTelemetry (https://opentelemetry.io/docs/) (有时称为 OTel)框架构建,该框架是 Cloud Native Compute Foundation 的孵化项目。通过此框架(APIs 以及为其设计的工具),您可以使用 Snowflake 以外的工具 重用收集的数据。通过 OpenTelemetry,您可以对应用程序代码进行检测,以在所需位置添加可观察性。

Snowflake 事件表收集 OpenTelemetry 数据模型中的日志、跨度和指标数据。下面描述了在事件表中收集的每种遥测数据。

日志

日志记录由代码执行的各项操作。每条日志消息都是在代码执行期间的离散点生成。

检测代码 您可以使用所用语言的标准库从代码中进行记录,如 从处理程序代码记录 中所列。

查看数据 您可以通过查询事件表或查看 Snowsight 中提供的可视化效果,查看日志消息 以进行分析。

Snowsight 的下图显示了在单个数据库中两小时内收集的日志消息列表。

Traces & Logs 页面的 Logs 选项卡的屏幕截图,显示了用户定义函数执行期间收集的日志消息 表。

指标

指标是在一段时间内计算的测量值。这些值包括 CPU 和内存测量值。

检测代码 Snowflake 会在代码执行时自动发出指标数据,因此您无需对代码进行检测。

查看数据 您可以通过查询事件表或查看 Snowsight 中提供的可视化效果,查看指标数据 以进行分析。

Snowsight 的下图显示了为执行用户定义函数而收集的指标数据的变化。

图表的屏幕截图,显示了用户定义函数执行期间收集的内存和 CPU 测量值。

跟踪

跟踪显示数据流经系统时的分布式事件。在跟踪中,您可以看到在处理从一个组件到另一个组件的流时时间花在了哪里。

您可以使用所用语言的标准库,在 Snowflake 创建的默认跨度内或从您创建的自定义跨度中发出跟踪事件,如 从处理程序代码记录 中所列。

检测代码 您可以使用所用语言的标准库从代码中发出跟踪事件,如 通过处理程序代码进行事件跟踪 中所列。

查看数据 您可以通过查询事件表或查看 Snowsight 中提供的可视化效果,查看跟踪事件 以进行分析。

Snowsight 的下图显示了 UDF 执行时产生的跨度。

Query Telemetry 选项卡的屏幕截图,显示了用户定义函数执行的跨度。

遥测最佳实践

使用以下最佳实践,充分利用 Snowflake 的可观察性。

设置环境以在需要之前捕获遥测数据

您无法分析尚未收集的数据,因此最好开始收集遥测数据,以便在需要时拥有这些数据。随着部署的增长,您需要了解代码性能的增长情况。

使用以下最佳实践:

  • 为您的 Snowflake 环境 启用遥测数据收集

    要收集所需的数据,请确保您具有由活动事件表。

  • 为确保您正在收集所需的遥测数据,请 将遥测级别设置为 有用的阈值。

    首先,您需要设置这些级别以确保收集数据。例如,为任何生产或业务关键性任务将日志级别至少设置为 WARN。随着时间的推移,您可以调整这些级别以满足不断变化的需求。

    在数据库或架构下整理生产存储程序、UDFs 和其他对象,这样您就可以轻松地为该数据库或架构启用警告日志。这样可以省去管理单独对象的设置的麻烦。

  • 要生成数据以进行故障排除,请在生产作业中添加 日志语句跟踪事件

    当您使用 :ref:`标准日志记录库 <label-logging_handler_code>`(例如 Java SLF4J 或 Python 日志记录库)时,Snowflake 会自动将日志从这些包路由到您的事件表。

    要进行跟踪,您可以使用 Snowflak 附带的 遥测库

  • 要在跟踪数据中包含要测量的处理程序处理部分,请在存储程序处理程序代码中添加 自定义跨度

    除了来自 Snowflake 对象的内置跨度外,Snowflake 还代表您在跟踪图中创建的自定义跨度。使用自定义跨度,您可以捕获有关代码处理的任意部分的数据,以查看这些部分需要多长时间才能执行。您还可以将任意元数据附加到自定义跨度,为数据添加描述以进行故障排除和优化。

使用查询遥测来优化程序

在 Query Telemetry 跟踪图中,您将找到有关查询发出的所有跨度的数据。

  • 水平轴显示持续时间。相较于较短的跨度,水平长度更长的跨度要花费更长的时间才能完成。

  • 垂直轴显示调用层次结构。在该层次结构中,直接位于另一个跨度之下的跨度都是其上方“父”跨度的“子跨度”。

Query History 页面的 Query Telemetry 选项卡的屏幕截图,显示了过程调用的跨度。

您可以使用此图来寻找存储程序的优化机会。以您在图中看到的内容为起点,您可以采取措施来优化代码。

例如,您可以组织顺序操作,使其使用 joblib 等库并行执行。Joblib (https://joblib.readthedocs.io/en/stable/) 是用于向 Python 代码添加管道的一组工具。借此,您可以更轻松地编写并行代码。

缓存冗余 DataFrame 操作

当您有多次使用的 DataFrame 操作链时,您将在追踪图中将它们视为每个 DataFrame 操作的跨度。根据查询的复杂程度,这个跨度可能会很长。

例如,在下面的代码中,多个上下文调用相同的 DataFrame 链:

count = session.table(...).select().filter().join().count()

if count > 0:
  session.table(...).select().filter().join().write.save_as_table(...) # same query as the count, this will execute again
else:
  session.table(...).select().filter('other criteria').join() # nearly same query as the count
Copy

使用缓存将中间 DataFrame 缓存为临时表,减少冗余查询,从而提高性能:

cached_df = session.table(...).select().filter().join().cache_result()
count = df.count()

if count > 0:
  cached_df.write.save_as_table() # reuses the cached DF
else:
  cached_df
Copy

管理 UDFs 接收的遥测数据量

添加代码以使用 UDFs 收集遥测数据时,请记住,UDF 执行模型可能意味着事件表中的行数比程序的多很多。

为每个输入行调用 UDF 时,您的处理程序代码会针对输入数据集的每一行发出日志记录语句或跨度事件。例如,传递给 UDF 1000 万行的数据集将发出 1000 万个日志条目。

在向 UDFs 添加日志和跨度事件时,请考虑使用以下模式:

  • 最初,使用旨在减少记录条目数量的 日志记录级别

    使用 DEBUG 级或 INFO 级日志记录语句,并在生产环境中将日志记录级别设置为 WARN。如果发现问题,您可以在调试会话期间将日志记录级别降低为 DEBUG 或 INFO。

  • 使用 try/catch 块隔离要从中发出日志数据的代码。

    使用 try/catch 可用于捕获任何意外 UDF 输入,将其记录为 WARN 级别日志以进行感知,并返回默认值。

  • 使用条件语句,仅记录对您有意义的场景。

    使用 if/else 语句或其他约束,您可以控制日志输出的量。

使用查询遥测优化用户定义的函数

调用 UDF 时,Snowflake 为每个输入行创建处理程序代码实例,以并行执行它。在跟踪图中,您将看到这些实例中的每一个实例都表示为其自身的跨度。

您可以使用这些跨度来解决查询慢的问题,并寻找性能提高机会。例如,您可能会看到如下场景:

  • 您的 UDF 代码的一个或多个实例可能会收到一行,其中的数据要大得多,或者与其他数据不同。发生这种情况时,该实例可能需要更长的时间才能完成,因此其跨度要长很多。

  • 根据查询的输入分区和前面的子句,少数实例可能会收到大量的输入数据。

下图显示了传递给 UDF 的每行的跨度,其中一个跨度的持续时间较长,表明该行可能比其他行包含更多的数据。

查询历史记录 Query Telemetry 选项卡的屏幕截图,显示了传递给 UDF 的每行的跨度。

针对时间敏感型响应的提醒和通知

您可以使用 Snowflake 提醒和通知,让系统显示内部情况,然后采取措施或发送有关系统状态的信息。与您稍后收集和分析的遥测数据不同,当您想立即响应系统中发生的事情时,提醒和通知非常有用。

  • 借助 提醒,您可以指定条件、操作和计划,然后指定操作应在条件和计划详细信息得到满足时执行。

    例如,您可以使用提醒来监控您在 SQL 中指定的复杂条件。满足提醒条件后,最常见的操作是发送通知。Snowflake 支持向电子邮件、云服务提供商队列、Slack、PagerDuty 和 Microsoft Teams 发送通知。

  • 借助 通知,您可以使用附带的存储程序,将消息发送给目标,例如 电子邮件地址Webhook (用于聊天工具等客户端工具集成),或者发送给 云服务托管的队列

提醒和通知最佳实践

使用以下实践完善和增加从系统接收的信息量,从而提高可观察性。

  • 避免重复事件评估。

    通过考虑提醒计划和执行之间的延迟,您可以避免重复评估事件。为此,请使用 SCHEDULED_TIMELAST_SUCCESSFUL_SCHEDULED_TIME 指定提醒时间戳,而不是使用 CURRENT_TIMESTAMP

    有关更多信息,请参阅 根据警报计划指定时间戳

  • 使用查询结果丰富提醒操作或通知。

    您可以检查提醒条件所指定的 SQL 语句的结果。要获取查询结果,请执行以下操作:

    1. 通过调用 GET_CONDITION_QUERY_UUID,检索提醒条件的 SQL 语句的查询 ID。

    2. 将查询 ID 传递给 RESULT_SCAN,以获取查询结果。

  • 除发送通知外,还可以记录结果或采取自动操作。

    您可以指定每当满足提醒条件时,提醒操作 运行任务 或将新行记录到表中。例如,如果每次满足提醒条件时您都要在 Snowflake 中执行操作,则可以执行此操作。

    如果您打算在满足条件后执行复杂的操作,请确保您的仓库大小合适。

用于分析和可视化的工具

您可以将事件表中收集的遥测数据与其他支持 OpenTelemetry 数据模型的工具一起使用。

通过 OpenTelemetry 的 Snowflake 支持,您可以使用 APIs、SDKs 和其他工具来检测、生成、收集和导出遥测数据。使用这些工具,您可以更全面地分析软件性能和行为。由于 Snowflake 事件表使用这一广泛适用的标准,因此您还可以将组织的可观察性工具与事件表集成在一起,而且开销很少。

考虑通过以下方式之一集成外部工具:

  • 如果您的可观察性工具可以从外部来源读取,请将它们指向事件表。

  • 如果您的工具使用推送模型(其中必须将遥测数据发送到工具),请考虑使用具有 外部访问权限 的存储程序,以定期从事件表读取遥测数据并将其发送到您的工具。

下面列出了可以与 Snowflake 事件表集成的工具:

  • 适用于 Datadog 的 Snowflake 集成 (https://docs.datadoghq.com/integrations/snowflake_web/)

  • 适用于 Grafana 仪表板的 Snowflake 集成

    • 适用于 Grafana 的 Snowflake 数据源 (https://grafana.com/docs/plugins/grafana-snowflake-datasource/latest/)

    • 适用于 Grafana Cloud 的 Snowflake 集成 (https://grafana.com/docs/grafana-cloud/monitor-infrastructure/integrations/integration-reference/integration-snowflake/)

    有关在 Snowflake 中使用 Grafana 的简介,请参阅 如何使用 Grafana Cloud 监控 Snowflake (https://grafana.com/blog/2023/05/24/how-to-monitor-snowflake-with-grafana-cloud/)。

  • Observe for Snowflake,用于可观察性的 Observe 原生应用程序。

语言: 中文