Collectors/Inventory.ps1

function Get-AerInventory {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)] [string[]] $SubscriptionIds,
        [Parameter(Mandatory)]            $SubscriptionMap
    )

    $subLookup = @{}
    if ($SubscriptionMap -is [hashtable]) {
        $subLookup = $SubscriptionMap
    } elseif ($SubscriptionMap) {
        $SubscriptionMap.PSObject.Properties | ForEach-Object { $subLookup[$_.Name] = $_.Value }
    }

    $resourceRows = @()
    try {
        $resourceRows = Invoke-AerArgQuery -SubscriptionIds $SubscriptionIds -Query @'
resources
| summarize Count=count() by subscriptionId, type, location
'@

    } catch { Write-Warning "[Inventory.resources] $($_.Exception.Message)" }

    $rgRows = @()
    try {
        $rgRows = Invoke-AerArgQuery -SubscriptionIds $SubscriptionIds -Query @'
resourcecontainers
| where type == 'microsoft.resources/subscriptions/resourcegroups'
| summarize ResourceGroups=count() by subscriptionId
'@

    } catch { Write-Warning "[Inventory.rgRows] $($_.Exception.Message)" }

    $resourceList = @()
    try {
        $resourceList = Invoke-AerArgQuery -SubscriptionIds $SubscriptionIds -Query @'
resources
| project id, subscriptionId, resourceGroup, name, type, location,
          provisioningState = tostring(properties.provisioningState), tags
'@

    } catch { Write-Warning "[Inventory.resource-list] $($_.Exception.Message)" }

    $managementGroupCount = 0
    try {
        $mgResp = Invoke-AzRestMethod -Method GET `
            -Path '/providers/Microsoft.Management/managementGroups?api-version=2020-05-01' `
            -ErrorAction Stop
        if ($mgResp.StatusCode -eq 200) {
            $managementGroupCount = @(($mgResp.Content | ConvertFrom-Json).value).Count
        }
    } catch { }

    $totalResources = ($resourceRows | Measure-Object -Property Count -Sum).Sum ?? 0
    $totalRG        = ($rgRows       | Measure-Object -Property ResourceGroups -Sum).Sum ?? 0

    $bySubscription = $resourceRows |
        Group-Object subscriptionId |
        ForEach-Object {
            $sid   = $_.Name
            $count = ($_.Group | Measure-Object -Property Count -Sum).Sum
            $sname = if ($sid) { $subLookup[$sid.ToLowerInvariant()] } else { $null }
            [pscustomobject]@{
                SubscriptionId   = $sid
                SubscriptionName = $sname ?? $sid
                Count            = [int]$count
            }
        } | Sort-Object Count -Descending

    $byType = $resourceRows |
        Group-Object type |
        ForEach-Object {
            [pscustomobject]@{
                Type  = ($_.Name -split '/')[-1]
                Count = [int]($_.Group | Measure-Object -Property Count -Sum).Sum
            }
        } | Sort-Object Count -Descending | Select-Object -First 10

    $byRegion = $resourceRows |
        Group-Object location |
        ForEach-Object {
            [pscustomobject]@{
                Region = $_.Name
                Count  = [int]($_.Group | Measure-Object -Property Count -Sum).Sum
            }
        } | Sort-Object Count -Descending | Select-Object -First 5

    return [pscustomobject]@{
        ManagementGroups    = $managementGroupCount
        Subscriptions       = $SubscriptionIds.Count
        TotalResourceGroups = [int]$totalRG
        TotalResources      = [int]$totalResources
        BySubscription      = @($bySubscription)
        ByType              = @($byType)
        ByRegion            = @($byRegion)
        SubscriptionMap     = $subLookup
        ResourceList        = @($resourceList)
    }
}