Azure Heartbeat表_ResourceId为空:是Bug还是合理现象?
关于Heartbeat表中_ResourceId为空字符串的问题
问题描述
近期基于Heartbeat表编写VM计划外离线告警逻辑时,发现意外现象:多条记录的_ResourceId字段为空字符串(而非null)。执行以下Kusto查询返回了近7天内的22条记录,涉及19台不同VM:
Heartbeat | where TimeGenerated > ago(7d) and _ResourceId == '' | project _ResourceId, Computer, TimeGenerated | order by TimeGenerated, Computer
目前未找到相关Bug报告或官方成因说明,需确认该现象是Bug还是存在合理成因。
可能的合理成因
这类_ResourceId为空的情况并非明确的已知Bug,通常与以下场景相关:
- VM代理初始化阶段:VM刚创建时,Azure Monitor Agent尚未完成与Azure资源的注册同步,可能发送少量未携带完整资源标识的心跳记录。
- 临时元数据服务异常:Azure实例元数据服务(IMDS)短暂故障,导致代理无法获取VM的
_ResourceId信息,进而发送空值记录。 - VM已删除但代理仍运行:VM被删除后,若代理未及时停止,可能继续发送心跳,此时
_ResourceId因资源不存在而为空。 - 代理配置问题:代理安装或配置过程中出现错误,导致无法正确获取并上报资源标识。
对告警逻辑的建议
你当前的告警查询中使用了ResourceId != ''来规避该问题,但需注意:Heartbeat表中的_ResourceId与ResourceId为不同字段(_ResourceId是系统保留的资源唯一标识),建议将过滤条件修正为_ResourceId != '',确保准确排除空值记录:
let lastHealthyCheckin = ago(5m); let pollingWindow = ago(7d); Heartbeat | where TimeGenerated > pollingWindow and _ResourceId != '' // 修正为_ResourceId过滤 | summarize LastCheckIn = max(TimeGenerated) by _ResourceId, Computer | where _ResourceId !in ( AzureActivity | where OperationNameValue in~ ( 'MICROSOFT.COMPUTE/VIRTUALMACHINES/START/ACTION', 'MICROSOFT.COMPUTE/VIRTUALMACHINES/DEALLOCATE/ACTION' ) and TimeGenerated > pollingWindow | summarize LastStop = max(case(OperationNameValue =~ 'MICROSOFT.COMPUTE/VIRTUALMACHINES/DEALLOCATE/ACTION', TimeGenerated, datetime(null))) , LastStart = max(case(OperationNameValue =~ 'MICROSOFT.COMPUTE/VIRTUALMACHINES/START/ACTION', TimeGenerated, datetime(null))) by _ResourceId | where LastStop > LastStart | project _ResourceId ) | where LastCheckIn < lastHealthyCheckin | project Computer, _ResourceId, LastCheckIn
进一步排查方向
- 查看空
_ResourceId记录对应的Computer名称,确认这些VM是否仍存在于Azure中。 - 检查对应VM的Azure Monitor Agent状态,确认代理是否正常运行且配置正确。
- 对比空记录的
TimeGenerated时间,查看是否存在VM创建、删除或Azure维护事件的时间重合。
内容的提问来源于stack exchange,提问作者JohnLBevan
相关产品推荐
相关产品推荐

