queries/finops/finops-empty-resource-groups.json

{
  "metadata": {
    "name": "FinOps - Empty resource groups",
    "description": "Detect empty resource groups that are older than 30 days when creation time is available.",
    "version": "1.0.0"
  },
  "queries": [
    {
      "guid": "70572a71-49ff-4131-a04d-1780f50b3706",
      "category": "Cost",
      "subcategory": "Empty resource groups",
      "severity": "Info",
      "text": "Empty resource groups older than 30 days",
      "queryable": true,
      "graph": "let resourceCounts = resources | summarize resourceCount = count() by subscriptionId, rgName = tolower(resourceGroup); resourcecontainers | where type =~ 'microsoft.resources/subscriptions/resourcegroups' | extend rgName = tolower(name), createdTime = todatetime(properties.createdTime) | join kind=leftouter resourceCounts on subscriptionId, rgName | extend resourceCount = toint(coalesce(resourceCount, 0)) | where resourceCount == 0 and (isnull(createdTime) or createdTime < ago(30d)) | project id, name, type, resourceGroup = name, subscriptionId, location, createdTime, detectedReason = iff(isnull(createdTime), 'Resource group is empty (creation time unavailable in ARG)', 'Resource group is empty and older than 30 days'), compliant = false"
    }
  ]
}