[CmdletBinding()] param ( [Parameter(Mandatory)] [string]$vmname, [Parameter(Mandatory)] [string]$metric ) $metric = $metric -Replace " ", "%20" $clientid = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" $clientsecret = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" $subscriptionid = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" $tenantid = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" $resource = "https://management.azure.com/" $tokenendpoint = "https://login.microsoftonline.com/$tenantid/oauth2/token" $body = @{ grant_type = "client_credentials" resource = $resource client_id = $clientid client_secret = $clientsecret } $tokenresponse = Invoke-RestMethod -Method Post -Uri $tokenendpoint -Body $body -ContentType "application/x-www-form-urlencoded" $accesstoken = $tokenresponse.access_token $headers = @{ 'Authorization' = "Bearer $accesstoken" 'Content-Type' = 'application/json' } $requesturi = "https://management.azure.com/subscriptions/$subscriptionid/providers/Microsoft.Compute/virtualMachines?api-version=2024-07-01" $ret = (Invoke-RestMethod -Uri $requesturi -Headers $headers -Method Get) $vms = $ret.value | ForEach-Object { [pscustomobject]@{ Name = $_.name id = $_.id } } $resourceId = "" foreach ($vm in $vms) { if($vm.Name -eq $vmname){ $resourceId = $vm.id } } if ($resourceId -ne "") { $end = (Get-Date).ToUniversalTime() $start = $end.AddMinutes(-5) $timespan = "{0}/{1}" -f ` $start.ToString("yyyy-MM-ddTHH:mm:00Z"), ` $end.ToString("yyyy-MM-ddTHH:mm:00Z") $requesturi = "https://management.azure.com$resourceId/providers/microsoft.insights/metrics" + "?api-version=2023-10-01" + "&metricnames=$metric" + "×pan=$timespan" $ret = Invoke-RestMethod -Uri $requesturi -Headers $headers -Method Get if ($ret.value.errorCode -eq "Success") { $normalized = $ret.Value.TimeSeries.data | Select-Object timeStamp, @{ Name = "Value" Expression = { foreach ($p in 'average','total','maximum','minimum') { if ($_.PSObject.Properties.Name -contains $p) { return $_.$p } } $null } } $normalized = $normalized | Where-Object { $_.Value -ne $null } if ($normalized.Count -eq 0) { $avg = 0 } else { $avg = ($normalized |Measure-Object -Property Value -Average).Average } return [Math]::Round($avg) } else { throw $ret.value.errorCode } } else { throw "$($vmname) does not exist. " }