使用Get-AzMetric查询数据磁盘指标返回BadRequest错误的解决问询
解决Get-AzMetric通过磁盘ResourceId获取指标报BadRequest的问题
问题根源
你使用的指标名称Data Disk Read Bytes/Sec和Data Disk Write Bytes/Sec是虚拟机资源专属指标,并非托管磁盘自身的指标。托管磁盘对应的读写指标名称为Disk Read Bytes/Sec和Disk Write Bytes/Sec,错误的指标名称直接导致请求被拒绝,返回BadRequest。
解决方案步骤
1. 确认磁盘支持的指标
先执行以下命令查看目标磁盘的所有可用指标,验证正确的指标名称:
$resourceId = "/subscriptions/XXXXX/resourceGroups/rg-xxxxx/providers/Microsoft.Compute/disks/disk-xxxx-01" Get-AzMetricDefinition -ResourceId $resourceId | Select-Object Name, Unit
输出结果中会明确显示磁盘支持的指标列表,其中包含Disk Read Bytes/Sec和Disk Write Bytes/Sec。
2. 修正单磁盘指标获取代码
替换指标名称为磁盘专属名称,调整后的可运行代码:
# 磁盘对应的正确指标名称 $readMetricName = "Disk Read Bytes/Sec" $writeMetricName = "Disk Write Bytes/Sec" $endTime = Get-Date $startTime = $endTime.AddDays(-30) $resourceId = "/subscriptions/XXXXX/resourceGroups/rg-xxxxx/providers/Microsoft.Compute/disks/disk-xxxx-01" # 获取读吞吐量最大值(建议用1小时粒度,避免30天内小粒度数据超出查询限制) $readMaxMetric = Get-AzMetric -ResourceId $resourceId ` -StartTime $startTime -EndTime $endTime ` -TimeGrain 01:00:00 ` -MetricName $readMetricName ` -AggregationType Maximum # 获取写吞吐量最大值 $writeMaxMetric = Get-AzMetric -ResourceId $resourceId ` -StartTime $startTime -EndTime $endTime ` -TimeGrain 01:00:00 ` -MetricName $writeMetricName ` -AggregationType Maximum # 输出结果 Write-Host "磁盘 $resourceId 30天内读吞吐量最大值: $($readMaxMetric.Data.Maximum) Bytes/Sec" Write-Host "磁盘 $resourceId 30天内写吞吐量最大值: $($writeMaxMetric.Data.Maximum) Bytes/Sec"
如果必须使用1分钟粒度,建议拆分时间范围分批查询(如按天查询),避免单次请求数据点过多触发Azure Monitor的查询限制。
3. 批量获取订阅内所有Premium SSD数据磁盘的指标
实现自动化遍历订阅内所有Premium SSD数据磁盘,批量获取指标最大值:
# 定义核心参数 $readMetricName = "Disk Read Bytes/Sec" $writeMetricName = "Disk Write Bytes/Sec" $endTime = Get-Date $startTime = $endTime.AddDays(-30) $timeGrain = "01:00:00" # 筛选订阅内所有Premium SSD数据磁盘(排除OS磁盘) $premiumDataDisks = Get-AzDisk | Where-Object { $_.Sku.Name -eq "Premium_LRS" -and $_.OsType -eq $null } # 遍历磁盘处理指标 foreach ($disk in $premiumDataDisks) { Write-Host "正在处理磁盘: $($disk.Name)" -ForegroundColor Cyan try { # 获取读最大值 $readMax = Get-AzMetric -ResourceId $disk.Id ` -StartTime $startTime -EndTime $endTime ` -TimeGrain $timeGrain ` -MetricName $readMetricName ` -AggregationType Maximum # 获取写最大值 $writeMax = Get-AzMetric -ResourceId $disk.Id ` -StartTime $startTime -EndTime $endTime ` -TimeGrain $timeGrain ` -MetricName $writeMetricName ` -AggregationType Maximum # 整理并输出结果 [PSCustomObject]@{ DiskName = $disk.Name ResourceId = $disk.Id MaxReadBytesPerSec = if ($readMax.Data) { $readMax.Data.Maximum } else { "无数据" } MaxWriteBytesPerSec = if ($writeMax.Data) { $writeMax.Data.Maximum } else { "无数据" } } | Format-Table -AutoSize } catch { Write-Host "处理磁盘 $($disk.Name) 失败: $($_.Exception.Message)" -ForegroundColor Red } }
额外注意事项
- 确保当前账户拥有
Microsoft.Insights/metrics/read权限(Monitoring Reader或Contributor角色默认包含该权限)。 - 若磁盘在30天内无IO操作,会返回"无数据",属于正常情况。
- 若需更细粒度的历史数据,可将30天拆分为多个小时间段(如每天查询一次),避免触发查询限制。
内容的提问来源于stack exchange,提问作者az_novice007
相关产品推荐
相关产品推荐

