Send Guest OS metrics to the Azure Monitor metrics database for a Windows virtual machine (classic)


We recommend that you use the Azure Az PowerShell module to interact with Azure. See Install Azure PowerShell to get started. To learn how to migrate to the Az PowerShell module, see Migrate Azure PowerShell from AzureRM to Az.

The Azure Monitor Diagnostics extension (known as "WAD" or "Diagnostics") allows you to collect metrics and logs from the guest operating system (Guest OS) running as part of a virtual machine, cloud service, or Service Fabric cluster. The extension can send telemetry to many different locations.

This article describes the process for sending Guest OS performance metrics for a Windows virtual machine (classic) to the Azure Monitor metric database. Starting with Diagnostics version 1.11, you can write metrics directly to the Azure Monitor metrics store, where standard platform metrics are already collected.

Storing them in this location allows you to access the same actions as you do for platform metrics. Actions include near-real time alerting, charting, routing, access from a REST API, and more. In the past, the Diagnostics extension wrote to Azure Storage, but not to the Azure Monitor data store.

The process that's outlined in this article only works on classic virtual machines that are running the Windows operating system.


Create a classic virtual machine and storage account

  1. Create a classic VM by using the Azure portal. Create Classic VM

  2. When you're creating this VM, choose the option to create a new classic storage account. We use this storage account in later steps.

  3. In the Azure portal, go to the Storage accounts resource pane. Select Keys, and take note of the storage account name and storage account key. You need this information in later steps. Storage access keys

Create a service principal

Create a service principal in your Microsoft Entra tenant by using the instructions at Create a service principal. Note the following while going through this process:

  • Create new client secret for this app.
  • Save the key and the client ID for use in later steps.

Give this app “Monitoring Metrics Publisher” permissions to the resource that you want to emit metrics against. You can use a resource group or an entire subscription.


The Diagnostics extension uses the service principal to authenticate against Azure Monitor and emit metrics for your classic VM.

Author Diagnostics extension configuration

  1. Prepare your Diagnostics extension configuration file. This file dictates which logs and performance counters the Diagnostics extension should collect for your classic VM. Following is an example:

    <?xml version="1.0" encoding="utf-8"?>
    <DiagnosticsConfiguration xmlns="">
    <PublicConfig xmlns="">
        <DiagnosticMonitorConfiguration overallQuotaInMB="4096" sinks="applicationInsights.errors">
            <DiagnosticInfrastructureLogs scheduledTransferLogLevelFilter="Error" />
            <Directories scheduledTransferPeriod="PT1M">
                <IISLogs containerName="wad-iis-logfiles" />
                <FailedRequestLogs containerName="wad-failedrequestlogs" />
            <PerformanceCounters scheduledTransferPeriod="PT1M">
                <PerformanceCounterConfiguration counterSpecifier="\Processor(*)\% Processor Time" sampleRate="PT15S" />
                <PerformanceCounterConfiguration counterSpecifier="\Memory\Available Bytes" sampleRate="PT15S" />
                <PerformanceCounterConfiguration counterSpecifier="\Memory\Committed Bytes" sampleRate="PT15S" />
                <PerformanceCounterConfiguration counterSpecifier="\Memory\% Committed Bytes" sampleRate="PT15S" />
                <PerformanceCounterConfiguration counterSpecifier="\LogicalDisk(*)\Disk Read Bytes/sec" sampleRate="PT15S" />
            <WindowsEventLog scheduledTransferPeriod="PT1M">
                <DataSource name="Application!*[System[(Level=1 or Level=2 or Level=3)]]" />
                <DataSource name="Windows Azure!*[System[(Level=1 or Level=2 or Level=3 or Level=4)]]" />
                <CrashDumpConfiguration processName="WaIISHost.exe" />
                <CrashDumpConfiguration processName="WaWorkerHost.exe" />
                <CrashDumpConfiguration processName="w3wp.exe" />
            <Logs scheduledTransferPeriod="PT1M" scheduledTransferLogLevelFilter="Error" />
            <Metrics resourceId="/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/MyResourceGroup/providers/Microsoft.ClassicCompute/virtualMachines/MyClassicVM">
                <MetricAggregation scheduledTransferPeriod="PT1M" />
                <MetricAggregation scheduledTransferPeriod="PT1H" />
        <StorageAccount />
    <PrivateConfig xmlns="">
        <StorageAccount name="" endpoint="" />
  2. In the “SinksConfig” section of your diagnostics file, define a new Azure Monitor sink, as follows:

        <Sink name="AzMonSink">
                <ResourceId>Provide the resource ID of your classic VM </ResourceId>
                <Region>The region your VM is deployed in</Region>
  3. In the section of your configuration file where the list of performance counters to be collected is listed, route the performance counters to the Azure Monitor sink "AzMonSink".

    <PerformanceCounters scheduledTransferPeriod="PT1M" sinks="AzMonSink">
        <PerformanceCounterConfiguration counterSpecifier="\Processor(_Total)\% Processor Time" sampleRate="PT15S" />
  4. In the private configuration, define the Azure Monitor account. Then add the service principal information to use to emit metrics.

    <PrivateConfig xmlns="">
    <StorageAccount name="" endpoint="" />
                <PrincipalId>clientId for your service principal</PrincipalId>
                <Secret>client secret of your service principal</Secret>
  5. Save this file locally.

Deploy the Diagnostics extension to your cloud service

  1. Launch PowerShell and sign in.

  2. Start by setting the context for your classic VM.

    $VM = Get-AzureVM -ServiceName <VM’s Service_Name> -Name <VM Name>
  3. Set the context of the classic storage account that was created with the VM.

    $StorageContext = New-AzStorageContext -StorageAccountName <name of your storage account from earlier steps> -storageaccountkey "<storage account key from earlier steps>"
  4. Set the Diagnostics file path to a variable by using the following command:

    $diagconfig = “<path of the diagnostics configuration file with the Azure Monitor sink configured>”
  5. Prepare the update for your classic VM with the diagnostics file that has the Azure Monitor sink configured.

    $VM_Update = Set-AzureVMDiagnosticsExtension -DiagnosticsConfigurationPath $diagconfig -VM $VM -StorageContext $Storage_Context
  6. Deploy the update to your VM by running the following command:

    Update-AzureVM -ServiceName "ClassicVMWAD7216" -Name "ClassicVMWAD" -VM $VM_Update.VM


It is still mandatory to provide a storage account as part of the installation of the Diagnostics extension. Any logs or performance counters that are specified in the Diagnostics config file will be written to the specified storage account.

Plot the metrics in the Azure portal

  1. Go to the Azure portal.

  2. On the left menu, select Monitor.

  3. On the Monitor pane on the left, select Metrics.

    Navigate metrics

  4. In the resources drop-down menu, select your classic VM.

  5. In the namespaces drop-down menu, select

  6. In the metrics drop-down menu, select Memory\Committed Bytes in Use. Plot metrics

Next steps