製品コラム

セイテクエンジニアのブログ  製品コラム  Azure VMのホストメトリックをゲスト側から監視したい-BOM for Windows活用例

 

 

Azure VMのホストメトリックをゲスト側から監視したい-BOM for Windows活用例

2026年04月22日配信
執筆者:セイ・テクノロジーズ エバンジェリスト

 「BOM for Windows Ver.8.0」(以下、BOM)の「カスタム監視」を使用すると、BOM標準の監視設定にはない、独自の監視を行えます。例えば、Azure VMのWindowsゲストにBOMを導入し、Windows Serverのサーバー監視を行うことができますが、そこにAzureが提供する監視メトリックをゲスト側から取得して、BOMの監視に統合することができます。

 

Azure Monitorが提供するホストメトリック

 

 「Azure Monitor(監視)」は、クラウドとオンプレミスからの監視データを収集、監視する包括的なソリューションです。Azure VMについては、通常、何もしなくても、既定でCPU、メモリ、ネットワーク、ディスク、可用性など、いくつかのメトリックが収集されるので、AzureポータルやAzure PowerShell、Azure CLIを使用してパフォーマンス状態を監視することができます。「VM Insights」を有効化すれば、オプションでゲストからパフォーマンス情報(ゲストメトリック)を収集することもできます(VM Insights自体は無料ですが、依存するLog Analyticsワークスペースに料金がかかります)。

Azure Monitor の概要|Azure(Microsoft Learn)

 Azure VMで取得できる無料のメトリックは、Azureの基盤側から取得できる「ホストメトリック」であり、ホストメトリックでしか取得できない(ゲストのパフォーマンスモニターなどでは取得できない)メトリックとして次のようなものがあります。Azure VMでは、VMのシリーズやサイズによって、ディスクのIOPSやスループット(帯域)に上限が設定されていますが、ホストメトリックを使用するとその現在の使用率を監視することができます。Azure VMの現在の上限がボトルネックになっているなら、VMのシリーズやサイズをアップグレードすることで、簡単にそのボトルネックを解消できるでしょう。

CPU Credits Remaining(Bシリーズ向けのCPUクレジット残)
CPU Credits Consumed(Bシリーズ向けのCPUクレジット消費)
OS/Data Disk Bandwidth Consumed Percentage
OS/Data Disk IOPS Consumed Percentage
OS/Data Disk Target Bandwidth
OS/Data Disk Target IOPS
OS/Data Disk Max Burst Bandwidth
OS/Data Disk Max Burst IOPS
OS/Data Disk Used Burst BPS Credits 
・・・

 特定のVMで利用できるメトリックはAzureポータルのGUIで確認できます(画面1)。また、Azure PowerShellのGet-AzMetricDefinitionコマンドレットで確認することもできます。Azure Cloud Shellなら、次のコマンドラインを実行することで確認できます(画面2)。
注: Az.Monitorモジュールが必要です。Az.MonitorはAz.Account 5.3.1以降でサポートされています。Az.Accountsのバージョン(Get-Module Az.Accountsで確認可能)が古い場合は、「設定 > ユーザー設定のリセット」を実行することで、最新バージョンに更新できる場合があります。

 

$vmid = (Get-AzVM -Name "VM名").Id
$metrics = Get-AzMetricDefinition -ResourceId $vmId
$metrics | Select  @{Name="ID"; Expression={ ($_.ID -Replace $vmid,"") -Replace "/providers/microsoft.insights/metricdefinitions/","" }} , Unit,PrimaryAggregationType

 

画面1 Azure VMで利用可能なホストメトリック。ホストメトリックには、Azure側からでなければ取得できないメトリックがある

画面1 Azure VMで利用可能なホストメトリック。ホストメトリックには、Azure側からでなければ取得できないメトリックがある

 

画面2 Get-AzMetricDefinitionコマンドレットを実行して、VMで利用可能なホストメトリックを確認する
画面2 Get-AzMetricDefinitionコマンドレットを実行して、VMで利用可能なホストメトリックを確認する

 標準のメトリック(CPU使用率など)や追加したメトリックは、Azureポータルのグラフを使用してリアルタイムの情報を確認できます。Azure PowerShellのGet-AzMetricを使用してメトリックの値を取得することもできます。例えば、Azure Cloud Shellで次のコマンドラインを実行すると、利用可能メモリ(Available Memory Bytes)の最新のバイト数を確認できます(画面3)。

 

$vmid = (Get-AzVM -Name "VM名").Id
$metric = Get-AzMetric -ResourceId $vmId -MetricName "Available Memory Bytes" -TimeGrain 00:01:00
$metric.Data | Select-Object -Last 1

 

画面3 Get-AzMetricコマンドレットを使用してメトリックの値を取得する

画面3 Get-AzMetricコマンドレットを使用してメトリックの値を取得する。Get-AzMetricは、指定した期間(この例では1分間)の1秒ごとの値(60個の値)を返す。最新は|Select-Object -Last 1で、平均/最大/最小はMeasure-Object -Property Average -Average/Maximum/Minimumで取得可能

 

