Azure Monitor Workspace で ゲスト OS のメトリクスを集めたときの費用感

azure
Published: 2026-01-06

はじめに

OpenTelemetry ベースのパフォーマンスカウンタを Azure Monitor Workspace に収集できるようになりました。VM Insight も OpenTelemetry ベースの仕組みがプレビューになっています。

すでに、Azure Portal 上では従来の Log Analytics による VM Insight が「クラシック」になっています。気が早すぎるのよ…

VM Insight の画面

OpenTelemerty ベースのメトリクスは、従来の Log Analytics の手法と比較してコストが安価らしいです。

Store metrics in Azure Monitor Workspace instead of Log Analytics ingestion for lower cost and faster queries.

どのくらい安価になるのかがわからなかったので、Azure Arc に登録済みの Ubuntu 22.04 を利用して実際に試してみました。

Log Analytics ベースの費用

データ収集ルールを利用して、Perf テーブルと InsightsMetrics テーブルにデータを投入します。データ収集ルールの設定値は以下の通りです。ポータルから何も考えずに作ったデフォルト設定なので、すべてのカウンターを収集する形になっています。

データ収集ルール抜粋

"performanceCounters": [
    {
        "streams": [
            "Microsoft-InsightsMetrics"
        ],
        "samplingFrequencyInSeconds": 60,
        "counterSpecifiers": [
            "\\VmInsights\\DetailedMetrics"
        ],
        "name": "Microsoft-InsightsMetrics"
    }
]
"performanceCounters": [
    {
        "streams": [
            "Microsoft-Perf"
        ],
        "samplingFrequencyInSeconds": 60,
        "counterSpecifiers": [
            "\\Processor Information(_Total)\\% Processor Time",
            "\\Processor Information(_Total)\\% Privileged Time",
            "\\Processor Information(_Total)\\% User Time",
            "\\Processor Information(_Total)\\Processor Frequency",
            "\\System\\Processes",
            "\\Process(_Total)\\Thread Count",
            "\\Process(_Total)\\Handle Count",
            "\\System\\System Up Time",
            "\\System\\Context Switches/sec",
            "\\System\\Processor Queue Length",
            "\\Memory\\% Committed Bytes In Use",
            "\\Memory\\Available Bytes",
            "\\Memory\\Committed Bytes",
            "\\Memory\\Cache Bytes",
            "\\Memory\\Pool Paged Bytes",
            "\\Memory\\Pool Nonpaged Bytes",
            "\\Memory\\Pages/sec",
            "\\Memory\\Page Faults/sec",
            "\\Process(_Total)\\Working Set",
            "\\Process(_Total)\\Working Set - Private",
            "\\LogicalDisk(_Total)\\% Disk Time",
            "\\LogicalDisk(_Total)\\% Disk Read Time",
            "\\LogicalDisk(_Total)\\% Disk Write Time",
            "\\LogicalDisk(_Total)\\% Idle Time",
            "\\LogicalDisk(_Total)\\Disk Bytes/sec",
            "\\LogicalDisk(_Total)\\Disk Read Bytes/sec",
            "\\LogicalDisk(_Total)\\Disk Write Bytes/sec",
            "\\LogicalDisk(_Total)\\Disk Transfers/sec",
            "\\LogicalDisk(_Total)\\Disk Reads/sec",
            "\\LogicalDisk(_Total)\\Disk Writes/sec",
            "\\LogicalDisk(_Total)\\Avg. Disk sec/Transfer",
            "\\LogicalDisk(_Total)\\Avg. Disk sec/Read",
            "\\LogicalDisk(_Total)\\Avg. Disk sec/Write",
            "\\LogicalDisk(_Total)\\Avg. Disk Queue Length",
            "\\LogicalDisk(_Total)\\Avg. Disk Read Queue Length",
            "\\LogicalDisk(_Total)\\Avg. Disk Write Queue Length",
            "\\LogicalDisk(_Total)\\% Free Space",
            "\\LogicalDisk(_Total)\\Free Megabytes",
            "\\Network Interface(*)\\Bytes Total/sec",
            "\\Network Interface(*)\\Bytes Sent/sec",
            "\\Network Interface(*)\\Bytes Received/sec",
            "\\Network Interface(*)\\Packets/sec",
            "\\Network Interface(*)\\Packets Sent/sec",
            "\\Network Interface(*)\\Packets Received/sec",
            "\\Network Interface(*)\\Packets Outbound Errors",
            "\\Network Interface(*)\\Packets Received Errors",
            "Processor(*)\\% Processor Time",
            "Processor(*)\\% Idle Time",
            "Processor(*)\\% User Time",
            "Processor(*)\\% Nice Time",
            "Processor(*)\\% Privileged Time",
            "Processor(*)\\% IO Wait Time",
            "Processor(*)\\% Interrupt Time",
            "Memory(*)\\Available MBytes Memory",
            "Memory(*)\\% Available Memory",
            "Memory(*)\\Used Memory MBytes",
            "Memory(*)\\% Used Memory",
            "Memory(*)\\Pages/sec",
            "Memory(*)\\Page Reads/sec",
            "Memory(*)\\Page Writes/sec",
            "Memory(*)\\Available MBytes Swap",
            "Memory(*)\\% Available Swap Space",
            "Memory(*)\\Used MBytes Swap Space",
            "Memory(*)\\% Used Swap Space",
            "Process(*)\\Pct User Time",
            "Process(*)\\Pct Privileged Time",
            "Process(*)\\Used Memory",
            "Process(*)\\Virtual Shared Memory",
            "Logical Disk(*)\\% Free Inodes",
            "Logical Disk(*)\\% Used Inodes",
            "Logical Disk(*)\\Free Megabytes",
            "Logical Disk(*)\\% Free Space",
            "Logical Disk(*)\\% Used Space",
            "Logical Disk(*)\\Logical Disk Bytes/sec",
            "Logical Disk(*)\\Disk Read Bytes/sec",
            "Logical Disk(*)\\Disk Write Bytes/sec",
            "Logical Disk(*)\\Disk Transfers/sec",
            "Logical Disk(*)\\Disk Reads/sec",
            "Logical Disk(*)\\Disk Writes/sec",
            "Network(*)\\Total Bytes Transmitted",
            "Network(*)\\Total Bytes Received",
            "Network(*)\\Total Bytes",
            "Network(*)\\Total Packets Transmitted",
            "Network(*)\\Total Packets Received",
            "Network(*)\\Total Rx Errors",
            "Network(*)\\Total Tx Errors",
            "Network(*)\\Total Collisions",
            "System(*)\\Uptime",
            "System(*)\\Load1",
            "System(*)\\Load5",
            "System(*)\\Load15",
            "System(*)\\Users",
            "System(*)\\Unique Users",
            "System(*)\\CPUs"
        ],
        "name": "perfCounterDataSource60"
    }
]

