如何在Snowflake中配置仓库RM每使用10%信用额度的通知告警
Snowflake仓库资源监视器按10%消耗阶梯告警配置方案
Snowflake原生资源监视器暂不支持直接配置多档位百分比重复触发告警,你可以通过「资源监视器基础配置+定时任务+通知集成」的自定义方案实现需求,具体步骤如下:
前置准备
- 确保你的账号拥有
ACCOUNTADMIN权限,或单独持有CREATE RESOURCE MONITOR、CREATE TASK、CREATE NOTIFICATION INTEGRATION权限 - 提前确认需要监控的仓库范围、告警接收渠道(邮件、企业IM webhook都支持)
步骤1:配置基础资源监视器
先创建绑定目标仓库的资源监视器,记录总信用配额:
-- 创建资源监视器,配额、统计周期可按需调整 CREATE RESOURCE MONITOR RM_TARGET_WH CREDIT_QUOTA = <你的总信用配额> FREQUENCY = MONTHLY -- 支持调整为DAILY/WEEKLY/YEARLY START_TIMESTAMP = '<周期起始时间,如2024-06-01 00:00 UTC>'; -- 绑定到目标仓库,多个仓库可以重复执行该语句绑定 ALTER WAREHOUSE <你的仓库名> SET RESOURCE_MONITOR = RM_TARGET_WH;
步骤2:创建通知集成
配置告警推送的通道,以邮件通知为例:
CREATE NOTIFICATION INTEGRATION RM_ALERT_CHANNEL TYPE = EMAIL ENABLED = TRUE ALLOWED_RECIPIENTS = ('告警接收邮箱1', '告警接收邮箱2');
如果需要推送到Slack、Teams等渠道,将TYPE改为WEBHOOK,填写对应平台的webhook地址即可。
步骤3:创建告警逻辑与定时任务
先创建一张控制表记录上一次触发告警的百分比,避免同档位重复推送:
-- 创建告警状态控制表 CREATE TABLE RM_ALERT_RECORD ( STAT_CYCLE DATE, -- 统计周期 LAST_TRIGGER_PERCENT INT -- 上一次触发的百分比 ); -- 初始化当前周期的记录 INSERT INTO RM_ALERT_RECORD VALUES (DATE_TRUNC('MONTH', CURRENT_DATE()), 0);
再创建存储过程实现告警判断逻辑:
CREATE OR REPLACE PROCEDURE RM_10PERCENT_ALERT() RETURNS STRING LANGUAGE SQL AS $$ DECLARE total_quota NUMERIC; used_credit NUMERIC; current_percent INT; last_trigger INT; BEGIN -- 获取资源监视器总配额 SELECT CREDIT_QUOTA INTO total_quota FROM SNOWFLAKE.ACCOUNT_USAGE.RESOURCE_MONITORS WHERE NAME = 'RM_TARGET_WH'; -- 获取当前周期已消耗信用 SELECT SUM(CREDITS_USED) INTO used_credit FROM SNOWFLAKE.ACCOUNT_USAGE.WAREHOUSE_METERING_HISTORY WHERE WAREHOUSE_NAME IN (<你的目标仓库列表>) AND START_TIME >= DATE_TRUNC('MONTH', CURRENT_DATE()); -- 计算当前消耗百分比,取10的整数倍 current_percent = FLOOR(used_credit / total_quota * 100 / 10) * 10; -- 获取上一次触发的百分比 SELECT LAST_TRIGGER_PERCENT INTO last_trigger FROM RM_ALERT_RECORD WHERE STAT_CYCLE = DATE_TRUNC('MONTH', CURRENT_DATE()); -- 判断是否需要触发告警 IF current_percent > last_trigger AND current_percent >=10 THEN -- 发送邮件告警 CALL SYSTEM$SEND_EMAIL( 'RM_ALERT_CHANNEL', '告警接收邮箱', '仓库信用消耗告警:已消耗'||current_percent||'%配额', '当前仓库已消耗月度信用配额的'||current_percent||'%,总配额'||total_quota||',已使用'||used_credit ); -- 更新触发记录 UPDATE RM_ALERT_RECORD SET LAST_TRIGGER_PERCENT = current_percent WHERE STAT_CYCLE = DATE_TRUNC('MONTH', CURRENT_DATE()); RETURN '告警已触发,当前档位:'||current_percent||'%'; END IF; RETURN '未达到触发条件,当前档位:'||current_percent||'%,上次触发档位:'||last_trigger||'%'; END; $$;
最后创建定时任务定期执行告警逻辑,示例为15分钟轮询一次:
CREATE TASK RM_ALERT_TASK WAREHOUSE = <用来跑任务的小规格仓库,推荐X-SMALL> SCHEDULE = '15 MINUTE' AS CALL RM_10PERCENT_ALERT(); -- 启动任务 ALTER TASK RM_ALERT_TASK RESUME;
注意事项
- 跑定时任务的仓库选最小规格即可,每月开销不到1信用,成本极低
- 如果统计周期不是月度,需要同步修改控制表、存储过程里的周期截断逻辑
- 多仓库分开监控的话,每个仓库单独建对应的资源监视器和告警逻辑即可
内容的提问来源于stack exchange,提问作者Vicky
相关产品推荐
相关产品推荐

