Fabric capacity left running outside production
A Microsoft Fabric capacity in the Active state while tagged non-production.
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 = cfopEnvA 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/capacitiesWhat 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.
Related checks
Dedicated SQL pool online with nothing querying it
A dedicated SQL pool whose status is Online, so its compute is billing, but which ran no queries at all over the window.
Data Explorer cluster running idle that will never stop itself
A running Azure Data Explorer cluster with no queries and no ingestion in the window, which auto-stop will never reach because it is switched off or the cluster sits in a virtual network.
Machine Learning compute instance with no automatic stop
A running Azure Machine Learning compute instance with neither an idle shutdown time nor an enabled stop schedule, so it bills the full VM rate until somebody stops it by hand.