Skip to main content
governance · azure

Azure Monitor alert rules sitting disabled and protecting nothing

resource types
1
rule IDs covered
1
severity
low

What does ZopNight detect here?

Disabled Azure Monitor alert rules (metric alerts and scheduled query rules whose enabled flag reads "false") are flagged by RC-1373 as dead monitoring configuration. Since a disabled rule monitors no signals, it costs $0, so the finding carries no savings; the remedy is to re-enable the rule or delete it.

Signal and threshold

How ZopNight evaluates Azure Monitor alert rules sitting disabled and protecting nothing.
Field Value
Rule IDsRC-1373
Categorygovernance
Severitylow
Metricnone — pure configuration read
Sourcemonitor_alert_unused.go

The alert you think you have

A disabled alert rule is worse than no alert rule, because it still shows up in every list. Someone silenced it during an incident, a migration, or a noisy week, and it never came back. From then on, the dashboard says “CPU alert: configured” while nothing watches the signal. The failure mode is a false sense of coverage: the outage arrives, the page never fires, and the retro discovers the rule was off the whole time. RC-1373 makes that discovery happen before the outage instead of during the retro.

An honest zero on the price tag

The original version of this rule claimed a disabled alert rule “still incurs cost” and gated on cost being positive. The premise is false: Azure Monitor bills per actively monitored signal or time series, and a disabled rule monitors none, so its charge is nothing. That also meant the old cost gate could never pass and the rule was structurally unfireable. The rescoped rule hardcodes $0 for current cost, optimized cost, and savings, and files the finding under governance. No dollars are invented to make hygiene look like a saving.

How disabled state is established

The discoverer reads properties.enabled from Azure Resource Graph for both alert-rule kinds (metric alerts and scheduled query rules) and stamps it into resource metadata. RC-1373 fires only when that flag is exactly "false" and abstains when it is absent. A prior gate keyed on a triggered=0 tag that no producer anywhere emitted; the rule could never fire until it was re-pointed at the authoritative enabled state. Detection needs only the built-in Reader role.

Enumerate your disabled rules

Terminal window
az monitor metrics alert list \
--query "[?enabled==\`false\`].{name:name, rg:resourceGroup, description:description}" -o table

Scheduled query rules have their own list: az monitor scheduled-query list with the same enabled filter.

Two valid outcomes, one invalid one

Re-enable the rule if the condition it watches still matters, ideally after fixing whatever made it noisy enough to silence. Delete it if the resource or condition is gone, so the next reviewer does not have to reason about it. The invalid outcome is leaving it disabled indefinitely: at that point the honest description of your monitoring posture is “no alert”, and the rule row in the portal is just decoration.

See it fire on your bill.

Connect an account read-only. The first findings land in minutes.

417 rule families across 353 resource types on 22 platforms. Every threshold, metric, and IAM action is documented on these pages before you grant anything.

417 rule families documented
353 resource types covered
read-only default access level
Multi-cloud automation· Production-ready in 30 min· SOC 2 · ISO 27001· 20–60% off the bill, first month· 4 platforms · 1 console· Multi-cloud automation· Production-ready in 30 min· SOC 2 · ISO 27001· 20–60% off the bill, first month· 4 platforms · 1 console·