You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何引用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 03:44:51