Azure自定义日志警报未触发问题排查求助
Azure警报未触发排查指南
问题概述
配置的Azure警报规则需每30分钟运行一次,识别过去30分钟至1小时内未发送心跳的设备,且单设备仅触发一次警报直至恢复。手动在App Insights中执行Kusto查询可返回目标设备,但警报无历史记录、Action Group未收到通知。
核心排查步骤
1. 修正Kusto查询语法错误
原查询存在两处潜在语法问题:
- 中文引号:第一个
where message == “Heartbeat”使用了中文双引号,Kusto仅支持英文双引号"Heartbeat",会导致该语句无法匹配任何心跳记录,最终unhealthyIds为空。 - 列名错误:
project Id = customDimensions_id中的customDimensions_id列不存在,应为project Id = tostring(customDimensions.id)。
修正后的查询示例:
let missedHeartbeatsFrom30MinsAgo = traces | where message == "Heartbeat" | summarize arg_max(timestamp, *) by tostring(customDimensions.id) | project Id = tostring(customDimensions.id), LastHeartbeat = timestamp | where LastHeartbeat < ago(30m); let missedHeartbeatsFrom1HourAgo = traces | where message == "Heartbeat" | summarize arg_max(timestamp, *) by tostring(customDimensions.id) | project Id = tostring(customDimensions.id), LastHeartbeat = timestamp | where LastHeartbeat <= ago(1h); let unhealthyIds = missedHeartbeatsFrom30MinsAgo | join kind=leftanti missedHeartbeatsFrom1HourAgo on Id; let deviceDetails = customEvents | where name == "Heartbeat" | distinct tostring(customDimensions.deviceId), tostring(customDimensions.fullName) | project Id = tostring(customDimensions.deviceId), FullName = tostring(customDimensions.fullName); unhealthyIds | join kind=leftouter deviceDetails on Id | project Id, FullName, LastHeartbeat | order by FullName asc
2. 验证警报规则时间范围配置
警报的查询时间范围需覆盖查询逻辑中的时间区间:
- 由于查询涉及
ago(1h),需将警报规则的“查询时间范围”设置为过去1小时,而非30分钟。若设置为30分钟,traces表仅返回最近30分钟的数据,无法获取设备1小时前的最后心跳记录,导致查询返回空。
3. 检查触发条件与抑制规则
- 确认“基于结果数”的阈值设置为大于0,确保只要有符合条件的设备就触发警报。
- 验证“抑制规则”配置:开启“抑制警报”,设置为“直到警报解决”,同时确保“抑制范围”选择“警报维度(按设备Id)”,实现单设备仅触发一次的需求。
4. 检查警报规则状态与权限
- 确认警报规则处于已启用状态(规则列表中状态为“已启用”)。
- 检查规则的权限:确保创建警报规则的主体(或托管标识)拥有App Insights的
Monitoring Reader或Reader权限,可读取traces和customEvents表数据。
5. 查看Azure活动日志排查执行错误
在Azure门户中导航至App Insights资源的“活动日志”,筛选与该警报规则相关的操作,查看是否存在“查询执行失败”“权限不足”等错误日志,直接定位警报未触发的原因。
内容的提问来源于stack exchange,提问作者StockDC2
相关产品推荐
相关产品推荐

