为何引用ResourceGraphResources会导致KQL告警无法触发?
问题分析与解决方案
一、为什么引用ResourceGraphResources会导致告警失效?
- Azure Monitor日志告警的查询上下文限制:告警规则的KQL查询只能基于Log Analytics工作区内的日志数据,无法直接调用Resource Graph服务的
arg("").Resources接口。手动运行查询时可能在支持跨服务查询的环境(如Azure门户高级查询编辑器),但告警引擎不支持这种跨服务调用,导致查询无法正确执行、无结果返回,告警自然不触发。 - 数据源兼容性问题:Resource Graph是独立的资源查询服务,其数据不在Log Analytics工作区范围内,告警规则无法解析并获取这部分数据,进而导致整个查询逻辑失效。
二、实现对目标机器的告警方案
要获取Windows虚拟机列表,需改用Log Analytics工作区内已有的数据(如Heartbeat表),以下是修改后的可行KQL查询及配置注意事项:
修改后的KQL查询
// 从Heartbeat表获取最近1天内的Windows虚拟机列表,排除不需要的机器 let AllMachines = Heartbeat | where TimeGenerated >= ago(1d) | where OSType == "Windows" | where Computer !contains "X" | where Computer !contains "04" | distinct Computer; // 获取最近1天内有SecurityEvent日志的机器及其最后日志时间 let LastEvent = SecurityEvent | where TimeGenerated >= ago(1d) | where Computer contains "XXXXX" | extend Computer = replace(@"XXXXX$", "", Computer) | summarize LstEvent = max(TimeGenerated) by Computer; // 左连接找出未上报SecurityEvent的机器,计算最后一次日志间隔 let MachinesWithLogs = AllMachines | join kind=leftouter (LastEvent) on $left.Computer == $right.Computer | project All_Machines = Computer, HoursSinceLastLog = datetime_diff('hour', now(), coalesce(LstEvent, now() - 1d)); // 筛选出超过2小时未上报日志的机器,生成告警内容 MachinesWithLogs | where HoursSinceLastLog > 2 | summarize MaxHoursSinceLastLog = max(HoursSinceLastLog) by Client='ai Corp', Environment='Prod', Context= strcat(All_Machines, ' 该虚拟机已超过2小时未向SecurityEvents日志写入数据')
告警配置注意事项
- 触发条件设置:在告警规则的“触发条件”中,选择“基于结果数”,设置为“大于0”,确保只要有符合条件的机器就触发告警。
- 时间范围匹配:告警规则的“时间范围”需与查询中的
ago(1d)保持一致,避免数据范围不匹配导致漏判。 - 数据有效性验证:确认目标虚拟机已正确安装Log Analytics代理,且Heartbeat表中能查询到这些机器的心跳数据,保证
AllMachines数据集的完整性。
内容的提问来源于stack exchange,提问作者Symon Turner
相关产品推荐
相关产品推荐