Azure REST API経由でホストメトリックを取得する

 

 Azure REST APIを利用すれば、利用環境に影響を受けることなく、どこでも利用可能な方法でAzureから情報を取得できます。もちろん、Azure VMのゲスト側からも利用できます。Azure VMのゲストで実行中のBOMからホストメトリックを監視するには、この方法が利用できます(図1)。

 

bomazperf_fig01-1
図1 Azure VMのゲストメトリックはBOMテンプレート組み込みの監視項目やパフォーマンスカウンター監視で、ホストメトリックはカスタム監視を利用してAzure Monitorから取得する

 

 ホストメトリックの一覧、およびメトリックの値は、次のAPIで取得できます。

 

Monitor > Metric Definitions - List|Azure(Microsoft Learn) ・・・ Get-AzMetricDefinition に対応する API
Monitor > Metrics - List|Azure(Microsoft Learn) ・・・ Get-AzMetric に対応するAPI


 次の「get-azhostmetric.ps1」は、Metrics - List API を使用して、指定したVMの、指定したメトリックの値を取得するスクリプトです。このスクリプトにAzure VMのVM名(-vmname)とホストメトリック名(-metric)を渡すことで、直近5分間のメトリック値(1分間隔、最大5個)を取得し、有効データの平均値を計算して、結果を四捨五入して整数で返すスクリプトです(画面4)。このスクリプトはPowerShell(Windows PowerShell 5.1《powershell.exe》またはPowerShell 7.x《pwsh.exe》)で実行することができ、Microsoft Entra IDのアプリ登録を利用するため、対話認証なしで利用できます。


[get-azhostmetric.ps1](プレーンテキストで表示)


[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" +
       "&timespan=$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. "
}

 

 以下の連載記事では、Azure REST APIを使用してPowerShellスクリプトでAzure仮想マシン(VM)の一覧を取得する方法を紹介しました。今回紹介するスクリプトの前半のアクセストークン取得部分は、この記事で紹介したスクリプトと共通です。Entra IDへのアプリ登録の方法や接続に必要な情報(クライアントID、クライアントシークレット、サブスクリプションID、テナントID)の取得方法についても、以下の記事を参照してください。以下の記事で使用したAPIは、今回のスクリプトにおいても、Azure VMのリソースIDを取得するために使用しています。

vol.56 はじめてのAzure REST API|Azure&Entra IDスクリプト大作戦(3)|かつて山市良とよばれたおじさんのブログ

Virtual Machines > Virtual Machines - List |Azure(Microsoft Learn)

 

 今回のスクリプトに使用した Metrics - List API は、指定した期間(timespan)中、1分ごと(既定のintaval、timegrain)のメトリック値を平均(average)、合計(total)、最大(maxium)、または最小(minimum)を返します。このスクリプトでは直近の5分間の5個のサンプルを取得しますが、取得するタイミングやVM停止中だった場合に、以下のように値の抜けが発生することがあります。スクリプトではこの抜けを除外して、残った有効値の平均値を求め、平均値を四捨五入して整数にして返します。つまり、メトリックがその期間の合計を返すものであれば、最大5つ(この例では5つ)の合計値の平均を返します。また、値がまったく無い(全期間VM停止中)場合は0を返します。

 

timeStamp            average
---------            -------
2026-02-06T06:37:00Z       1
2026-02-06T06:38:00Z       0
2026-02-06T06:39:00Z       0
2026-02-06T06:40:00Z       0
2026-02-06T06:41:00Z                   ←値なし

 

 また、このスクリプトは、指定したVMやメトリックが存在しないなどのエラーはスローして終了(例外エラーで異常終了)し、それ以外は値が無い場合(期間の全体でVMが停止中で、1つも値がなかった場合)を含め、0を返します。

 

画面4 「Get-AzHostPerf.ps1 <VM名> "ホストメトリック名"」を実行すると、APIから返ってくるメトリック(平均、合計、最小、または最大)の最大5つの値の平均を整数に丸めて返す

画面4 「Get-AzHostPerf.ps1 "<VM名>" "ホストメトリック名"」を実行すると、APIから返ってくるメトリック(平均、合計、最小、または最大)の最大5つの値の平均を整数に丸めて返す

 

BOMのカスタム監視で継続的にしきい値監視する

 

 Azure VMのゲストにインストールされたBOMに、「get-azhostmetric.ps1」を5分間隔で実行するカスタム監視項目を作成し、しきい値を適宜設定します。この例では、OSディスクとデータディスクのIOPS消費率(OS/Data Disk IOPS Consumed Percentage)を、80%以上で注意、90%以上で危険のしきい値で監視するように設定しています(画面5、画面6)。

 

画面5 OSディスクとデータディスクのIOPS消費率を5分間隔でしきい値監視するように設定する
画面5 OSディスクとデータディスクのIOPS消費率を5分間隔でしきい値監視するようにBOMのカスタム監視を作成する

 

画面6 Azure Monitorのグラフと比較すれば、ホストメトリックをBOMから監視できているのわかる
画面6 Azure Monitorのグラフと比較すれば、ホストメトリックをBOMから監視できているのがわかる

 

 このように、BOMの監視はさまざまなシナリオに柔軟に対応できるため、BOM以外の監視ツール(今回の例ではAzure Monitor)の監視を、BOMに取り込んで一元的に監視することができます。

blog_column_subscribe

blog_column_comment

最新記事