从未处理的异常获取消息

默认情况下,当您 设置事件表 后,Snowflake 会自动记录事件表中过程和 UDF 处理程序中未处理的异常。获取这些消息不需要添加特定于日志记录或跟踪的处理程序代码。您可禁用此功能,这样就不会自动记录未处理的异常。

重要

错误消息可能包含敏感信息。如果不希望在事件表中获取潜在的敏感信息,请考虑禁用此功能。要了解更多信息,请参阅 保护敏感数据

备注

该功能目前仅支持用 Java 或 Python 编写的处理程序代码。

配置日志记录和跟踪以获取未处理的异常

设置日志或跟踪级别,以便 Snowflake 获取未处理异常的条目。您可以以日志条目和/或跟踪事件条目的形式获取条目。

为未处理的异常获取的数据

您可以以日志条目和/或跟踪事件的形式获取消息数据。获取的数据在日志和跟踪事件条目之间会有所不同。

日志条目中获取的数据

默认情况下,对于过程和 UDF 处理程序中未处理的异常,Snowflake 会在事件表中记录以下内容:

数据

RECORD 列

severity_text 属性,其值是当前语言运行时的最高严重性错误级别。例如,对于用 Python 编写的处理程序,值为 FATAL

RECORD_ATTRIBUTES 列

对于未处理的异常,记录以下属性。

  • exception.message – 错误消息。

  • exception.type – 异常类的名称。

  • exception.stacktrace – 由语言运行时格式化的异常堆栈跟踪。

  • exception.escaped – 如果此条目来自未处理的异常,则为 true

VALUE 列

字符串 exception

示例

以下示例中的代码在事件表中查询以下数据:为 UDF 处理程序中未处理的异常记录的日志数据。

有关在事件表中查询日志数据的更多信息,请参阅 访问已记录消息的数据

SET event_table_name = 'my_db.public.my_event_table';

SELECT
  RECORD['severity_text'] AS severity,
  RECORD_ATTRIBUTES['exception.message'] AS error_message,
  RECORD_ATTRIBUTES['exception.type'] AS exception_type,
  RECORD_ATTRIBUTES['exception.stacktrace'] AS stacktrace
FROM
  my_event_table
WHERE
  RECORD_TYPE = 'LOG';
Copy

以下是来自查询的可能输出。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SEVERITY | ERROR_MESSAGE                                        | EXCEPTION_TYPE | STACKTRACE                                                                                                                                          |
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| "FATAL"  | "could not convert string to float: '$1,000,000.00'" | "ValueError"   | "Traceback (most recent call last):\n  File \"_udf_code.py\", line 6, in compute\nValueError: could not convert string to float: '$1,000,000.00'\n" |
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

跟踪事件条目中获取的数据

默认情况下,对于过程和 UDF 处理程序中未处理的异常,Snowflake 会在事件表中记录以下内容:

数据

RECORD 列

值为 exceptionname 属性和值为 STATUS_CODE_ERRORstatus 属性。

RECORD_ATTRIBUTES 列

对于未处理的异常,记录以下属性。

  • exception.message – 错误消息。

  • exception.type – 异常类的名称。

  • exception.stacktrace – 由语言运行时格式化的异常堆栈跟踪。

  • exception.escaped – 如果此条目来自未处理的异常,则为 true

示例

以下示例中的代码在事件表中查询以下数据:为 UDF 处理程序中未处理的异常记录的跟踪事件数据。

有关在事件表中查询跟踪事件数据的更多信息,请参阅 访问跟踪数据

span 示例
SET event_table_name = 'my_db.public.my_event_table';

SELECT
  RECORD['status']['code'] AS span_status
FROM
  my_event_table
WHERE
  record_type = 'SPAN';
Copy

以下是来自查询的可能输出。

-----------------------
| SPAN_STATUS         |
-----------------------
| "STATUS_CODE_ERROR" |
-----------------------
span 事件示例
SET event_table_name = 'my_db.public.my_event_table';

SELECT
  RECORD['name'] AS event_name,
  RECORD_ATTRIBUTES['exception.message'] AS error_message,
  RECORD_ATTRIBUTES['exception.type'] AS exception_type,
  RECORD_ATTRIBUTES['exception.stacktrace'] AS stacktrace
FROM
  my_event_table
WHERE
  RECORD_TYPE = 'SPAN_EVENT';
Copy

以下是来自查询的可能输出。

-----------------------------------------------------------------------------------------------------------------------------------------
| EVENT_NAME  | ERROR_MESSAGE                                        | EXCEPTION_TYPE | STACKTRACE                                      |
-----------------------------------------------------------------------------------------------------------------------------------------
| "exception" | "could not convert string to float: '$1,000,000.00'" | "ValueError"   | "  File \"_udf_code.py\", line 6, in compute\n" |
-----------------------------------------------------------------------------------------------------------------------------------------

保护敏感数据

鉴于来自未处理的异常的日志和跟踪消息可能包含敏感数据,请考虑执行以下操作来保护此类数据:

  • 采取措施来保护敏感数据,例如执行以下操作:

    • 改进异常处理代码,将未处理异常的风险降至最低。

    • 行访问策略 应用于您的事件表,限制对包含个人身份信息 (PII) 的行的访问权限。

    • 在事件表顶部 创建视图 并对其 应用掩码策略,以掩码或删除个人身份信息 (PII)。

  • ENABLE_UNHANDLED_EXCEPTIONS_REPORTING 参数设置为 false,从而关闭未处理的异常日志记录。

语言: 中文