今回は12月13日分のデータをもとに計算します。両方のテーブルには1つのカウンターが1439個保存されているので、24時間分のデータがちゃんと保持されているとみなします。

$query1 =@"
Perf
| where TimeGenerated between ( datetime("2025-12-13") .. datetime("2025-12-14"))
| where CounterName == "Used Memory MBytes"
| count
"@

Invoke-AzOperationalInsightsQuery -WorkspaceId bc3058e4-3d37-4ae9-8c8d-8a4bef6c6fea -Query $query1 | Select-Object -ExpandProperty Results | Select-Object -ExpandProperty Count

1439

$query2 = @"
InsightsMetrics
| where TimeGenerated between ( datetime("2025-12-13") .. datetime("2025-12-14"))
| where Name == "Heartbeat"
| count
"@

Invoke-AzOperationalInsightsQuery -WorkspaceId bc3058e4-3d37-4ae9-8c8d-8a4bef6c6fea -Query $query2 | Select-Object -ExpandProperty Results | Select-Object -ExpandProperty Count

1440

この2つのデータだけを保持している Log Analytics の料金は $0.5354633892 です。

$url= "https://management.azure.com/subscriptions/158d1ff6-3ba2-4be7-889e-9043d33c8175/providers/Microsoft.CostManagement/generateCostDetailsReport?api-version=2022-05-01"

$body = @"
{
  "metric": "ActualCost",
  "timePeriod": {
    "start": "2025-12-12",
    "end": "2025-12-14"
  }
}
"@

$res = Invoke-AzRestMethod -Method Post -Uri $url -Payload $body
$AbsoluteUri = Invoke-AzRestMethod -Method GET -Uri $res.Headers.Location.AbsoluteUri
$report = ($AbsoluteUri.Content |ConvertFrom-Json).manifest.blobs[0].blobLink
Invoke-WebRequest -Uri $report -OutFile "costreport.csv"

$reports = get-content .\costreport.csv | ConvertFrom-Csv

