public/Merge-SilkTCOData.ps1

function Merge-SilkTCOData {
    param (
        [Parameter(Mandatory)]
        [array] $vmlist,
        [Parameter(Mandatory)]
        [array] $metrics,
        [Parameter(Mandatory)]
        [array] $costs,
        [Parameter()]
        [switch] $breakoutVMs
    )
    
    $newarray = @()

    foreach ($vm in $vmlist) {
        $vmname = $vm.Name
        $rgname = $vm.ResourceGroupName
        $vmId = $vm.id
        $diskmetrics = $metrics | Where-Object { $_."VM Name" -eq $vmname -and $_.ResourceGroup -eq $rgname }
        $vmskucost = $costs | Where-Object { $_.ResourceName -eq $vmname -and $_.MeterCategory -eq "Virtual Machines" -and $_.ResourceId -eq $vmId}
        $vmcost = $vmskucost.Cost

        if ($breakoutVMs) {
            Write-Verbose "---> Breaking out VM: $vmname" -Verbose
            $obj = [PSCustomObject] @{
                VMName              = $vmname
                ResourceGroupName   = $rgname
                VMSize              = $vm.HardwareProfile.VmSize
                DiskReadMB          = $null
                DiskWriteMB         = $null
                DiskReadIOPS        = $null
                DiskWriteIOPS       = $null
                DiskCostUSD         = $null
                VMCostUSD           = $vmcost
                "DiskSizeGB"        = $null
                "Disk SKU"          = $null
                "Disk Tier"         = $null
                "Disk Class"        = $null
                "Disk IOPS"         = $null
                "Disk MBps"         = $null
                "Region"            = $d.Region 
                "UptimePercentage"  = $d.UptimePercentage 
                Days                = $d.Days
            }
            $newarray += $obj
            $vmcost = $null
        } 
        
        foreach ($d in $diskmetrics) {

            # Write-Verbose "-> Processing disk $($d.'disk name') for VM $($vmname)" -Verbose
            # $azDisk = Get-AzDisk -ResourceGroupName $rgname -Name $d."disk name"
            $drg = ($d.ResourceGroup).ToLower()
            $diskcost = $costs | Where-Object { $_.ResourceName -eq $d."disk name" -and $_.MeterCategory -eq "Storage" -and $_.ResourceId -match $drg}

            $obj = [PSCustomObject] @{
                VMName              = $vmname
                ResourceGroupName   = $rgname
                VMSize              = $vm.HardwareProfile.VmSize
                DiskReadMB          = $d."CompositeDiskReadBytes/sec-avg"
                DiskWriteMB         = $d."CompositeDiskWriteBytes/sec-avg"
                DiskReadIOPS        = $d."CompositeDiskReadOperations/Sec-avg"
                DiskWriteIOPS       = $d."CompositeDiskWriteOperations/Sec-avg"
                DiskCostUSD         = $diskcost.Cost
                VMCostUSD           = $vmcost
                "DiskSizeGB"        = $d.DiskSizeGB
                "Disk SKU"          = $d.DiskSKU
                "Disk Tier"         = $d."Disk Class"
                "Disk Class"        = $d."Disk Tier"
                "Disk IOPS"         = $d."Disk IOPS"
                "Disk MBps"         = $d."Disk MBps"
                "Region"            = $d.Region 
                "UptimePercentage"  = $d.UptimePercentage 
                Days                = $d.Days
            }
            $newarray += $obj
        }
    } 
    return $newarray
}