为应用程序设置日志记录和事件共享¶
本主题介绍如何设置日志记录和事件共享以排除已安装应用程序的故障。
本主题提供有关作为提供商设置日志记录和事件共享的信息。有关配置此功能时需满足的使用者要求,请参阅 为应用程序启用日志记录和事件共享。
日志记录和跟踪事件允许您收集有关应用程序的信息以排查错误。使用日志记录和跟踪事件,您还可以更好地了解应用程序的运行方式并在以后改进应用程序。
作为提供商设置日志记录和事件共享的工作流程¶
作为提供商,您可以通过执行以下操作来设置应用程序的日志记录和事件共享:
使用者安装应用程序并启用日志记录和事件共享后,您可以查看已安装应用程序共享的日志和事件信息:
使用日志记录和事件共享时的注意事项¶
在为应用程序启用日志记录和事件共享之前,提供商必须考虑以下几点:
提供商需承担提供商方面事件共享相关的所有费用,包括数据引入和存储。
提供商必须在您想要支持事件共享的每个区域拥有 存储共享事件的账户。
提供商必须在清单文件中定义应用程序的默认日志级别和跟踪级别。
备注
对于与作为基础的应用程序包安装在相同账户中的应用程序,无法启用事件共享。要测试应用程序的事件共享,提供商必须使用多个账户。
在函数和过程中配置日志记录和跟踪事件¶
Native Apps Framework 需要一个事件表来存储由应用程序中的函数和存储过程生成的日志消息和跟踪事件。
备注
如果应用程序的使用者在安装应用程序之前没有设置事件表并使其成为活动表,则事件和日志数据将被丢弃。
一个账户可以有多个事件表,但一次只能将其中一个设置为 Snowflake 账户的活动事件表。如果没有活动事件表,则无法获取应用程序生成的日志消息和跟踪事件。即使应用程序中的函数和程序调用了日志记录和跟踪事件 APIs,也是如此。
要创建事件表,请使用 CREATE EVENT TABLE 命令。有关更多信息,请参阅 设置事件表。
在代码记录了日志消息和跟踪事件之后,提供商可以查询记录的数据。
有关记录和查询日志和跟踪数据的信息,请参阅以下内容:
在清单文件中设置日志和跟踪级别¶
要设置应用程序某个版本的默认日志和跟踪事件级别,请设置清单文件中的 log_level
和 trace_level
参数,如下例所示:
artifacts:
setup_script: setup.sql
configuration:
trace_level: OFF
log_level: DEBUG
在提供商启用跟踪时, Snowflake Native App 会自动获取所有查询和存储过程调用的开始时间和结束时间。
备注
如果将 trace_level
属性设置为 OFF
以外的值,则发布 Snowflake Native App 可能会向使用者账户中可查看事件表的任何用户公开对隐藏存储过程的调用。
有关 trace_level
和 log_level
的受支持值的信息,请参阅 设置跟踪级别 和 设置日志级别。
最初安装 Snowflake Native App 时,它使用清单文件中定义的日志级别。如果在后续升级中更改了日志级别,则新的日志级别将在升级过程完成后生效。
日志和跟踪级别只能在清单文件中设置。不允许使用者使用 ALTER APPLICATION 或 ALTER DATABASE 命令修改日志级别。
类似地,应用程序会忽略日志记录级别的任何会话级别设置。
查看应用程序包中定义的日志记录和跟踪事件级别¶
使用 DESCRIBE APPLICATION 命令查看已安装应用程序的日志记录级别,如以下命令所示:
DESC APPLICATION HelloSnowflake;
使用 SHOW VERSIONS 命令查看应用程序包中定义的应用程序版本的日志记录级别,如下例所示:
SHOW VERSIONS
IN APPLICATION PACKAGE HelloSnowflake;
查看事件表中的日志和事件¶
要查看事件表中存储的日志和事件,请使用 SELECT 命令,如下例所示:
SELECT * FROM EVENT_DB.EVENT_SCHEMA.MY_EVENT_TABLE
确定是否在使用者账户中启用了事件共享¶
某些情况下,提供商可能需要确定是否已在使用者账户中启用事件共享。例如,如果事件表不可用,提供商可能需要禁用应用程序功能。
要确定是否在使用者账户中启用了事件共享,提供商可在定义应用程序逻辑时调用以下系统函数:
IS_APPLICATION_SHARING_EVENTS_WITH_PROVIDER
如果应用程序启用了事件共享,并且使用者账户中提供了活跃事件表,则返回 TRUE。否则返回 FALSE。
IS_APPLICATION_INSTALLED_FROM_SAME_ACCOUNT
如果应用程序与作为其基础的应用程序包安装在相同的账户中,则返回 TRUE。否则返回 FALSE。
备注
只能从应用程序内部调用这些系统函数。请参阅 确定是否使用 Python Permission SDK 启用了事件共享 和 确定是否使用 SQL 启用了事件共享
确定是否使用 Python Permission SDK 启用了事件共享¶
Python Permission SDK 提供以下函数,以确定使用者账户中是否启用了事件共享:
is_event_sharing_enabled()
如果 SHARE_EVENTS_WITH_PROVIDER 属性为 true,并且使用者账户配置了活跃事件表,则返回 TRUE。否则返回 FALSE。
is_application_local_to_package()
如果应用程序与应用程序包位于同一账户中,则返回 TRUE。否则返回 FALSE。
确定是否使用 SQL 启用了事件共享¶
以下示例演示在使用者账户中启用了事件共享时,如何仅调用存储过程。
请考虑以下 SQL 存储过程,它会创建函数,以计算两个数字之和:
CREATE OR ALTER VERSIONED SCHEMA app_schema;
CREATE OR REPLACE PROCEDURE app_schema.hidden_sum(num1 float, num2 float)
RETURNS FLOAT
LANGUAGE SQL
EXECUTE AS OWNER
AS $$
DECLARE
SUM FLOAT;
BEGIN
SYSTEM$LOG('INFO', 'CALCULATE THE SUM OF TWO NUMBERS');
SUM := :NUM1 + :NUM2;
RETURN SUM;
END;
$$;
添加到应用程序的设置脚本中时,这些 SQL 命令会在应用程序安装时在使用者账户中创建 hidden_sum
存储过程。但是,此存储过程对使用者不可见,因为系统不会在存储过程中向应用程序角色授予 USAGE 权限。
以下示例演示如何基于 IS_APPLICATION_SHARING_EVENTS_WITH_PROVIDER 和 IS_APPLICATION_INSTALLED_FROM_SAME_ACCOUNT 系统函数,调用 hidden_sum
存储过程。
CREATE OR REPLACE PROCEDURE app_schema.sum(num1 float, num2 float)
RETURNS STRING
LANGUAGE SQL
EXECUTE AS OWNER
AS $$
BEGIN
IF (SYSTEM$IS_APPLICATION_INSTALLED_FROM_SAME_ACCOUNT() or SYSTEM$IS_APPLICATION_SHARING_EVENTS_WITH_PROVIDER()) THEN
CALL APP_SCHEMA.HIDDEN_SUM(:NUM1, :NUM2);
ELSE
-- notify consumers that they need to enable event sharing
RETURN 'Sorry you can\'t access the API, please enable event sharing.'
END IF;
END;
$$;
CREATE APPLICATION ROLE IF NOT EXISTS ADMIN_ROLE;
GRANT USAGE ON SCHEMA APP_SCHEMA TO APPLICATION ROLE ADMIN_ROLE;
在此示例中,sum
存储过程会测试 IS_APPLICATION_SHARING_EVENTS_WITH_PROVIDER 和 IS_APPLICATION_INSTALLED_FROM_SAME_ACCOUNT 存储过程的值。如果它们的值之一是 true
,sum
存储过程将调用 hidden_sum
存储过程。
使用 Python Permission SDK 请求从使用者进行事件共享¶
提供商可以使用 Python Permission SDK 创建一个 Streamlit 应用程序,以提示使用者在其账户中启用事件共享。
SDK 提供 request_event_sharing()
方法,它会在 Snowsight 中显示一个对话框,提示使用者在其账户中启用事件共享。如果使用者账户中不存在事件表,该对话框将允许使用者设置事件表(如果他们正在使用 ACCOUNTADMIN 角色)。
示例:使用 Python Permission SDK 及事件表¶
以下 Streamlit 示例显示了如何使用 Python Permission SDK 执行以下操作:
确定是否启用了事件共享。
如果启用了事件共享,则调用
critical_feature_that_requires_event_sharing()
函数。如果未启用事件共享,则调用
request_event_sharing()
函数,在 Snowsight 中显示一个对话框,提示使用者启用事件共享。
import streamlit as st
import snowflake.permissions as permissions
def critical_feature_that_requires_event_sharing():
st.write("critical_feature_that_requires_event_sharing")
def main():
if permissions.is_event_sharing_enabled() or permissions.is_application_local_to_package():
critical_feature_that_requires_event_sharing()
else:
permissions.request_event_sharing()
if __name__ == "__main__":
main()
在此示例中,只有在以下一项条件为真时,才会调用 critical_feature_that_requires_event_sharing()
方法:
已启用事件共享,并且事件表存在。
Snowflake Native App 安装在与应用程序包相同的账户中。
如果两个条件都不是 true,Streamlit 应用程序将调用 request_event_sharing()
方法,提示使用者选择事件表。
有关更多信息,请参阅 确定是否在使用者账户中启用了事件共享。