$la = "/subscriptions/158d1ff6-3ba2-4be7-889e-9043d33c8175/resourcegroups/rg-monitor/providers/microsoft.operationalinsights/workspaces/oteltest"
$reports | Where-Object {$_.ResourceId -eq $la} | Select-Object date,meterName,effectivePrice,quantity,unitOfMeasure,costInBillingCurrency 


date                  : 12/13/2025
meterName             : Analytics Logs Data Ingestion
effectivePrice        : 3.34
quantity              : 0.16031838
unitOfMeasure         : 1 GB
costInBillingCurrency : 0.5354633892

Azure Monitor Workspace ベースの費用

データ収集ルールを利用して、OpenTelemerty ベースのパフォーマンスカウンタを Azure Monitor Workspace に投入します。データ収集ルールの設定値は以下の通りです。ポータルから何も考えずに作ったデフォルト設定なので、すべてのカウンターを収集する形になっています。

データ収集ルール抜粋

"performanceCountersOTel": [
    {
        "streams": [
            "Microsoft-OtelPerfMetrics"
        ],
        "samplingFrequencyInSeconds": 60,
        "counterSpecifiers": [
            "system.cpu.time",
            "system.cpu.frequency",
            "system.cpu.logical.count",
            "system.cpu.physical.count",
            "system.cpu.utilization",
            "system.disk.io",
            "system.disk.io_time",
            "system.disk.merged",
            "system.disk.operation_time",
            "system.disk.operations",
            "system.disk.pending_operations",
            "system.disk.weighted_io_time",
            "system.cpu.load_average.15m",
            "system.cpu.load_average.1m",
            "system.cpu.load_average.5m",
            "system.filesystem.inodes.usage",
            "system.filesystem.usage",
            "system.filesystem.utilization",
            "system.memory.usage",
            "system.linux.memory.available",
            "system.linux.memory.dirty",
            "system.memory.limit",
            "system.memory.page_size",
            "system.memory.utilization",
            "system.network.connections",
            "system.network.dropped",
            "system.network.errors",
            "system.network.io",
            "system.network.packets",
            "system.network.conntrack.count",
            "system.network.conntrack.max",
            "system.paging.faults",
            "system.paging.operations",
            "system.paging.usage",
            "system.paging.utilization",
            "system.processes.count",
            "system.processes.created",
            "process.cpu.time",
            "process.disk.io",
            "process.memory.usage",
            "process.memory.virtual",
            "process.context_switches",
            "process.cpu.utilization",
            "process.disk.operations",
            "process.handles",
            "process.memory.utilization",
            "process.open_file_descriptors",
            "process.paging.faults",
            "process.signals_pending",
            "process.threads",
            "process.uptime",
            "system.uptime"
        ],
        "name": "OtelDataSource60"
    }
]

比較対象とするデータは当然12月13日分のデータです。1つのカウンターが1441個保存されているので、24時間分のデータがちゃんと保持されているとみなします。

$url = "https://login.microsoftonline.com/$tenantID/oauth2/token"
$body = @{
    grant_type    = "client_credentials"
    client_id     = $appID
    client_secret = $clientSecret
    resource      = "https://prometheus.monitor.azure.com"
}

$token = (Invoke-RestMethod -Uri $url -Method POST -Body $body).access_token
$bearerToken = "Bearer $token"

$fromData = Get-Date "2025-12-13 09:00:00" -UFormat "%s"
$toData = Get-Date "2025-12-14 09:00:00" -UFormat "%s"

$data = Invoke-RestMethod -Uri "https://amw2-cfcbffhzeqezekhf.japaneast.prometheus.monitor.azure.com/api/v1/query_range?query=%7B%22system.cpu.load_average.15m%22%7D&start=$fromData&end=$toData&step=1m" -Headers @{ Authorization = $bearerToken }
$data.data.result.values.count

1441

1つのサーバだけの情報を保持している Azure Monitor Workspace の料金は、インジェストの料金が $0.040693936 で、クエリの料金が $0.00204469 です。


$amw = "/subscriptions/158d1ff6-3ba2-4be7-889e-9043d33c8175/resourceGroups/rg-monitor/providers/microsoft.monitor/accounts/amw2"
$reports | Where-Object {$_.ResourceId -eq $amw} | Select-Object date,meterName,effectivePrice,quantity,unitOfMeasure,costInBillingCurrency 


