Azure VM Disk IOPs report with Disk details

Logan 0 Reputation points
2025-04-08T16:52:00.57+00:00

Hi,

I'm trying to fetch the IOPs report of the Azure VMs disk with some additional information such as Disk assigned letter, Disk Name, Disk size, Disk size utilization, Read Iops, Write IOPs & etc.. I've the query created but the problem is the results are duplicated multiple times. I tried to do diff join function but still the same.

Any help here is much appreciated, thank you!


// Summarize the disk data (only one row per disk/resource)
let DiskData = 
    arg("").Resources
    | where type == "microsoft.compute/disks"
    | project
        diskName = name,
        diskSizeGB = properties.diskSizeGB,
        resourceGroup,
        location,
        OSType = properties.osType,
        DiskType = sku.name,
        _ResourceId = tolower(managedBy),
        Throughput = properties.diskMBpsReadWrite,
        IOPSReadWrite = properties.diskIOPSReadWrite,
        AppName = tags.applicationName
    | where DiskType contains "Premium";
// Summarize InsightsMetrics data (only one row per Computer/Disk combination)
let MetricsData = 
    InsightsMetrics
    | where Name == "FreeSpaceMB"
    | extend Tags = parse_json(Tags)
    | extend
        Disk = tostring(Tags["vm.azm.ms/mountId"])
        ,
        diskSizeMB = toreal(Tags["vm.azm.ms/diskSizeMB"])
    | summarize arg_max(TimeGenerated, *) by Computer, Disk, DiskResourceId = tolower(_ResourceId)
    | extend DisksizeinGB = round(diskSizeMB / 1024, 2)
    | extend AvailablespaceinGB = round(Val / 1024, 2)
    | extend UsedSpaceinGB = round(DisksizeinGB - AvailablespaceinGB, 2)
    | extend DiskUtilizationPercentage = round((UsedSpaceinGB / DisksizeinGB) * 100, 2)
    | project
        Computer,
        Disk,
        DiskResourceId,
        DisksizeinGB,
        AvailablespaceinGB,
        UsedSpaceinGB,
        DiskUtilizationPercentage;
//Summarize InisghtMetrics data for Read IOPS
let ReadIops = 
    InsightsMetrics
    | where Origin == "vm.azm.ms"
        and Namespace == "LogicalDisk"
    | where Name == "ReadsPerSecond"
    | extend Disk=tostring(todynamic(Tags)["vm.azm.ms/mountId"])
    | summarize max(Val) by Computer, Disk, _ResourceId, bin(TimeGenerated, 30d)
    | project
        TimeGenerated,
        Computer,
        Disk,
        ReadIOPSMax = max_Val,
        ReadIOPSResID = _ResourceId;
//Summarize InsightMetrics data for Write IOPS
let WriteIops = 
    InsightsMetrics
    | where Origin == "vm.azm.ms"
        and Namespace == "LogicalDisk"
    | where Name == "WritesPerSecond"
    | extend Disk=tostring(todynamic(Tags)["vm.azm.ms/mountId"])
    | summarize max(Val) by Computer, Disk, _ResourceId, bin(TimeGenerated, 30d)
    | project
        TimeGenerated,
        Computer,
        Disk,
        WriteIOPSMax = max_Val,
        WriteIOPSResID = _ResourceId;

// Join DiskData with MetricsData
let DiskMetrics = DiskData
    | join kind=inner (MetricsData) on $left._ResourceId == $right.DiskResourceId
    | project
        Computer,
        AppName,
        resourceGroup,
        location,
        OSType,
        DiskType,
        diskName,
        Disk,
        DisksizeinGB,
        diskSizeGB,
        Throughput,
        IOPSReadWrite,
        AvailablespaceinGB,
        UsedSpaceinGB,
        DiskUtilizationPercentage;
        

// Join DiskMetrics with ReadIops
let DiskMetricsWithReadIOPS = DiskMetrics
    | join kind=inner (ReadIops) on $left.Disk == $right.Disk and $left.Computer == $right.Computer
    | project
        diskName,
        diskSizeGB,
        resourceGroup,
        location,
        OSType,
        DiskType,
        Throughput,
        IOPSReadWrite,
        Computer,
        AppName,
        Disk,
        DisksizeinGB,
        AvailablespaceinGB,
        UsedSpaceinGB,
        DiskUtilizationPercentage,
        ReadIOPSMax;

// Join DiskMetricsWithReadIOPS with WriteIops
let FinalDiskSummary = DiskMetricsWithReadIOPS
    | join kind=inner (WriteIops) on $left.Disk == $right.Disk and $left.Computer == $right.Computer
    | project
        Computer,
        AppName,
        resourceGroup,
        location,
        OSType,
        DiskType,
        diskName,
        diskSizeGB,
        Disk,
        DisksizeinGB,
        AvailablespaceinGB,
        UsedSpaceinGB,
        DiskUtilizationPercentage,
        Throughput,
        IOPSReadWrite,
        ReadIOPSMax,
        WriteIOPSMax;

// Output the final summarized table
FinalDiskSummary


Azure Monitor
Azure Monitor
An Azure service that is used to collect, analyze, and act on telemetry data from Azure and on-premises environments.
3,579 questions
{count} votes

Your answer

Answers can be marked as Accepted Answers by the question author, which helps users to know the answer solved the author's problem.