如何设置BigQuery查询超阈值(如20GB)的邮件通知?
实现BigQuery大查询(>20GB)的邮件通知方案
完全可以实现你的需求!下面是一套基于Cloud Logging(原Stackdriver Logging)+ BigQuery + Cloud Monitoring/Cloud Functions的完整方案,一步步来:
1. 导出BigQuery查询日志到专属BigQuery表
首先得把BigQuery的查询操作日志收集起来,具体操作:
- 打开Cloud Logging控制台,进入日志导出页面
- 创建新的导出,选择BigQuery作为目标
- 在日志过滤器里输入:
这个过滤器只保留查询完成的日志,排除加载/导出等其他操作resource.type="bigquery_resource" protoPayload.methodName="jobservice.jobcompleted" protoPayload.serviceData.jobCompletedEvent.job.jobType="QUERY" - 选择或创建一个BigQuery数据集来存储导出的日志表,日志表会自动按日期分区,方便后续查询
2. 编写查询筛选超过20GB的查询
导出的日志表结构里,protoPayload.serviceData.jobCompletedEvent.job.jobStatistics.totalBytesProcessed字段记录了查询处理的总字节数。我们可以创建一个视图来快速筛选符合阈值的查询:
CREATE VIEW `your-project.your-dataset.large_queries_view` AS SELECT TIMESTAMP_TRUNC(protoPayload.startTime, SECOND) AS query_start_time, protoPayload.authenticationInfo.principalEmail AS user_email, protoPayload.serviceData.jobCompletedEvent.job.jobConfiguration.query.query AS query_sql, SAFE_CAST(protoPayload.serviceData.jobCompletedEvent.job.jobStatistics.totalBytesProcessed AS INT64)/POW(1024,3) AS total_gb_processed, protoPayload.serviceData.jobCompletedEvent.job.jobId AS job_id FROM `your-project.your-dataset.cloudaudit_googleapis_com_data_access_*` WHERE _TABLE_SUFFIX >= FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY)) -- 最近7天的日志,可调整 AND SAFE_CAST(protoPayload.serviceData.jobCompletedEvent.job.jobStatistics.totalBytesProcessed AS INT64)/POW(1024,3) > 20 ORDER BY total_gb_processed DESC;
这个视图会提取查询发起时间、用户邮箱、SQL语句、处理的GB数和作业ID,方便后续核查。
3. 配置邮件通知
有两种常用的方式来实现邮件告警:
方式一:用Cloud Monitoring告警策略(推荐)
- 打开Cloud Monitoring控制台,进入告警 > 创建策略
- 添加条件:
- 选择日志匹配作为信号类型
- 输入之前的日志过滤器,再加上字节数筛选:
resource.type="bigquery_resource" protoPayload.methodName="jobservice.jobcompleted" protoPayload.serviceData.jobCompletedEvent.job.jobType="QUERY" protoPayload.serviceData.jobCompletedEvent.job.jobStatistics.totalBytesProcessed > 21474836480 -- 20GB = 20*1024^3字节 - 设置告警触发条件为“任何匹配的日志条目”
- 配置通知渠道:添加一个邮件通知渠道,输入你要接收通知的邮箱
- 设置告警名称和描述,保存策略。之后只要有超过20GB的查询,你就会收到邮件,邮件里会包含查询的关键信息
方式二:用BigQuery定时查询 + Cloud Functions(灵活自定义通知内容)
如果需要更定制化的通知内容(比如把多个大查询汇总成一封邮件),可以这么做:
- 创建一个BigQuery定时查询,定期运行上面的
large_queries_view,把结果写入一个临时表 - 配置Cloud Functions,当临时表有新数据时触发(用Cloud Storage作为中间介质,或者直接用BigQuery的事件触发器)
- 在Cloud Functions里编写代码,读取临时表的数据,生成格式化的邮件内容,用Gmail API或者Cloud SendGrid发送邮件到你的邮箱
注意事项
- 确保你有足够的权限:日志导出的权限、BigQuery数据集的读写权限、Cloud Monitoring/Cloud Functions的配置权限
- 日志导出会有一定的延迟(通常几分钟),所以告警不会实时触发,但足够满足你的核查需求
- 可以根据需要调整阈值(比如改成10GB或50GB),只要修改SQL或日志过滤器里的数值就行
内容的提问来源于stack exchange,提问作者Luis
相关产品推荐
相关产品推荐

