如何在Slack的BigQuery定时查询失败告警中显示其显示名称?
问题分析
当前告警过滤规则仅匹配定时查询的失败日志,但日志默认不直接包含定时查询的显示名称——这个名称存储在定时查询的元数据里,而非jobservice.insert的日志payload中。
解决方案
要在Slack告警中显示定时查询的显示名称,可按以下步骤调整配置:
提取定时查询ID
定时查询的日志里,protoPayload.serviceData.jobInsertRequest.resource.jobConfiguration.query.query字段包含格式为bqts_xxxxxxxxxxxxxx的定时查询ID。在告警策略的日志提取配置中添加规则:- 提取字段名:
scheduled_query_id - 正则表达式:
bqts_[a-f0-9]+
- 提取字段名:
关联元数据获取显示名称
BigQuery的INFORMATION_SCHEMA.SCHEDULED_QUERIES表存储了所有定时查询的元数据,其中schedule_id对应提取到的bqts_xxx格式ID,display_name就是你需要的显示名称。可通过两种方式关联:- 创建日志导出Sink,将失败日志同步到BigQuery表,用SQL关联
SCHEDULED_QUERIES表获取显示名称,再基于该结果配置告警; - 用Cloud Functions编写逻辑,在告警触发时查询
SCHEDULED_QUERIES表,将显示名称填充到Slack消息中。
- 创建日志导出Sink,将失败日志同步到BigQuery表,用SQL关联
自定义Slack告警消息
在告警的通知设置里编辑Slack消息模板,插入获取到的显示名称,示例:BigQuery定时查询「${display_name}」执行失败,错误信息:${protoPayload.status.message}
简化替代方案
创建定时查询时,手动添加自定义标签(比如display_name: "用户行为统计查询"),此时日志的protoPayload.serviceData.jobInsertRequest.resource.jobConfiguration.labels会包含该标签,直接在告警消息中引用${protoPayload.serviceData.jobInsertRequest.resource.jobConfiguration.labels.display_name}即可。
内容的提问来源于stack exchange,提问作者pgoel

