如何用PowerShell提取Azure资源全量指标?为何仅获CpuTime?
问题描述
运行以下PowerShell脚本提取Azure App Service的资源指标:
#login to azure and set context $Resource = Get-AzResource -ResourceName <appservicename> -ResourceGroupName <resourcegroup> -ResourceType "Microsoft.Web/sites" $ResourceID = $Resource.ResourceId $MetricsDefinition = Get-AzMetricDefinition -ResourceId $ResourceID $MetricsDefinitionHash = @{} $MetricsDefinition | % { $Name = $_.Name $Unit = $_.Unit $MetricsDefinitionHash.Add($Name,$Unit) } $TotalResult = @() $Metrics = Get-AzMetric -ResourceId $ResourceID -StartTime (Get-date).AddHours(-24) -TimeGrain 00:01:00 $Metrics | % { if($_.Data -ne $null) { $Calc, $metricName, $Result = $Null $i=0; $MetricName = $_.Name $_.Data | % { $calc += $_.Average $i++ } $Result = $Calc/$i $MetricUnit = $MetricsDefinitionHash["$MetricName"] $MetricResult = New-Object PSObject $MetricResult | add-member Noteproperty MetricName $metricName $MetricResult | add-member Noteproperty MetricValue $Result $MetricResult | add-member Noteproperty MetricUnit $MetricUnit $TotalResult += $MetricResult } }
预期获取AverageResponseTime、AverageMemoryWorkingSet、各类Http状态码指标等,但实际仅得到CpuTime指标,请问原因是什么?
原因分析及解决办法
- 未指定目标指标名称:
Get-AzMetric默认仅返回少量默认指标(如CpuTime),不会自动拉取所有可用指标。必须通过-MetricNames参数明确指定需要获取的指标名称,才能拿到目标数据。 - 部分指标无有效数据:如果指定时间范围(过去24小时)内,某些指标没有产生任何数据,
Get-AzMetric不会返回该指标的结果。可以先用Get-AzMetricDefinition确认指标是否存在,再检查对应时间窗口内是否有数据生成。 - 时间粒度不匹配:部分指标仅支持特定的时间粒度(TimeGrain),如果设置的
00:01:00(1分钟)不符合目标指标的粒度要求,也会导致无法返回对应数据。可通过Get-AzMetricDefinition查看每个指标支持的时间粒度。
修正后的脚本示例
在调用Get-AzMetric时添加-MetricNames参数,明确指定需要的指标:
#login to azure and set context $Resource = Get-AzResource -ResourceName <appservicename> -ResourceGroupName <resourcegroup> -ResourceType "Microsoft.Web/sites" $ResourceID = $Resource.ResourceId $MetricsDefinition = Get-AzMetricDefinition -ResourceId $ResourceID $MetricsDefinitionHash = @{} $MetricsDefinition | % { $Name = $_.Name $Unit = $_.Unit $MetricsDefinitionHash.Add($Name,$Unit) } $TotalResult = @() # 指定需要获取的指标名称集合 $targetMetrics = @("AverageResponseTime", "AverageMemoryWorkingSet", "Http2xx", "Http3xx", "Http4xx", "Http5xx") $Metrics = Get-AzMetric -ResourceId $ResourceID -StartTime (Get-date).AddHours(-24) -TimeGrain 00:01:00 -MetricNames $targetMetrics $Metrics | % { if($_.Data -ne $null) { $Calc, $metricName, $Result = $Null $i=0; $MetricName = $_.Name $_.Data | % { $calc += $_.Average $i++ } $Result = $Calc/$i $MetricUnit = $MetricsDefinitionHash["$MetricName"] $MetricResult = New-Object PSObject $MetricResult | add-member Noteproperty MetricName $metricName $MetricResult | add-member Noteproperty MetricValue $Result $MetricResult | add-member Noteproperty MetricUnit $MetricUnit $TotalResult += $MetricResult } }
内容的提问来源于stack exchange,提问作者Veronica
相关产品推荐
相关产品推荐

