CloudRun 4xx占比超阈值但StackDriver未生成告警事件问题
问题原因
主要由3个配置错误共同导致:
- MQL聚合函数使用错误
request_count是请求计数指标,你使用max(val())仅会取1分钟窗口内的最大单采样点计数值,而非窗口内的总请求数,计算得到的比例完全不符合真实的4xx请求占比。 - 阈值单位配置逻辑错误
你设置的0.05 '10^2.%'等价于阈值为0.05%(万分之五),和你预期的5%阈值差了100倍。MQL的单位规则下会将带百分比单位的数值转换为无量纲比值进行比较:0.05 * 1% = 0.0005,远低于你实际需要的0.05(即5%)阈值。 - 告警持续时长配置冗余
你在MQL中已经按1分钟粒度聚合数据,Terraform中额外设置duration = "60s",要求条件连续满足2个1分钟窗口才会触发告警,若超阈值场景仅持续1分钟也不会生成事件。
解决方法
修改你的Terraform配置中的MQL查询和duration参数即可:
resource "google_monitoring_alert_policy" "cloudrun_http_4xx_errors" { display_name = "CloudRun 4xx errors" documentation { content = "CloudRun returned 4xx for more than 5% of its requests." } combiner = "OR" notification_channels = var.environment == "dev" ? [] : [ google_monitoring_notification_channel.pubsubchannel.name] conditions { display_name = "4xx errors" condition_monitoring_query_language { query = <<EOT fetch cloud_run_revision::run.googleapis.com/request_count | { filter metric.response_code_class = '4xx' ; ident } | group_by [resource.service_name], 1m, sum(val()) | ratio | condition val() > 0.05 EOT duration = "0s" } } }
修改点说明:
- 将聚合函数从
max(val())改为sum(val()),统计1分钟窗口内的总请求数,计算得到的占比才符合预期 - 去掉阈值的百分比单位,直接判断
val() > 0.05,对应比值5%,和需求一致 - 将
duration改为0s,只要单1分钟窗口满足阈值就触发告警,若需要连续N分钟超标再触发可自行调整该参数
额外验证项
如果修改后还是没有收到通知,可检查:
- 若部署环境为dev,你配置的通知通道为空,告警事件会在控制台展示但不会推送通知
- 检查告警策略是否已成功同步生效,Terraform apply后可在云监控控制台查看策略的配置是否和预期一致
内容的提问来源于stack exchange,提问作者Mirco
相关产品推荐
相关产品推荐

