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

如何通过Log Analytics(KQL)结合心跳跟踪可用性集/可用性区域中VM的SLA并解决跨查询KQL处理限制问题

解决方案:在Log Analytics中整合Resource Graph与Heartbeat数据,按SLA组计算可用性

我明白你的痛点——Heartbeat表没有VM的可用性集/区域信息,单独查Resource Graph后合并又没法继续用KQL做分组计算。其实你可以直接在Log Analytics查询里调用Azure Resource Graph,这样就能把两组数据无缝整合,后续完全支持KQL的分组、统计等操作。

1. 核心实现:用evaluate azure_resource_graph()打通两类数据

这个函数允许你在Log Analytics的KQL查询中直接执行Resource Graph语句,返回的结果可以和Heartbeat表直接关联,全程用KQL完成所有逻辑处理。下面是适配你的需求的完整查询:

let timeRangeStart = {TimeRange:start}; 
let timeRangeEnd = {TimeRange:end}; 
// 第一步:获取VM的可用性集/区域、SLA目标信息
let vmSlaInfo = evaluate azure_resource_graph('
    Resources 
    | where type == "microsoft.compute/virtualmachines" 
    | extend AvSet = properties.availabilitySet.id 
    | extend AvZone = properties.availabilityZone 
    // 定义SLA分组:区域>可用性集>单VM,给每组一个唯一标识
    | extend SlaGroup = iff(isnotempty(AvZone), strcat("Zone_", AvZone), 
                           iff(isnotempty(AvSet), strcat("AvSet_", split(AvSet, "/")[-1]), 
                               strcat("SingleVM_", name)))
    // 对应SLA目标值
    | extend SLA_Target = iff(isnotempty(AvZone), 99.99, 
                             iff(isnotempty(AvSet), 99.95, 99.9))
    | project VMResourceId = tolower(id), VMName = name, SlaGroup, SLA_Target
');
// 第二步:按分钟统计每个VM的心跳状态(1=有心跳,0=无心跳)
let vmHeartbeatPerMinute = Heartbeat 
| where ResourceType == "virtualMachines" 
| extend ResourceGroup = case(ResourceGroup <> "", ResourceGroup, "On-Prem") 
| where TimeGenerated between (timeRangeStart .. timeRangeEnd) and Computer in ({Servers}) 
| extend VMResourceId = tolower(iff(isempty(_ResourceId), Resource, _ResourceId))
// 按1分钟桶聚合,只要该分钟内有心跳就算正常
| summarize HasHeartbeat = iff(count() > 0, 1, 0) by VMResourceId, bin(TimeGenerated, 1m);
// 第三步:关联SLA组,判断每组每分钟是否触发SLA违规
let slaGroupHeartbeat = vmHeartbeatPerMinute
| join kind=inner vmSlaInfo on VMResourceId
// 组内所有VM都无心跳时,才算SLA违规(sum(HasHeartbeat)=0)
| summarize IsSlaViolation = iff(sum(HasHeartbeat) == 0, 1, 0) by SlaGroup, VMName, SLA_Target, bin(TimeGenerated, 1m);
// 第四步:计算每组的可用性率与SLA达标情况
slaGroupHeartbeat
| summarize TotalMinutes = count(), ViolationMinutes = sum(IsSlaViolation) by SlaGroup, SLA_Target
| extend AvailabilityRate = round((TotalMinutes - ViolationMinutes)*100/TotalMinutes, 2)
| extend MeetsSLA = iff(AvailabilityRate >= SLA_Target, "✅ 达标", "❌ 未达标")
| order by AvailabilityRate asc

2. 关键细节说明

  • 权限要求:执行这个查询的账号需要同时拥有Log Analytics的读取权限,以及Azure Resource Graph的查询权限。
  • SLA违规逻辑:严格按照你的需求实现——仅当SLA组(可用性集/区域)内所有VM在某一分钟都无心跳时,才记为一次违规。
  • 参数兼容:完全适配Workbook的{TimeRange}和{Servers}参数,和你原来的查询逻辑无缝衔接。
  • 可扩展性:如果需要加入磁盘SLA的判断,只需要在vmSlaInfo的Resource Graph查询里保留你原来的磁盘关联逻辑即可。

3. Workbook使用方式

直接把这段查询复制到Workbook的Log Analytics查询组件中,替换你原来的Heartbeat查询,就能生成包含SLA分组、可用性率、达标状态的报表了。

内容的提问来源于stack exchange,提问作者Adriaan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 12:42:45