KQL查询需求:获取代理状态及检测同时安装AMA/MMA的服务器
解决KQL查询错误:找出同时安装AMA和MMA代理的服务器
错误原因
你遇到的错误是因为错误地将聚合得到的datetime类型字段lastHeartbeat当成了包含Properties的动态对象。实际上Properties是Heartbeat表的原生动态字段,只能从原始表记录中提取,不能从聚合后的时间字段中访问。
修正后的KQL查询
Heartbeat // 先过滤出目标代理类型的心跳记录,同时提取AgentType | extend AgentType = tostring(Properties["agentType"]) | where AgentType in ("AMA", "MMA") // 按计算机和代理类型分组,获取每个代理的最后心跳时间 | summarize LastHeartbeat = max(TimeGenerated) by Computer, AgentType // 按计算机聚合,收集所有代理类型并打包各代理的最后心跳信息 | summarize AgentTypes = make_set(AgentType), AgentLastHeartbeats = make_bag(pack(AgentType, LastHeartbeat)) by Computer // 筛选同时存在两种代理的服务器 | where array_length(AgentTypes) == 2 // 输出结果字段 | project Computer, AgentTypes, AgentLastHeartbeats
查询逻辑说明
- 提取并过滤代理类型:从Heartbeat表的
Properties字段中提取agentType,只保留AMA和MMA类型的记录。 - 分组获取单代理最后心跳:按服务器和代理类型分组,得到每个代理在该服务器上的最后心跳时间。
- 聚合服务器的代理信息:再次按服务器分组,用
make_set收集该服务器的所有代理类型,用make_bag打包各代理的最后心跳时间。 - 筛选双代理服务器:只保留代理类型集合长度为2的服务器,即同时安装了AMA和MMA的目标服务器。
内容的提问来源于stack exchange,提问作者prashanth ganesan
相关产品推荐
相关产品推荐

