Veronica
Veronica

Reputation: 45

How can i pull out all metrics for a resource in Azure using Powershell?

I am at the moment running the following Powershell scipt pull out metrics from Azure

` #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
 }
 }

`

I expected a result of MetricName MetricValue MetricUnit AverageResponseTime 0.7866443 Seconds AverageMemoryWorkingSet 80747385.625 Bytes MemoryWorkingSet
Http5xx Http4xx Http406 Http404 Http403 Http401 Http3xx 0 Http2xx 0 BytesSent 4699.123 BytesReceived 7.8
Requests 9.4444 CpuTime 0.1111

I have left some values empty , but you get the idea. The issue is im only getting CpuTime . Any ideas on why i would only be getting that ?

Upvotes: 0

Views: 687

Answers (1)

kavya Saraboju
kavya Saraboju

Reputation: 10831

I have tried in my environments to get those metrics

$Resource = Get-AzResource -ResourceName “metricdemoapp” -ResourceGroupName “xxx”       -ResourceType "Microsoft.Web/sites"
 $ResourceID = $Resource.ResourceId

$Metrics = Get-AzMetric -ResourceId $ResourceID -StartTime (Get-date).AddHours(-24) -TimeGrain 00:01:00

The above returns variable $Metrics returns only metrics of CpuTime and its details like Id, name, type ,unit ,Data,timeseries as it is the first metric that appears

With Id : /subscriptions/xxxxxx23f/resourceGroups/xxxxx/providers/Microsoft.Web/sites/metricdemoapp/providers/Microsoft.Insights/metrics/CpuTime

enter image description here

After Checking the supported metrics in portal in my case , web app service

enter image description here

when tried with other metric name, got the units as required.

enter image description here

  • Where as below command for definition gives details of all metrics along with details one by one.

    $MetricsDefinition = Get-AzMetricDefinition -ResourceId $ResourceID $MetricsDefinition

enter image description here

Powershell :

$Resource = Get-AzResource -ResourceName “metricdemoapp” -ResourceGroupName “xxx”       -ResourceType "Microsoft.Web/sites"
 $ResourceID = $Resource.ResourceId

$MetricsDefinition = Get-AzMetricDefinition  -ResourceId $ResourceID
$MetricsDefinition


$i=0
foreach($metric in $MetricsDefinition)
{
$MetricName=$MetricsDefinition.Name.Value[$i]
$MetricDetails= Get-AzMetric -ResourceId $ResourceID  -MetricName  $MetricName
$MetricDataValue=$MetricDetails.Data
$Timestamp=$MetricDetails.Data.TimeStamp
$Average=$MetricDetails.Data.Average




$mCount=$MetricName.Value.Count
$count=$mCount-1

$MetricUnit=$metric.Unit
$MetricUnit

$MetricValue=$MetricName.Value
$MetricValue

$MetricResult = New-Object PSObject
 $MetricResult | add-member Noteproperty MetricName $MetricName

$MetricResult | add-member Noteproperty MetricUnit $MetricUnit

$MetricResult | add-member Noteproperty MetricDetails $MetricDetails

$MetricResult | add-member Noteproperty MetricDataValue $MetricDataValue

$MetricResult | add-member Noteproperty TimeStamp  $Timestamp

$MetricResult | add-member Noteproperty  Average $Average


 $MetricResult



$i++


}

Output:

Will be something like:

MetricName      : CpuTime
MetricUnit      : Seconds
MetricDetails   : Microsoft.Azure.Commands.Insights.OutputClasses.PSMetricNoDetails
MetricDataValue : {Microsoft.Azure.Commands.Insights.OutputClasses.PSMetricValue, Microsoft.Azure.Commands.Insights.OutputClasses.PSMetricValue, Microsoft.Azure.Commands.Insights.OutputClasses.PSMetricValue, 
                  Microsoft.Azure.Commands.Insights.OutputClasses.PSMetricValue…}
TimeStamp       : {11/24/2022 6:23:00 AM, 11/24/2022 6:24:00 AM, 11/24/2022 6:25:00 AM, 11/24/2022 6:26:00 AM…}
Average         : {$null, $null, $null, $null…}

And continues for every metric like below

enter image description here

Where AverageResponseTime is one of the metrics you can see

enter image description here


EDIT: 28/11/2022

enter image description here

Try adding aggregation type Average lie $MetricDetails= Get-AzMetric -ResourceId $ResourceID -MetricName $MetricName -AggregationType Average -TimeGrain 06:00:00

$MetricsDefinition = Get-AzMetricDefinition  -ResourceId $ResourceID


$i=0
foreach($metric in $MetricsDefinition)
{
$MetricName=$MetricsDefinition.Name.Value[$i]
$MetricDetails= Get-AzMetric -ResourceId $ResourceID  -MetricName  $MetricName -AggregationType Average -TimeGrain 06:00:00



$MetricDataValue=$MetricDetails.Data
$Timestamp=$MetricDetails.Data.TimeStamp
$Average=$MetricDetails.Data.Average




$mCount=$MetricName.Value.Count
$count=$mCount-1

$MetricUnit=$metric.Unit
$MetricUnit

$MetricValue=$MetricName.Value
$MetricValue

$MetricResult = New-Object PSObject
 $MetricResult | add-member Noteproperty MetricName $MetricName

$MetricResult | add-member Noteproperty MetricUnit $MetricUnit

$MetricResult | add-member Noteproperty MetricDetails $MetricDetails

$MetricResult | add-member Noteproperty MetricDataValue $MetricDataValue

$MetricResult | add-member Noteproperty TimeStamp  $Timestamp

$MetricResult | add-member Noteproperty  Average $Average


 $MetricResult



$i++


}

enter image description here

Upvotes: 1

Related Questions