date                  : 12/13/2025
meterName             : Metrics ingestion Metric samples
effectivePrice        : 0.16
quantity              : 0.2543371
unitOfMeasure         : 10M
costInBillingCurrency : 0.040693936

date                  : 12/13/2025
meterName             : Prometheus Metrics Queries Metric samples
effectivePrice        : 0.001
quantity              : 0.0204469
unitOfMeasure         : 10M
costInBillingCurrency : 0.0000204469

インジェスト料金の比較

2つのデータの料金は以下の通りです

  • Log Analytics Workspace のデータインジェスト料金:$0.5354633892/日
  • Azure Monitor Workspace のデータインジェスト料金:$0.040693936/日

1ドル150円で30日収集としたときの費用は以下の通りです。

  • Log Analytics Workspace のデータインジェスト料金:¥2409.59/月
  • Azure Monitor Workspace のデータインジェスト料金:¥183.12/月

Azure Monitor Workspace を使った場合の削減率は、驚異の 92%(1-(183.12/2409.59))です。これは安い。

仮に Perf を取得せずに InsightMetrics だけで運用していた場合はどうなるでしょうか?

InsightMetrics と Perf のデータ量の比率は 13:87 です。

$query3 = @"
Usage
| where TimeGenerated between ( datetime("2025-12-13") .. datetime("2025-12-14"))
| summarize sum(Quantity) by DataType
"@

Invoke-AzOperationalInsightsQuery -WorkspaceId bc3058e4-3d37-4ae9-8c8d-8a4bef6c6fea -Query $query3 | Select-Object -ExpandProperty Results


DataType        sum_Quantity
--------        ------------
Perf            145.344064
InsightsMetrics 21.656436
Heartbeat       1.5565999999999998

素直にこの比率で料金も分かれると仮定すると、InsightsMetrics のデータインジェスト料金は ¥313.25/月(¥2409.59*0.13)になります。この場合の削減率は 41%(1-(183.12/313.25))になります。Perf と InsightMetrics 両方を取得していた場合の 92%OFF と比べるとインパクトが少ないですが、そうはいっても 4割引きです。データインジェスト料金が高額な環境ではかなりの節約効果になります。

今回の計算ではクエリにかかる料金を含めていないので、実際の割引率はもう少し下がります。とはいえクエリの費用は 1000万個の情報の取得あたり $0.001(=¥0.15)です。高頻度で VM Insight のメトリクスを開いたり、Azure Monitor Workspace でメトリクスを検索しない限りは大丈夫そうに見えます。

データ保持料金の比較

Log Analytics にはデータ保持の費用が掛かります。今回の場合、課金対象のデータ量は 167 MB/日=4.9GB/月です。

$query3 = @"
Usage
| where TimeGenerated between ( datetime("2025-12-13") .. datetime("2025-12-14"))
| summarize sum(Quantity) by DataType
"@

Invoke-AzOperationalInsightsQuery -WorkspaceId bc3058e4-3d37-4ae9-8c8d-8a4bef6c6fea -Query $query3 | Select-Object -ExpandProperty Results


DataType        sum_Quantity
--------        ------------
Perf            145.344064
InsightsMetrics 21.656436
Heartbeat       1.5565999999999998

Log Analytics のデータ保存費用は $0.15/GB/月なので、月額の費用は¥110(4.9GB/月×0.15×150)になります。

Azure Monitor Workspace の場合、最大で18か月まででにはなりますがデータの保存費用は無料です。

Data is physically stored in the same region that the Azure Monitor Workspace is provisioned in Data is encrypted at rest using a Microsoft-managed key Data is retained for 18 months

Data considerations

まとめ

実際の取得したデータをもとに、Log Analytics Workspace ベースのメトリクスを Azure Monitor Workspace ベースのメトリクスに置き換えたときのコスト削減具合を確認しました。一般公開時点でもこの価格感であれば、VM Insight をより気軽に使えるようになりそうです。VM Insight は気軽にパフォーマンスを可視化できる便利な仕組みなので、そのコストが下がるのはうれしい限りです。

Note

  • 当サイトは個人のブログです。このブログに示されている見解や意見は個人的なものであり、所属組織の見解や意見を表明するものではありません。
  • 公開情報を踏まえて正確な情報を掲載するよう努めますが、その内容の完全性や正確性、有用性、安全性、最新性について一切保証しません。
  • 添付文章やリンク先などを含む本サイトの内容は作成時点でのものであり、予告なく変更される場合があります。