Azure waste

Fabric capacity left running outside production

A Microsoft Fabric capacity in the Active state while tagged non-production.
The agent reports this
Reversible
Why it happens

A Microsoft Fabric capacity bills by capacity unit for every hour it is running, whether or not anything queries it, and it can be paused: Microsoft states that resuming a capacity also resumes billing, so a paused capacity costs nothing. Capacity usage is priced at about $0.18 per capacity unit an hour, uniform across the capacity-usage meters, so an F64 running all month is roughly $8,410 and an F2 about $263. A development or test capacity left running overnight and at weekends is paying that rate for hours nobody is working. Pausing is a single operation and resuming restores the capacity, but Microsoft warns that pausing can make Fabric content unavailable, so this check reports and does not act.

Paste this into Resource Graph Explorer in the Azure portal.

resources
| where type =~ 'microsoft.fabric/capacities'
// Scope below matches CloudFinOpsPro policy DEFAULTS: exclusions.protectTag, environment.tagKeys,
// environment.allowedTagValues, and allowUntagged false so an untagged resource counts as production.
// If your policy.yaml differs, edit the three lines below or this will disagree with your own agent.
| where tolower(tostring(coalesce(tags['cfop:protect'], ''))) !in ('true', 'yes', '1')
| extend cfopEnv = tolower(trim(' ', tostring(coalesce(tags['Environment'], tags['environment'], tags['env'], ''))))
| where cfopEnv in ('dev', 'development', 'test', 'qa', 'sandbox', 'nonprod', 'non-prod', 'staging')
// Tests POSITIVELY for Active. ResourceState also carries Suspended, Paused, Failed, Deleting and
// four transitional values, so excluding Paused alone would report capacities that are not running.
| extend capacityState = tostring(properties.state)
| where capacityState =~ 'Active'
| extend capacitySku = tostring(coalesce(sku.name, properties.sku.name))
| project name, resourceGroup, location, sku = capacitySku, state = capacityState, environment = cfopEnv

A Fabric capacity bills by capacity unit for every hour it is running, whether or not anything queries it. Microsoft states that resuming a capacity also resumes billing, so a paused capacity costs nothing; this is the opposite of a Synapse Spark pool, which is not charged for while idle. Capacity usage is about $0.18 per capacity unit an hour, verified as uniform across 92 of the 93 capacity-usage meters in eastus (the exception is the Capacity Overage penalty at $0.54), so an F64 running all month is roughly $8,410 and an F2 about $263. The query tests positively for the Active state rather than excluding Paused, because ResourceState also carries Suspended, Failed, Deleting and four transitional values, none of which is a capacity you are paying to run. This is a structural test, so what it returns is what the check reports.

Applies to microsoft.fabric/capacities
What the agent does about it

A Microsoft Fabric capacity in the Active state while tagged non-production.

It will not fix this one

It reports this and takes no action. A check only earns the right to change something once the action behind it can re-read live state before it fires and knows the way back.