预算通知¶
要在 Credit 使用量预计超过支出限额时接收通知,您必须设置预算,以便可以将通知发送到您选择的目的地。您可以通过以下方式接收通知:
电子邮件。
消息推送到由云服务提供的队列(Amazon SNS、Azure 事件网格或 Google Cloud PubSub)。
对 Slack、Microsoft Teams 或 PagerDuty 的 Webhook 的调用。
备注
通过 Snowflake 的 Amazon Web Services (AWS) 部署,使用 AWS Simple Email Service (SES) 处理电子邮件通知。使用 AWS 发送的电子邮件内容可由 Snowflake 保留最多三十天,以便管理消息的传递。此期限过后,消息内容将会删除。
Controlling when notifications are sent¶
默认情况下,当预计支出比预算支出限额高出 10% 以上时,就会开始发送通知。
您可以通过定义通知阈值来替换此默认值,该阈值是预算支出限额的百分比。当 Snowflake 预测支出将超过阈值时,系统会发送通知。
例如,假设您希望在预计支出超过预算支出限额的 50% 时发送通知。要为账户预算设置此通知阈值,请运行以下命令:
CALL SNOWFLAKE.LOCAL.ACCOUNT_ROOT_BUDGET!SET_NOTIFICATION_THRESHOLD(50);
您还可以为自定义预算设置通知阈值。
If you want to reset the notification threshold to the default, call the
<budget_name>!SET_NOTIFICATION_THRESHOLD method with 110
as the argument.
设置电子邮件通知¶
要设置电子邮件通知,请执行以下操作:
(可选)如果您想使用自己的通知集成,请创建一个通知集成或选择一个要使用的现有通知集成。通知集成使 Snowflake 能够向第三方系统发送通知。
创建一个通知集成,并将 TYPE = EMAIL 和 ALLOWED_RECIPIENTS 设置为收件人的已验证电子邮件地址列表。有关信息,请参阅 创建电子邮件通知集成 和 限制可接收通知的电子邮件地址列表。
备注
添加以用于接收预算通知的每个电子邮件地址都必须 经过验证。如果列表中的任何电子邮件地址 未 经过验证,则通知电子邮件设置会失败。
例如:
CREATE NOTIFICATION INTEGRATION budgets_notification_integration TYPE = EMAIL ENABLED = TRUE ALLOWED_RECIPIENTS = ('costadmin@example.com','budgetadmin@example.com');
通过调用 SYSTEM$SEND_SNOWFLAKE_NOTIFICATION 存储过程以发送测试消息,验证通知集成是否按预期工作。
例如,您可以以 JSON 格式发送测试消息:
CALL SYSTEM$SEND_SNOWFLAKE_NOTIFICATION( SNOWFLAKE.NOTIFICATION.APPLICATION_JSON('{"name": "value"}'), SNOWFLAKE.NOTIFICATION.INTEGRATION('budgets_notification_integration') );
向 SNOWFLAKE 应用程序授予通知集成的 USAGE 权限。USAGE 权限使预算能够使用通知集成来发送电子邮件。例如:
GRANT USAGE ON INTEGRATION budgets_notification_integration TO APPLICATION snowflake;
指定应接收通知的电子邮件地址。如果您创建或选择了要使用的通知集成,请将通知集成与预算关联。
为此,请调用 <budget_name>!SET_EMAIL_NOTIFICATIONS 方法,并指定以下内容:
如果您没有想要使用的通知集成,请传入一个以逗号分隔的经验证电子邮件地址列表。例如,如果您正在为账户预算配置通知:
CALL SNOWFLAKE.LOCAL.ACCOUNT_ROOT_BUDGET!SET_EMAIL_NOTIFICATIONS( 'costadmin@example.com, budgetadmin@example.com' );
如果您正在为自定义预算配置通知,请在自定义预算的对象上调用该方法。例如,如果您创建了一个名为
my_budget
的自定义预算:CALL my_budget!SET_EMAIL_NOTIFICATIONS( 'costadmin@example.com, budgetadmin@example.com' );
如果您有想要使用的通知集成,请传入该集成的名称和一个以逗号分隔的经验证电子邮件地址列表。例如,如果您正在为账户预算配置通知:
CALL SNOWFLAKE.LOCAL.ACCOUNT_ROOT_BUDGET!SET_EMAIL_NOTIFICATIONS( 'budgets_notification_integration', 'costadmin@example.com, budgetadmin@example.com' );
如果您正在为自定义预算配置通知,请在自定义预算的对象上调用该方法。例如,如果您创建了一个名为
my_budget
的自定义预算:CALL my_budget!SET_EMAIL_NOTIFICATIONS( 'budgets_notification_integration', 'costadmin@example.com, budgetadmin@example.com' );
如果您将通知集成与预算关联,可以通过调用 <budget_name>!GET_NOTIFICATION_INTEGRATION_NAME 方法来验证预算是否与通知集成关联。此方法返回与预算相关的电子邮件通知集成的名称。
例如,如果您正在为账户预算配置通知:
CALL SNOWFLAKE.LOCAL.ACCOUNT_ROOT_BUDGET!GET_NOTIFICATION_INTEGRATION_NAME();
如果您正在为自定义预算配置通知,请在自定义预算的对象上调用该方法。例如,如果您创建了一个名为
my_budget
的自定义预算:CALL my_budget!GET_NOTIFICATION_INTEGRATION_NAME();
设置队列通知¶
要设置队列通知,请执行以下操作:
创建一个通知集成或选择一个要使用的现有通知集成。通知集成使 Snowflake 能够向第三方系统发送通知。
使用 TYPE=QUEUE、DIRECTION=OUTBOUND 以及云提供商所需的附加属性创建一个通知集成。有关信息,请参阅:
备注
您的账户必须与云提供商队列在同一 云平台 上。
例如:
CREATE OR REPLACE NOTIFICATION INTEGRATION budgets_notification_integration ENABLED = TRUE TYPE = QUEUE DIRECTION = OUTBOUND NOTIFICATION_PROVIDER = AWS_SNS AWS_SNS_TOPIC_ARN = '<ARN_for_my_SNS_topic>' AWS_SNS_ROLE_ARN = '<ARN_for_my_IAM_role>';
备注
对于队列和 Webhook 通知,您可以将最多 10 个通知集成与预算关联。
通过调用 SYSTEM$SEND_SNOWFLAKE_NOTIFICATION 存储过程以发送测试消息,验证通知集成是否按预期工作。
例如,您可以以 JSON 格式发送测试消息:
CALL SYSTEM$SEND_SNOWFLAKE_NOTIFICATION( SNOWFLAKE.NOTIFICATION.APPLICATION_JSON('{"name": "value"}'), SNOWFLAKE.NOTIFICATION.INTEGRATION('budgets_notification_integration') );
向 SNOWFLAKE 应用程序授予通知集成的 USAGE 权限。USAGE 权限使预算能够使用通知集成来发送电子邮件。例如:
GRANT USAGE ON INTEGRATION budgets_notification_integration TO APPLICATION snowflake;
将通知集成与预算关联。调用 <budget_name>!ADD_NOTIFICATION_INTEGRATION 方法,传入集成的名称。
例如,如果您正在为账户预算配置通知:
CALL SNOWFLAKE.LOCAL.ACCOUNT_ROOT_BUDGET!ADD_NOTIFICATION_INTEGRATION( 'budgets_notification_integration', );
如果您正在为自定义预算配置通知,请在自定义预算的对象上调用该方法。例如,如果您创建了一个名为
my_budget
的自定义预算:CALL my_budget!ADD_NOTIFICATION_INTEGRATION( 'budgets_notification_integration', );
验证通知集成是否与预算相关。
调用 <budget_name>!GET_NOTIFICATION_INTEGRATIONS 方法打印出与预算相关的通知集成列表。
例如,如果您正在为账户预算配置通知:
CALL SNOWFLAKE.LOCAL.ACCOUNT_ROOT_BUDGET!GET_NOTIFICATION_INTEGRATIONS();
如果您正在为自定义预算配置通知,请在自定义预算的对象上调用该方法。例如,如果您创建了一个名为
my_budget
的自定义预算:CALL my_budget!GET_NOTIFICATION_INTEGRATIONS();
该方法打印出一个表格,列出集成的名称、最后一次用于发送通知的时间以及它们的添加日期。
+----------------------------------+------------------------+------------+ | INTEGRATION_NAME | LAST_NOTIFICATION_TIME | ADDED_DATE | +----------------------------------+------------------------+------------+ | budgets_notification_integration | -1 | 2024-09-23 | +----------------------------------+------------------------+------------+
设置 Webhook 通知¶
要设置 Webhook 通知,请执行以下操作:
创建一个通知集成或选择一个要使用的现有通知集成。通知集成使 Snowflake 能够向第三方系统发送通知。
使用 TYPE=WEBHOOK 以及 Webhook 所需的附加属性创建一个通知集成。有关信息,请参阅 发送 Webhook 通知。
通知消息采用 JSON 格式,因此您应该配置通知集成以处理此格式。例如,以下语句为 Slack Webhook 创建一个密钥和一个通知集成:
CREATE OR REPLACE SECRET my_database.my_schema.slack_secret TYPE = GENERIC_STRING SECRET_STRING = '... secret in my Slack webhook URL ...'; CREATE OR REPLACE NOTIFICATION INTEGRATION budgets_notification_integration ENABLED = TRUE TYPE = WEBHOOK WEBHOOK_URL = 'https://hooks.slack.com/services/SNOWFLAKE_WEBHOOK_SECRET' WEBHOOK_BODY_TEMPLATE='{"text": "SNOWFLAKE_WEBHOOK_MESSAGE"}' WEBHOOK_HEADERS=('Content-Type'='application/json') WEBHOOK_SECRET = slack_secret;
备注
对于队列和 Webhook 通知,您可以将最多 10 个通知集成与预算关联。
通过调用 SYSTEM$SEND_SNOWFLAKE_NOTIFICATION 存储过程以发送测试消息,验证通知集成是否按预期工作。
例如,您可以以 JSON 格式发送测试消息。确保转义 JSON 字符串中的双引号和反斜杠:
CALL SYSTEM$SEND_SNOWFLAKE_NOTIFICATION( SNOWFLAKE.NOTIFICATION.APPLICATION_JSON('{\\\"name\\\": \\\"value\\\"}'), SNOWFLAKE.NOTIFICATION.INTEGRATION('budgets_notification_integration') );
向 SNOWFLAKE 应用程序授予通知集成的 USAGE 权限。USAGE 权限使预算能够使用通知集成来发送电子邮件。例如:
GRANT USAGE ON INTEGRATION budgets_notification_integration TO APPLICATION snowflake;
如果您正在使用依赖于密钥的 Webhook 通知集成,请授予 SNOWFLAKE 应用程序以下权限。
对该密钥的 READ 权限。
对包含该密钥的架构的 USAGE 权限。
对包含该架构的数据库的 USAGE 权限。
例如:
GRANT READ ON SECRET slack_secret TO APPLICATION snowflake; GRANT USAGE ON SCHEMA my_schema TO APPLICATION snowflake; GRANT USAGE ON DATABASE my_database TO APPLICATION snowflake;
将通知集成与预算关联。
调用 <budget_name>!ADD_NOTIFICATION_INTEGRATION 方法,并传入集成的名称。
例如,如果您正在为账户预算配置通知:
CALL SNOWFLAKE.LOCAL.ACCOUNT_ROOT_BUDGET!ADD_NOTIFICATION_INTEGRATION( 'budgets_notification_integration', );
如果您正在为自定义预算配置通知,请在自定义预算的对象上调用该方法。例如,如果您创建了一个名为
my_budget
的自定义预算:CALL my_budget!ADD_NOTIFICATION_INTEGRATION( 'budgets_notification_integration', );
验证通知集成是否与预算相关。
调用 <budget_name>!GET_NOTIFICATION_INTEGRATIONS 方法,该方法会打印出与预算相关的通知集成列表。
例如,如果您正在为账户预算配置通知:
CALL SNOWFLAKE.LOCAL.ACCOUNT_ROOT_BUDGET!GET_NOTIFICATION_INTEGRATIONS();
如果您正在为自定义预算配置通知,请在自定义预算的对象上调用该方法。例如,如果您创建了一个名为
my_budget
的自定义预算:CALL my_budget!GET_NOTIFICATION_INTEGRATIONS();
该方法打印出一个表格,列出集成的名称、最后一次用于发送通知的时间以及它们的添加日期。
+----------------------------------+------------------------+------------+ | INTEGRATION_NAME | LAST_NOTIFICATION_TIME | ADDED_DATE | +----------------------------------+------------------------+------------+ | budgets_notification_integration | -1 | 2024-09-23 | +----------------------------------+------------------------+------------+
解读 JSON 通知消息¶
当您配置预算以向云提供商队列或 Webhook 发送通知时,通知消息包含一个类似如下的 JSON 对象:
{
"account_name": "MY_ACCOUNT",
"budget_name": "MY_BUDGET_NAME",
"type": "BUDGET_LIMIT_WARNING",
"limit": "100",
"spending": "67.42",
"spending_percent": "67.42",
"spending_trend_percent": "130.63",
"time_percent":"51.61"
}
该 JSON 对象包含以下键值对:
键 |
描述 |
---|---|
|
您的账户名称。 |
|
您的预算名称。对于账户预算,名称是 |
|
通知的类型(例如, |
|
您为预算设定的支出限额。 |
|
本月的 Credit 使用量。 |
|
已经花费的支出限额百分比 ( |
|
预计到月底将花费的支出限额百分比 ( |
|
本月已过去的时间百分比(例如,如果本月过了一半,则为 |
检查有关预算的通知历史记录¶
要查看有关预算的通知历史记录,请调用 NOTIFICATION_HISTORY 函数并按集成名称进行筛选。例如:
SELECT * FROM TABLE(
INFORMATION_SCHEMA.NOTIFICATION_HISTORY(
INTEGRATION_NAME=>'budgets_notification_integration'
)
);
表示预算通知的行对应的 message_source
列包含 BUDGET
。
禁用预算通知¶
要禁用预算通知,请调用 SET_NOTIFICATION_MUTE_FLAG 方法,并将 TRUE 作为实参传入。例如:
CALL SNOWFLAKE.LOCAL.ACCOUNT_ROOT_BUDGET!SET_NOTIFICATION_MUTE_FLAG(TRUE);
从预算中移除通知集成¶
要从预算中移除通知集成,请调用 <budget_name>!REMOVE_NOTIFICATION_INTEGRATION 方法,并传入集成的名称。例如:
CALL my_budget!REMOVE_NOTIFICATION_INTEGRATION(
'budgets_notification_integration',
);