AzureAzure MonitorObservability

azurerm_monitor_metric_alert cost estimation

A metric alert rule billed per monitored time series. A standard (static-threshold) rule is ~$0.10/month; dynamic-threshold rules are ~$0.50.

An azurerm_monitor_metric_alert evaluates a metric against a threshold and fires when it's breached. Cost is per monitored time series: a standard static-threshold rule is ~$0.10/month, and a dynamic-threshold (ML-based) rule is ~$0.50/month. These are tiny individually — the cost only matters at scale.

The subtlety is "per time series." A single alert rule scoped to multiple resources, or to a metric with multiple dimensions, monitors one time series per resource × dimension combination — and bills per series. So an alert rule applied across hundreds of VMs, or on a high-cardinality metric, multiplies the per-series charge well beyond the single-rule figure.

The levers: prefer static thresholds over dynamic where ML isn't needed (5x cheaper per series), be mindful of multi-resource and multi-dimension scope (it multiplies series), and remove alert rules that no longer serve a purpose. Notification actions (SMS, voice) have their own small charges; email/webhook are free.

c3x prices the alert from its type (static vs dynamic) per series; high-cardinality or broadly-scoped alerts scale from there.

Terraform example

A minimal but realistic configuration that C3X can estimate.

resource "azurerm_monitor_metric_alert" "cpu" {
  name                = "high-cpu"
  resource_group_name = azurerm_resource_group.main.name
  scopes              = [azurerm_linux_virtual_machine.app.id]

  criteria {
    metric_namespace = "Microsoft.Compute/virtualMachines"
    metric_name      = "Percentage CPU"
    aggregation      = "Average"
    operator         = "GreaterThan"
    threshold        = 80
  }

  action {
    action_group_id = azurerm_monitor_action_group.ops.id
  }
}

Pricing dimensions

What you actually pay for when you provision azurerm_monitor_metric_alert.

DimensionUnitWhat's being charged
Metric alertper time series-monthPer monitored time series. Static-threshold ~$0.10; dynamic-threshold ~$0.50. Multi-resource/multi-dimension scope multiplies the series count.
$0.10/series (static); $0.50/series (dynamic)

Sample C3X output

A single static-threshold metric alert (one time series):

azurerm_monitor_metric_alert.cpu
└─ Metric alert (static)   1 series-month   $0.10
                           Monthly          $0.10

Optimization tips

Common ways to reduce azurerm_monitor_metric_alert cost without changing the workload.

Prefer static thresholds where ML isn't needed

~$0.40/series vs dynamic

Dynamic-threshold (ML-based) alerts are ~5x the cost of static ones per series (~$0.50 vs ~$0.10). Use dynamic only where the metric genuinely benefits from adaptive baselining; static thresholds cover most alerting cheaply.

Mind multi-resource and multi-dimension scope

Proportional to series reduced

Cost is per time series, not per rule. An alert scoped across hundreds of VMs, or on a high-cardinality multi-dimension metric, bills per series — so broad or high-cardinality alerts add up well beyond the single-rule figure.

Remove stale alert rules

Per stale rule/series removed

Alert rules left over from decommissioned resources or old investigations still bill per series. Periodically prune rules that no longer fire or matter.

Use free notification channels

Per SMS/voice notification avoided

Email and webhook notifications are free; SMS and voice have per-notification charges. Route alerts through email/webhook/Teams where possible and reserve SMS/voice for genuine paging.

FAQ

How is an Azure Monitor metric alert billed?

Per monitored time series — a static-threshold rule is ~$0.10/month and a dynamic-threshold (ML) rule ~$0.50/month. Individually tiny; the cost matters at scale, since multi-resource or multi-dimension alerts bill per series, not per rule.

Why is my metric-alert cost higher than the number of rules?

Because it's per time series. One rule scoped to 200 VMs monitors 200 series and bills for 200. High-cardinality metrics (many dimension combinations) multiply it too. Scope alerts deliberately and prefer static over dynamic thresholds.

How does c3x estimate the cost?

From the alert type (static vs dynamic) per time series. For broadly-scoped or high-cardinality alerts, multiply by the series count to see the true cost.

Related resources

Estimate this resource in your own Terraform

Free, open source, no API key. C3X parses your Terraform and shows line-item cost for every resource, including azurerm_monitor_metric_alert.