diff --git a/Workbooks/Azure Advisor/Cost Optimization/AHB/AHB.workbook b/Workbooks/Azure Advisor/Cost Optimization/AHB/AHB.workbook
index b3ff96f767..119de4c53f 100644
--- a/Workbooks/Azure Advisor/Cost Optimization/AHB/AHB.workbook
+++ b/Workbooks/Azure Advisor/Cost Optimization/AHB/AHB.workbook
@@ -101,6 +101,14 @@
"linkLabel": "Custom Images",
"subTarget": "CustomImages",
"style": "link"
+ },
+ {
+ "id": "1dda3cc4-59ba-4758-9c51-d6c9fab18647",
+ "cellValue": "SelectedSubTab",
+ "linkTarget": "parameter",
+ "linkLabel": "Azure Arc",
+ "subTarget": "arc",
+ "style": "link"
}
]
},
@@ -638,6 +646,543 @@
},
"name": "CustomImages"
},
+ {
+ "type": 12,
+ "content": {
+ "version": "NotebookGroup/1.0",
+ "groupType": "editable",
+ "items": [
+ {
+ "type": 11,
+ "content": {
+ "version": "LinkItem/1.0",
+ "style": "tabs",
+ "links": [
+ {
+ "id": "3f12a4b6-b18d-4191-8c1c-6045a7edcb6b",
+ "cellValue": "SelectedSubTab",
+ "linkTarget": "parameter",
+ "linkLabel": "Windows Server ESU licenses",
+ "subTarget": "windowsEsu",
+ "style": "link"
+ },
+ {
+ "id": "0ca197b7-6f96-4def-9be4-dc26bb09538a",
+ "cellValue": "SelectedSubTab",
+ "linkTarget": "parameter",
+ "linkLabel": "Windows Server Management enabled by Azure Arc",
+ "subTarget": "arcAHB",
+ "style": "link"
+ }
+ ]
+ },
+ "name": "links - 1"
+ },
+ {
+ "type": 12,
+ "content": {
+ "version": "NotebookGroup/1.0",
+ "groupType": "editable",
+ "title": "Windows Server ESU licenses",
+ "items": [
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "// Run query to see results.\r\nresources\r\n| where type =~ 'microsoft.hybridcompute/machines'\r\n| extend esuEligibility = properties.licenseProfile.esuProfile.esuEligibility\r\n| where esuEligibility =~ \"Eligible\"\r\n| extend agentVersion = tostring(properties.agentVersion)\r\n| extend parsedAgentVersion = parse_version(agentVersion)\r\n| where parsedAgentVersion >= parse_version(\"1.34\")\r\n| extend machineId = tolower(id)\r\n| join kind=leftouter(\r\n resources\r\n | where type =~ \"microsoft.hybridcompute/machines/licenseProfiles\"\r\n | extend machineId = tolower(tostring(trim_end(@\"\\/\\w+\\/(\\w|\\.)+\", id)))\r\n | extend licenseId = tolower(tostring(properties.esuProfile.assignedLicense))\r\n) on $left.machineId == $right.machineId\r\n| join kind=leftouter (\r\n resources\r\n | where type =~ \"microsoft.hybridcompute/licenses\"\r\n | extend licenseId = tolower(id)\r\n) on licenseId\r\n| extend status = case(\r\n properties.status =~ 'Connected', 'Connected',\r\n properties.status =~ 'Disconnected', 'Offline',\r\n properties.status =~ 'Error', 'Error',\r\n properties.status =~ 'Expired', 'Expired',\r\n 'Unknown')\r\n| extend operatingSystem = properties.osSku\r\n| extend esuStatus = case(\r\n (properties.licenseProfile.esuProfile.licenseAssignmentState =~ 'Assigned' and properties2.licenseDetails.state =~ 'Activated'), 'Enabled',\r\n properties.licenseProfile.esuProfile.licenseAssignmentState =~ 'NotAssigned' and properties.licenseProfile.esuProfile.esuKeyState =~ 'Active', 'Enabled by Volume License',\r\n properties.licenseProfile.esuProfile.licenseAssignmentState =~ 'Assigned' and properties2.licenseDetails.state =~ 'Deactivated' and properties.licenseProfile.esuProfile.esuKeyState =~ 'Inactive', 'License deactivated',\r\n properties.licenseProfile.esuProfile.licenseAssignmentState =~ 'NotAssigned' and properties.licenseProfile.esuProfile.esuKeyState =~ 'Inactive', 'Not enabled',\r\n 'Unknown'\r\n)\r\n| project name, status, operatingSystem, esuStatus\r\n| summarize count() by esuStatus",
+ "size": 0,
+ "title": "Coverage Summary",
+ "showRefreshButton": true,
+ "queryType": 1,
+ "resourceType": "microsoft.resourcegraph/resources",
+ "crossComponentResources": [
+ "{Subscription}"
+ ],
+ "visualization": "piechart",
+ "chartSettings": {
+ "yAxis": [
+ "count_"
+ ],
+ "showLegend": true,
+ "seriesLabelSettings": [
+ {
+ "seriesName": "Not enabled",
+ "color": "red"
+ },
+ {
+ "seriesName": "Enabled",
+ "color": "green"
+ },
+ {
+ "seriesName": "Enabled by Volume License",
+ "color": "greenDarkDark"
+ },
+ {
+ "seriesName": "License deactivated",
+ "color": "yellow"
+ }
+ ]
+ }
+ },
+ "name": "coverageSummary"
+ },
+ {
+ "type": 1,
+ "content": {
+ "json": "## Review Your Current License Usage\r\n\r\nTo review your current license usage, go to the [Azure Arc](https://ms.portal.azure.com/#view/Microsoft_Azure_ArcCenterUX/ArcCenterMenuBlade/~/usageOverview) resource blade.\r\n\r\n",
+ "style": "info"
+ },
+ "name": "text - 5"
+ },
+ {
+ "type": 9,
+ "content": {
+ "version": "KqlParameterItem/1.0",
+ "parameters": [
+ {
+ "id": "16791a28-f78e-4b26-a2e9-a9fbbda915df",
+ "version": "KqlParameterItem/1.0",
+ "name": "eligibleResources",
+ "label": "View eligible resources?",
+ "type": 2,
+ "isRequired": true,
+ "typeSettings": {
+ "additionalResourceOptions": [],
+ "showDefault": false
+ },
+ "jsonData": "[\r\n {\"value\":\"Yes\"},\r\n {\"value\":\"No\", \"selected\":true}\r\n]\r\n\r\n",
+ "timeContext": {
+ "durationMs": 86400000
+ }
+ },
+ {
+ "id": "e24ddae0-37c5-46a7-b52f-b307baaa6f51",
+ "version": "KqlParameterItem/1.0",
+ "name": "eligibleLicenses",
+ "label": "View eligible licenses?",
+ "type": 2,
+ "isRequired": true,
+ "typeSettings": {
+ "additionalResourceOptions": [],
+ "showDefault": false
+ },
+ "jsonData": "[\r\n {\"value\":\"Yes\"},\r\n {\"value\":\"No\", \"selected\":true}\r\n]\r\n\r\n",
+ "timeContext": {
+ "durationMs": 86400000
+ }
+ }
+ ],
+ "style": "pills",
+ "queryType": 0,
+ "resourceType": "microsoft.operationalinsights/workspaces"
+ },
+ "name": "parameters - 5"
+ },
+ {
+ "type": 12,
+ "content": {
+ "version": "NotebookGroup/1.0",
+ "groupType": "editable",
+ "title": "Eligible Resources",
+ "items": [
+ {
+ "type": 1,
+ "content": {
+ "json": "Windows Server 2012 or 2012 R2 machines running Arc agent version below 1.34 are ineligible for Extended Security Updates (ESUs). Upgrade to the latest version of the Azure Arc agent to allow enabling ESU on these machines.\r\n\r\n",
+ "style": "info"
+ },
+ "name": "txtEligibleResources"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "// Run query to see results.\r\nresources\r\n| where type =~ 'microsoft.hybridcompute/machines'\r\n| extend esuEligibility = properties.licenseProfile.esuProfile.esuEligibility\r\n| where esuEligibility =~ \"Eligible\"\r\n| extend agentVersion = tostring(properties.agentVersion)\r\n| extend parsedAgentVersion = parse_version(agentVersion)\r\n| where parsedAgentVersion >= parse_version(\"1.34\")\r\n| extend machineId = tolower(id)\r\n| join kind=leftouter(\r\n resources\r\n | where type =~ \"microsoft.hybridcompute/machines/licenseProfiles\"\r\n | extend machineId = tolower(tostring(trim_end(@\"\\/\\w+\\/(\\w|\\.)+\", id)))\r\n | extend licenseId = tolower(tostring(properties.esuProfile.assignedLicense))\r\n) on $left.machineId == $right.machineId\r\n| join kind=leftouter (\r\n resources\r\n | where type =~ \"microsoft.hybridcompute/licenses\"\r\n | extend licenseId = tolower(id)\r\n) on licenseId\r\n| extend status = case(\r\n properties.status =~ 'Connected', 'Connected',\r\n properties.status =~ 'Disconnected', 'Offline',\r\n properties.status =~ 'Error', 'Error',\r\n properties.status =~ 'Expired', 'Expired',\r\n 'Unknown')\r\n| extend operatingSystem = properties.osSku\r\n| extend esuStatus = case(\r\n (properties.licenseProfile.esuProfile.licenseAssignmentState =~ 'Assigned' and properties2.licenseDetails.state =~ 'Activated'), 'Enabled',\r\n properties.licenseProfile.esuProfile.licenseAssignmentState =~ 'NotAssigned' and properties.licenseProfile.esuProfile.esuKeyState =~ 'Active', 'Enabled by Volume License',\r\n properties.licenseProfile.esuProfile.licenseAssignmentState =~ 'Assigned' and properties2.licenseDetails.state =~ 'Deactivated' and properties.licenseProfile.esuProfile.esuKeyState =~ 'Inactive', 'License deactivated',\r\n properties.licenseProfile.esuProfile.licenseAssignmentState =~ 'NotAssigned' and properties.licenseProfile.esuProfile.esuKeyState =~ 'Inactive', 'Not enabled',\r\n 'Unknown'\r\n)\r\n| extend esuStatusIcon = case(\r\n (properties.licenseProfile.esuProfile.licenseAssignmentState =~ 'Assigned' and properties2.licenseDetails.state =~ 'Activated'), '8',\r\n properties.licenseProfile.esuProfile.licenseAssignmentState =~ 'NotAssigned' and properties.licenseProfile.esuProfile.esuKeyState =~ 'Active', '9',\r\n properties.licenseProfile.esuProfile.licenseAssignmentState =~ 'Assigned' and properties2.licenseDetails.state =~ 'Deactivated' and properties.licenseProfile.esuProfile.esuKeyState =~ 'Inactive', '9',\r\n properties.licenseProfile.esuProfile.licenseAssignmentState =~ 'NotAssigned' or properties.licenseProfile.esuProfile.esuKeyState =~ 'Inactive', '7',\r\n '91'\r\n)\r\n| project name, status, resourceGroup, subscriptionId, operatingSystem, id, type, location, kind, tags, esuStatus, esuStatusIcon, agentVersion\r\n| extend subscriptionDisplayName=case(subscriptionId =~ 'e75c95f3-27b4-410f-a40e-2b9153a807dd','AEther Dev',subscriptionId =~ '823ca539-d44d-43ee-8dc8-023fd4f27396','AIOps_FailureSimulation_DevTest',subscriptionId =~ 'b2a328a7-ffff-4c09-b643-a4758cf170bc','AISC-DEV-02',subscriptionId =~ 'eef8b6d5-94da-4b36-9327-a662f2674efb','AISC-EngSys-01',subscriptionId =~ 'e0fd569c-e34a-4249-8c24-e8d723c7f054','AML - Responsible AI R&D',subscriptionId =~ 'f1d79e73-f8e3-4b10-bfdb-4207ca0723ed','AML Infra - Engineering System',subscriptionId =~ 'dad45786-32e5-4ef3-b90e-8e0838fbadb6','AnE.ExP.NonProduction',subscriptionId =~ '017ad81c-b730-4564-9109-9b763243a9a6','Anomaly Real Time-DevTest',subscriptionId =~ 'e686ef8c-d35d-4e9b-92f8-caaaa7948c0a','Applied Sciences Group Dev',subscriptionId =~ '6e967edb-425b-4a33-ae98-f1d2c509dda3','Arc enabled Infrastructure - Demo',subscriptionId =~ '710c6ed8-d8d9-4c51-b100-dc4d9e10dd18','ARC-ESU-TESTING-03',subscriptionId =~ '2145a411-d149-4010-84d4-40fe8a55db44','ARM Test Environment',subscriptionId =~ 'e2a8a7b3-cb7a-4930-9c79-2b0eb7bf843c','ASZ_Lab_Hardware_Dev_1',subscriptionId =~ '4c33a6bb-d566-4d0b-8951-00b55a91fba8','AzPIESecurity-DEV-Apple',subscriptionId =~ 'b65b516b-415b-4c68-a254-bfa7411275f8','Azure CloudES CDP ER - Test',subscriptionId =~ '6785ea1f-ac40-4244-a9ce-94b12fd832ca','Azure Migrate Demo Subscription',subscriptionId =~ '8c3c936a-c09b-4de3-830b-3f5f244d72e9','Azure Migrate Program Management Team',subscriptionId =~ '432a7068-99ae-4975-ad38-d96b71172cdf','Azure Profiler - Testing',subscriptionId =~ 'caffe3c0-acbd-4d01-af76-a45f421bfb64','Azure_Base_LivesiteArmory_test',subscriptionId =~ 'a1920ebd-59b7-4f19-af9f-5e80599e88e4','Babel',subscriptionId =~ 'b43a6159-1bea-4fa2-9407-e875fdc0ff55','BAP IA EU Schrems (P)',subscriptionId =~ 'ae71ef11-a03f-4b4f-a0e6-ef144727c711','Bing MM Measurement',subscriptionId =~ '8ef80208-601f-4c83-802e-751d211745f9','CloudAnalytics_Prod1',subscriptionId =~ 'f7b4a5ce-d3bd-4a03-84fe-8bcad772c8c1','Cog Services Computer Vision',subscriptionId =~ '38dbd059-bd26-4172-af17-bcc5a00744de','Core-ES-STREAM-DeXDI',subscriptionId =~ '87e8a61c-4832-4cfe-8b72-c12554f2309a','Cosmos_C&E_Azure_Azure Resource Manager_100424',subscriptionId =~ '8c4b5b03-3b24-4ed0-91f5-a703cd91b412','Cosmos_C&E_Azure_AzureEngineeringSystems_100200',subscriptionId =~ 'b988efc7-1bc8-4a73-b4a2-5ad864580250','Cosmos_C&E_DPG_Big Data_100036',subscriptionId =~ '6121bf73-2dc9-47ac-8b6a-c6ae4b88ef39','Cost Management PM',subscriptionId =~ '44074499-ad9f-45b9-9b0b-f594f8736a45','CSX-WSD-CFE-TNT-QPP',subscriptionId =~ '3cd01953-be46-4f9b-a4e0-26f19f428765','CSX-WSD-CFE-TNT-TOOLKITHUB',subscriptionId =~ '60214a3c-65a2-46f8-8b32-f959f2454106','Data Pillar Security Tooling',subscriptionId =~ 'f7c445af-a4de-4264-9e87-3196d6bc384d','Efficiency Pack Services (MSIT)',subscriptionId =~ '86f010b8-6473-4cb9-90c1-671c74faa4ee','emilyzhu dev subscription',subscriptionId =~ 'f3326bfd-5406-4136-a835-f64ccbfd9050','FTK @ MS',subscriptionId =~ 'd2c9544f-4329-4642-b73d-020e7fef844f','HPCScrub1',subscriptionId =~ 'bac420ed-c6fc-4a05-8ac1-8c0c52da1d6e','IDEAs MS Reporting',subscriptionId =~ '3cd95ff9-ac62-4b5c-8240-0cd046687ea0','Internal App Insights Resources for Perflens',subscriptionId =~ 'a386d5ea-ea90-441a-8263-d816368c84a1','IOT_PLATFORM_UPX_TEST',subscriptionId =~ '6a0ab98c-24d4-4131-8cd7-0a78bfce58f5','ITSM Integration - Production - New',subscriptionId =~ '13723929-6644-4060-a50a-cc38ebc5e8b1','LinuxMdsd Test',subscriptionId =~ '98b02a69-28a5-4ee7-a622-cd69c7a59c4e','Marvel Intelligence Model Training Subscription',subscriptionId =~ '1278a874-89fc-418c-b6b9-ac763b000415','Microsoft Azure Internal Consumption (nbrady)',subscriptionId =~ '29de2cfc-f00a-43bb-bdc8-3108795bd282','MSFT-Modern Device-Modern Mgmt-Imaging00',subscriptionId =~ '54b875cc-a81a-4914-8bfd-1a36bc7ddf4d','MSFT-WindowsVirtualDesktop-01',subscriptionId =~ '4dc2cd39-7a89-43d8-bebe-8bb501359891','Observability_AzMon_Grafana_Dev',subscriptionId =~ 'a471d615-ff98-4e80-b375-a19543d4691e','ODC-OneBox-Resources',subscriptionId =~ '1163fbbe-27e7-4b0f-8466-195fe5417043','Python_AI_Tools_PM_Team_Sub (jbinder)',subscriptionId =~ '3905431d-c062-4c17-8fd9-c51f89f334c4','Pytorch Build',subscriptionId =~ '3f577935-3138-4d07-86b3-75651b696483','Responsible & OpenAi Research',subscriptionId =~ '0f301386-8979-4981-acca-973d553078e7','Scope Team Test Subscription',subscriptionId =~ '1b0a5c20-7373-41a2-8fec-7364cceb7bbf','Services Hub Demo Open',subscriptionId =~ 'e72e5254-f265-4e95-9bd2-9ee8e7329051','Speech Services - DEV - SDK (carbon)',subscriptionId =~ 'a1c3dc6b-8630-4bb7-a29e-4ed4407c329b','Speech Services - EXP2',subscriptionId =~ '736af2bf-9fcb-4145-a19b-5b30b2b8949d','Trey International UK',subscriptionId =~ '51f73f67-1f29-4120-863e-dd315f743fc1','Trey Partner Lab 2',subscriptionId =~ '9ec51cfd-5ca7-4d76-8101-dd0a4abc5674','Trey Research Corporate',subscriptionId =~ '73c0021f-a37d-433f-8baa-7450cb54eea6','Trey Research Finance',subscriptionId =~ 'ed570627-0265-4620-bb42-bae06bcfa914','Trey Research IT',subscriptionId =~ '64e355d7-997c-491d-b0c1-8414dccfcf42','Trey Research R&D Playground',subscriptionId =~ '586f1d47-9dd9-43d5-b196-6e28f8405ff8','Trey Research R&D Production',subscriptionId =~ '9ec1d932-0f3f-486c-acc6-e7d78b358f9b','TScience',subscriptionId =~ '79f57c16-00fe-48da-87d4-5192e86cd047','TScienceGPU',subscriptionId =~ 'bac044cf-49e1-4843-8dda-1ce9662606c8','UI Fabric',subscriptionId =~ '6760347d-9ffe-41a9-ba11-c139dcea5ce6','xt-teams-migration-dev',subscriptionId =~ '45f9252d-e27e-4ed8-ab4e-dc5054de13fa','Contoso IT - Retail - Prod',subscriptionId)\r\n| where (type !~ ('dell.storage/filesystems'))\r\n| where (type !~ ('arizeai.observabilityeval/organizations'))\r\n| where (type !~ ('lambdatest.hyperexecute/organizations'))\r\n| where (type !~ ('pinecone.vectordb/organizations'))\r\n| where (type !~ ('microsoft.weightsandbiases/instances'))\r\n| where (type !~ ('purestorage.block/storagepools/avsstoragecontainers'))\r\n| where (type !~ ('purestorage.block/reservations'))\r\n| where (type !~ ('purestorage.block/storagepools'))\r\n| where (type !~ ('solarwinds.observability/organizations'))\r\n| where (type !~ ('splitio.experimentation/experimentationworkspaces'))\r\n| where (type !~ ('microsoft.agfoodplatform/farmbeats'))\r\n| where (type !~ ('microsoft.appsecurity/policies'))\r\n| where (type !~ ('microsoft.arc/all'))\r\n| where (type !~ ('microsoft.arc/allfairfax'))\r\n| where (type !~ ('microsoft.cdn/profiles/customdomains'))\r\n| where (type !~ ('microsoft.cdn/profiles/afdendpoints'))\r\n| where (type !~ ('microsoft.cdn/profiles/origingroups/origins'))\r\n| where (type !~ ('microsoft.cdn/profiles/origingroups'))\r\n| where (type !~ ('microsoft.cdn/profiles/afdendpoints/routes'))\r\n| where (type !~ ('microsoft.cdn/profiles/rulesets/rules'))\r\n| where (type !~ ('microsoft.cdn/profiles/rulesets'))\r\n| where (type !~ ('microsoft.cdn/profiles/secrets'))\r\n| where (type !~ ('microsoft.cdn/profiles/securitypolicies'))\r\n| where (type !~ ('microsoft.chaos/privateaccesses'))\r\n| where (type !~ ('microsoft.sovereign/transparencylogs'))\r\n| where (type !~ ('microsoft.sovereign/landingzoneconfigurations'))\r\n| where (type !~ ('microsoft.hardwaresecuritymodules/cloudhsmclusters'))\r\n| where (type !~ ('microsoft.compute/computefleetinstances'))\r\n| where (type !~ ('microsoft.compute/standbypoolinstance'))\r\n| where (type !~ ('microsoft.compute/virtualmachineflexinstances'))\r\n| where (type !~ ('microsoft.kubernetesconfiguration/extensions'))\r\n| where (type !~ ('microsoft.containerservice/managedclusters/microsoft.kubernetesconfiguration/extensions'))\r\n| where (type !~ ('microsoft.kubernetes/connectedclusters/microsoft.kubernetesconfiguration/namespaces'))\r\n| where (type !~ ('microsoft.containerservice/managedclusters/microsoft.kubernetesconfiguration/namespaces'))\r\n| where (type !~ ('microsoft.kubernetes/connectedclusters/microsoft.kubernetesconfiguration/fluxconfigurations'))\r\n| where (type !~ ('microsoft.containerservice/managedclusters/microsoft.kubernetesconfiguration/fluxconfigurations'))\r\n| where (type !~ ('microsoft.portalservices/extensions/deployments'))\r\n| where (type !~ ('microsoft.portalservices/extensions'))\r\n| where (type !~ ('microsoft.portalservices/extensions/slots'))\r\n| where (type !~ ('microsoft.portalservices/extensions/versions'))\r\n| where (type !~ ('microsoft.datacollaboration/workspaces'))\r\n| where (type !~ ('microsoft.deviceregistry/devices'))\r\n| where (type !~ ('microsoft.deviceupdate/updateaccounts/activedeployments'))\r\n| where (type !~ ('microsoft.deviceupdate/updateaccounts/agents'))\r\n| where (type !~ ('microsoft.deviceupdate/updateaccounts/deployments'))\r\n| where (type !~ ('microsoft.deviceupdate/updateaccounts/deviceclasses'))\r\n| where (type !~ ('microsoft.deviceupdate/updateaccounts/updates'))\r\n| where (type !~ ('microsoft.deviceupdate/updateaccounts'))\r\n| where (type !~ ('private.devtunnels/tunnelplans'))\r\n| where (type !~ ('private.easm/workspaces'))\r\n| where (type !~ ('microsoft.edgeorder/virtual_orderitems'))\r\n| where (type !~ ('microsoft.workloads/epicvirtualinstances'))\r\n| where (type !~ ('microsoft.fairfieldgardens/provisioningresources/provisioningpolicies'))\r\n| where (type !~ ('microsoft.fairfieldgardens/provisioningresources'))\r\n| where (type !~ ('microsoft.healthmodel/healthmodels'))\r\n| where (type !~ ('microsoft.hybridcompute/arcserverwithwac'))\r\n| where (type !~ ('microsoft.hybridcompute/machinessovereign'))\r\n| where (type !~ ('microsoft.hybridcompute/machinespaygo'))\r\n| where (type !~ ('microsoft.hybridcompute/machinessoftwareassurance'))\r\n| where (type !~ ('microsoft.network/virtualhubs')) or ((kind =~ ('routeserver')))\r\n| where (type !~ ('microsoft.network/networkvirtualappliances'))\r\n| where (type !~ ('microsoft.devhub/iacprofiles'))\r\n| where (type !~ ('microsoft.modsimworkbench/workbenches/chambers'))\r\n| where (type !~ ('microsoft.modsimworkbench/workbenches/chambers/files'))\r\n| where (type !~ ('microsoft.modsimworkbench/workbenches/chambers/filerequests'))\r\n| where (type !~ ('microsoft.modsimworkbench/workbenches/chambers/licenses'))\r\n| where (type !~ ('microsoft.modsimworkbench/workbenches/chambers/connectors'))\r\n| where (type !~ ('microsoft.modsimworkbench/workbenches/sharedstorages'))\r\n| where (type !~ ('microsoft.modsimworkbench/workbenches/chambers/storages'))\r\n| where (type !~ ('microsoft.modsimworkbench/workbenches/chambers/workloads'))\r\n| where (type !~ ('microsoft.insights/diagnosticsettings'))\r\n| where not((type =~ ('microsoft.network/serviceendpointpolicies')) and ((kind =~ ('internal'))))\r\n| where (type !~ ('microsoft.resources/resourcegraphvisualizer'))\r\n| where (type !~ ('microsoft.iotoperationsmq/mq'))\r\n| where (type !~ ('microsoft.orbital/cloudaccessrouters'))\r\n| where (type !~ ('microsoft.orbital/terminals'))\r\n| where (type !~ ('microsoft.orbital/sdwancontrollers'))\r\n| where (type !~ ('microsoft.orbital/geocatalogs'))\r\n| where (type !~ ('microsoft.recommendationsservice/accounts/modeling'))\r\n| where (type !~ ('microsoft.recommendationsservice/accounts/serviceendpoints'))\r\n| where (type !~ ('microsoft.recoveryservicesbvtd/vaults'))\r\n| where (type !~ ('microsoft.recoveryservicesbvtd2/vaults'))\r\n| where (type !~ ('microsoft.recoveryservicesintd/vaults'))\r\n| where (type !~ ('microsoft.recoveryservicesintd2/vaults'))\r\n| where (type !~ ('microsoft.resources/deletedresources'))\r\n| where (type !~ ('microsoft.deploymentmanager/rollouts'))\r\n| where (type !~ ('microsoft.features/featureprovidernamespaces/featureconfigurations'))\r\n| where (type !~ ('microsoft.saashub/cloudservices/hidden'))\r\n| where (type !~ ('microsoft.providerhub/providerregistrations'))\r\n| where (type !~ ('microsoft.providerhub/providerregistrations/customrollouts'))\r\n| where (type !~ ('microsoft.providerhub/providerregistrations/defaultrollouts'))\r\n| where (type !~ ('microsoft.edge/configurations'))\r\n| where not((type =~ ('microsoft.synapse/workspaces/sqlpools')) and ((kind =~ ('v3'))))\r\n| where (type !~ ('microsoft.mission/approvals'))\r\n| where (type !~ ('microsoft.mission/catalogs'))\r\n| where (type !~ ('microsoft.mission/communities'))\r\n| where (type !~ ('microsoft.mission/communities/communityendpoints'))\r\n| where (type !~ ('microsoft.mission/enclaveconnections'))\r\n| where (type !~ ('microsoft.mission/virtualenclaves/enclaveendpoints'))\r\n| where (type !~ ('microsoft.mission/communities/transithubs'))\r\n| where (type !~ ('microsoft.mission/virtualenclaves'))\r\n| where (type !~ ('microsoft.mission/virtualenclaves/workloads'))\r\n| where (type !~ ('microsoft.workloads/insights'))\r\n| where (type !~ ('microsoft.hanaonazure/sapmonitors'))\r\n| where (type !~ ('microsoft.cloudhealth/healthmodels'))\r\n| where (type !~ ('microsoft.connectedcache/enterprisemcccustomers/enterprisemcccachenodes'))\r\n| where not((type =~ ('microsoft.sql/servers/databases')) and ((kind in~ ('system','v2.0,system','v12.0,system','v12.0,system,serverless','v12.0,user,datawarehouse,gen2,analytics'))))\r\n| where not((type =~ ('microsoft.sql/servers')) and ((kind =~ ('v12.0,analytics'))))\r\n| where (type in~ ('Microsoft.HybridCompute/machinesEsu','Microsoft.HybridCompute/machines'))\r\n| project name,esuStatus,esuStatusIcon,operatingSystem,resourceGroup,subscriptionDisplayName,status,type,id,kind,location,subscriptionId,tags\r\n| sort by (tolower(tostring(name))) asc",
+ "size": 0,
+ "title": "Eligible resources",
+ "noDataMessage": "There are no eligible resources.",
+ "showExportToExcel": true,
+ "queryType": 1,
+ "resourceType": "microsoft.resourcegraph/resources",
+ "crossComponentResources": [
+ "{Subscription}"
+ ],
+ "gridSettings": {
+ "formatters": [
+ {
+ "columnMatch": "esuStatusIcon",
+ "formatter": 18,
+ "formatOptions": {
+ "thresholdsOptions": "icons",
+ "thresholdsGrid": [
+ {
+ "operator": "==",
+ "thresholdValue": "7",
+ "representation": "4",
+ "text": ""
+ },
+ {
+ "operator": "==",
+ "thresholdValue": "9",
+ "representation": "warning",
+ "text": ""
+ },
+ {
+ "operator": "==",
+ "thresholdValue": "8",
+ "representation": "success",
+ "text": ""
+ },
+ {
+ "operator": "==",
+ "thresholdValue": "91",
+ "representation": "unknown",
+ "text": "{0}{1}"
+ },
+ {
+ "sourceColumn": "esuStatus",
+ "operator": "Default",
+ "thresholdValue": null,
+ "representation": "unknown",
+ "text": ""
+ }
+ ]
+ }
+ }
+ ]
+ }
+ },
+ "conditionalVisibility": {
+ "parameterName": "eligibleResources",
+ "comparison": "isEqualTo",
+ "value": "Yes"
+ },
+ "name": "arcResources"
+ }
+ ]
+ },
+ "conditionalVisibility": {
+ "parameterName": "eligibleResources",
+ "comparison": "isEqualTo",
+ "value": "Yes"
+ },
+ "name": "group-eligibleResources"
+ },
+ {
+ "type": 12,
+ "content": {
+ "version": "NotebookGroup/1.0",
+ "groupType": "editable",
+ "title": "Eligible licenses",
+ "items": [
+ {
+ "type": 1,
+ "content": {
+ "json": "Keep in mind, subscription read permissions are required to give accurate core count and usage information for your ESU licenses. Physical core based licenses are subject to different licensing guidelines and are excluded from this view.[Learn more.](https://learn.microsoft.com/azure/azure-arc/servers/license-extended-security-updates)",
+ "style": "info"
+ },
+ "name": "txtLearnMoreLicense"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "// Run query to see results.\r\nresources\r\n| where type =~ \"microsoft.hybridcompute/licenses\"\r\n| extend sku = properties.licenseDetails.edition\r\n| extend totalCores = properties.licenseDetails.processors\r\n| extend coreType = case(\r\n properties.licenseDetails.type =~ 'vCore','Virtual core',\r\n properties.licenseDetails.type =~ 'pCore','Physical core',\r\n 'Unknown'\r\n)\r\n| extend statusIcon = case(\r\n properties.licenseDetails.state =~ 'Activated', '8',\r\n properties.licenseDetails.state =~ 'Deactivated', '7',\r\n '91'\r\n)\r\n| extend status = case(\r\n properties.licenseDetails.state =~ 'Activated', 'Activated',\r\n properties.licenseDetails.state =~ 'Deactivated','Deactivated',\r\n 'Unknown'\r\n)\r\n| extend licenseId = tolower(tostring(id)) // Depending on what is stored in license profile, might have to get the immutableId instead\r\n| join kind=leftouter(\r\n resources\r\n | where type =~ \"microsoft.hybridcompute/machines/licenseProfiles\"\r\n | extend machineId = tolower(tostring(trim_end(@\"\\/\\w+\\/(\\w|\\.)+\", id)))\r\n | extend licenseId = tolower(tostring(properties.esuProfile.assignedLicense))\r\n | summarize resources = count() by licenseId\r\n) on licenseId // Get count of license profile per license, a license profile is created for each machine that is assigned a license\r\n| extend resources = iff(isnull(resources), 0, resources)\r\n| project id, name, type, location, subscriptionId, resourceGroup, kind, tags, extendedLocation, sku, totalCores, coreType, status, statusIcon, resources\r\n| extend subscriptionDisplayName=case(subscriptionId =~ 'e75c95f3-27b4-410f-a40e-2b9153a807dd','AEther Dev',subscriptionId =~ '823ca539-d44d-43ee-8dc8-023fd4f27396','AIOps_FailureSimulation_DevTest',subscriptionId =~ 'b2a328a7-ffff-4c09-b643-a4758cf170bc','AISC-DEV-02',subscriptionId =~ 'eef8b6d5-94da-4b36-9327-a662f2674efb','AISC-EngSys-01',subscriptionId =~ 'e0fd569c-e34a-4249-8c24-e8d723c7f054','AML - Responsible AI R&D',subscriptionId =~ 'f1d79e73-f8e3-4b10-bfdb-4207ca0723ed','AML Infra - Engineering System',subscriptionId =~ 'dad45786-32e5-4ef3-b90e-8e0838fbadb6','AnE.ExP.NonProduction',subscriptionId =~ '017ad81c-b730-4564-9109-9b763243a9a6','Anomaly Real Time-DevTest',subscriptionId =~ 'e686ef8c-d35d-4e9b-92f8-caaaa7948c0a','Applied Sciences Group Dev',subscriptionId =~ '6e967edb-425b-4a33-ae98-f1d2c509dda3','Arc enabled Infrastructure - Demo',subscriptionId =~ '710c6ed8-d8d9-4c51-b100-dc4d9e10dd18','ARC-ESU-TESTING-03',subscriptionId =~ '2145a411-d149-4010-84d4-40fe8a55db44','ARM Test Environment',subscriptionId =~ 'e2a8a7b3-cb7a-4930-9c79-2b0eb7bf843c','ASZ_Lab_Hardware_Dev_1',subscriptionId =~ '4c33a6bb-d566-4d0b-8951-00b55a91fba8','AzPIESecurity-DEV-Apple',subscriptionId =~ 'b65b516b-415b-4c68-a254-bfa7411275f8','Azure CloudES CDP ER - Test',subscriptionId =~ '6785ea1f-ac40-4244-a9ce-94b12fd832ca','Azure Migrate Demo Subscription',subscriptionId =~ '8c3c936a-c09b-4de3-830b-3f5f244d72e9','Azure Migrate Program Management Team',subscriptionId =~ '432a7068-99ae-4975-ad38-d96b71172cdf','Azure Profiler - Testing',subscriptionId =~ 'caffe3c0-acbd-4d01-af76-a45f421bfb64','Azure_Base_LivesiteArmory_test',subscriptionId =~ 'a1920ebd-59b7-4f19-af9f-5e80599e88e4','Babel',subscriptionId =~ 'b43a6159-1bea-4fa2-9407-e875fdc0ff55','BAP IA EU Schrems (P)',subscriptionId =~ 'ae71ef11-a03f-4b4f-a0e6-ef144727c711','Bing MM Measurement',subscriptionId =~ '8ef80208-601f-4c83-802e-751d211745f9','CloudAnalytics_Prod1',subscriptionId =~ 'f7b4a5ce-d3bd-4a03-84fe-8bcad772c8c1','Cog Services Computer Vision',subscriptionId =~ '38dbd059-bd26-4172-af17-bcc5a00744de','Core-ES-STREAM-DeXDI',subscriptionId =~ '87e8a61c-4832-4cfe-8b72-c12554f2309a','Cosmos_C&E_Azure_Azure Resource Manager_100424',subscriptionId =~ '8c4b5b03-3b24-4ed0-91f5-a703cd91b412','Cosmos_C&E_Azure_AzureEngineeringSystems_100200',subscriptionId =~ 'b988efc7-1bc8-4a73-b4a2-5ad864580250','Cosmos_C&E_DPG_Big Data_100036',subscriptionId =~ '6121bf73-2dc9-47ac-8b6a-c6ae4b88ef39','Cost Management PM',subscriptionId =~ '44074499-ad9f-45b9-9b0b-f594f8736a45','CSX-WSD-CFE-TNT-QPP',subscriptionId =~ '3cd01953-be46-4f9b-a4e0-26f19f428765','CSX-WSD-CFE-TNT-TOOLKITHUB',subscriptionId =~ '60214a3c-65a2-46f8-8b32-f959f2454106','Data Pillar Security Tooling',subscriptionId =~ 'f7c445af-a4de-4264-9e87-3196d6bc384d','Efficiency Pack Services (MSIT)',subscriptionId =~ '86f010b8-6473-4cb9-90c1-671c74faa4ee','emilyzhu dev subscription',subscriptionId =~ 'f3326bfd-5406-4136-a835-f64ccbfd9050','FTK @ MS',subscriptionId =~ 'd2c9544f-4329-4642-b73d-020e7fef844f','HPCScrub1',subscriptionId =~ 'bac420ed-c6fc-4a05-8ac1-8c0c52da1d6e','IDEAs MS Reporting',subscriptionId =~ '3cd95ff9-ac62-4b5c-8240-0cd046687ea0','Internal App Insights Resources for Perflens',subscriptionId =~ 'a386d5ea-ea90-441a-8263-d816368c84a1','IOT_PLATFORM_UPX_TEST',subscriptionId =~ '6a0ab98c-24d4-4131-8cd7-0a78bfce58f5','ITSM Integration - Production - New',subscriptionId =~ '13723929-6644-4060-a50a-cc38ebc5e8b1','LinuxMdsd Test',subscriptionId =~ '98b02a69-28a5-4ee7-a622-cd69c7a59c4e','Marvel Intelligence Model Training Subscription',subscriptionId =~ '1278a874-89fc-418c-b6b9-ac763b000415','Microsoft Azure Internal Consumption (nbrady)',subscriptionId =~ '29de2cfc-f00a-43bb-bdc8-3108795bd282','MSFT-Modern Device-Modern Mgmt-Imaging00',subscriptionId =~ '54b875cc-a81a-4914-8bfd-1a36bc7ddf4d','MSFT-WindowsVirtualDesktop-01',subscriptionId =~ '4dc2cd39-7a89-43d8-bebe-8bb501359891','Observability_AzMon_Grafana_Dev',subscriptionId =~ 'a471d615-ff98-4e80-b375-a19543d4691e','ODC-OneBox-Resources',subscriptionId =~ '1163fbbe-27e7-4b0f-8466-195fe5417043','Python_AI_Tools_PM_Team_Sub (jbinder)',subscriptionId =~ '3905431d-c062-4c17-8fd9-c51f89f334c4','Pytorch Build',subscriptionId =~ '3f577935-3138-4d07-86b3-75651b696483','Responsible & OpenAi Research',subscriptionId =~ '0f301386-8979-4981-acca-973d553078e7','Scope Team Test Subscription',subscriptionId =~ '1b0a5c20-7373-41a2-8fec-7364cceb7bbf','Services Hub Demo Open',subscriptionId =~ 'e72e5254-f265-4e95-9bd2-9ee8e7329051','Speech Services - DEV - SDK (carbon)',subscriptionId =~ 'a1c3dc6b-8630-4bb7-a29e-4ed4407c329b','Speech Services - EXP2',subscriptionId =~ '736af2bf-9fcb-4145-a19b-5b30b2b8949d','Trey International UK',subscriptionId =~ '51f73f67-1f29-4120-863e-dd315f743fc1','Trey Partner Lab 2',subscriptionId =~ '9ec51cfd-5ca7-4d76-8101-dd0a4abc5674','Trey Research Corporate',subscriptionId =~ '73c0021f-a37d-433f-8baa-7450cb54eea6','Trey Research Finance',subscriptionId =~ 'ed570627-0265-4620-bb42-bae06bcfa914','Trey Research IT',subscriptionId =~ '64e355d7-997c-491d-b0c1-8414dccfcf42','Trey Research R&D Playground',subscriptionId =~ '586f1d47-9dd9-43d5-b196-6e28f8405ff8','Trey Research R&D Production',subscriptionId =~ '9ec1d932-0f3f-486c-acc6-e7d78b358f9b','TScience',subscriptionId =~ '79f57c16-00fe-48da-87d4-5192e86cd047','TScienceGPU',subscriptionId =~ 'bac044cf-49e1-4843-8dda-1ce9662606c8','UI Fabric',subscriptionId =~ '6760347d-9ffe-41a9-ba11-c139dcea5ce6','xt-teams-migration-dev',subscriptionId =~ '45f9252d-e27e-4ed8-ab4e-dc5054de13fa','Contoso IT - Retail - Prod',subscriptionId)\r\n| where (type !~ ('dell.storage/filesystems'))\r\n| where (type !~ ('arizeai.observabilityeval/organizations'))\r\n| where (type !~ ('lambdatest.hyperexecute/organizations'))\r\n| where (type !~ ('pinecone.vectordb/organizations'))\r\n| where (type !~ ('microsoft.weightsandbiases/instances'))\r\n| where (type !~ ('purestorage.block/storagepools/avsstoragecontainers'))\r\n| where (type !~ ('purestorage.block/reservations'))\r\n| where (type !~ ('purestorage.block/storagepools'))\r\n| where (type !~ ('solarwinds.observability/organizations'))\r\n| where (type !~ ('splitio.experimentation/experimentationworkspaces'))\r\n| where (type !~ ('microsoft.agfoodplatform/farmbeats'))\r\n| where (type !~ ('microsoft.appsecurity/policies'))\r\n| where (type !~ ('microsoft.arc/all'))\r\n| where (type !~ ('microsoft.arc/allfairfax'))\r\n| where (type !~ ('microsoft.cdn/profiles/customdomains'))\r\n| where (type !~ ('microsoft.cdn/profiles/afdendpoints'))\r\n| where (type !~ ('microsoft.cdn/profiles/origingroups/origins'))\r\n| where (type !~ ('microsoft.cdn/profiles/origingroups'))\r\n| where (type !~ ('microsoft.cdn/profiles/afdendpoints/routes'))\r\n| where (type !~ ('microsoft.cdn/profiles/rulesets/rules'))\r\n| where (type !~ ('microsoft.cdn/profiles/rulesets'))\r\n| where (type !~ ('microsoft.cdn/profiles/secrets'))\r\n| where (type !~ ('microsoft.cdn/profiles/securitypolicies'))\r\n| where (type !~ ('microsoft.chaos/privateaccesses'))\r\n| where (type !~ ('microsoft.sovereign/transparencylogs'))\r\n| where (type !~ ('microsoft.sovereign/landingzoneconfigurations'))\r\n| where (type !~ ('microsoft.hardwaresecuritymodules/cloudhsmclusters'))\r\n| where (type !~ ('microsoft.compute/computefleetinstances'))\r\n| where (type !~ ('microsoft.compute/standbypoolinstance'))\r\n| where (type !~ ('microsoft.compute/virtualmachineflexinstances'))\r\n| where (type !~ ('microsoft.kubernetesconfiguration/extensions'))\r\n| where (type !~ ('microsoft.containerservice/managedclusters/microsoft.kubernetesconfiguration/extensions'))\r\n| where (type !~ ('microsoft.kubernetes/connectedclusters/microsoft.kubernetesconfiguration/namespaces'))\r\n| where (type !~ ('microsoft.containerservice/managedclusters/microsoft.kubernetesconfiguration/namespaces'))\r\n| where (type !~ ('microsoft.kubernetes/connectedclusters/microsoft.kubernetesconfiguration/fluxconfigurations'))\r\n| where (type !~ ('microsoft.containerservice/managedclusters/microsoft.kubernetesconfiguration/fluxconfigurations'))\r\n| where (type !~ ('microsoft.portalservices/extensions/deployments'))\r\n| where (type !~ ('microsoft.portalservices/extensions'))\r\n| where (type !~ ('microsoft.portalservices/extensions/slots'))\r\n| where (type !~ ('microsoft.portalservices/extensions/versions'))\r\n| where (type !~ ('microsoft.datacollaboration/workspaces'))\r\n| where (type !~ ('microsoft.deviceregistry/devices'))\r\n| where (type !~ ('microsoft.deviceupdate/updateaccounts/activedeployments'))\r\n| where (type !~ ('microsoft.deviceupdate/updateaccounts/agents'))\r\n| where (type !~ ('microsoft.deviceupdate/updateaccounts/deployments'))\r\n| where (type !~ ('microsoft.deviceupdate/updateaccounts/deviceclasses'))\r\n| where (type !~ ('microsoft.deviceupdate/updateaccounts/updates'))\r\n| where (type !~ ('microsoft.deviceupdate/updateaccounts'))\r\n| where (type !~ ('private.devtunnels/tunnelplans'))\r\n| where (type !~ ('private.easm/workspaces'))\r\n| where (type !~ ('microsoft.edgeorder/virtual_orderitems'))\r\n| where (type !~ ('microsoft.workloads/epicvirtualinstances'))\r\n| where (type !~ ('microsoft.fairfieldgardens/provisioningresources/provisioningpolicies'))\r\n| where (type !~ ('microsoft.fairfieldgardens/provisioningresources'))\r\n| where (type !~ ('microsoft.healthmodel/healthmodels'))\r\n| where (type !~ ('microsoft.hybridcompute/arcserverwithwac'))\r\n| where (type !~ ('microsoft.hybridcompute/machinessovereign'))\r\n| where (type !~ ('microsoft.hybridcompute/machinesesu'))\r\n| where (type !~ ('microsoft.hybridcompute/machinespaygo'))\r\n| where (type !~ ('microsoft.hybridcompute/machinessoftwareassurance'))\r\n| where (type !~ ('microsoft.network/virtualhubs')) or ((kind =~ ('routeserver')))\r\n| where (type !~ ('microsoft.network/networkvirtualappliances'))\r\n| where (type !~ ('microsoft.devhub/iacprofiles'))\r\n| where (type !~ ('microsoft.modsimworkbench/workbenches/chambers'))\r\n| where (type !~ ('microsoft.modsimworkbench/workbenches/chambers/files'))\r\n| where (type !~ ('microsoft.modsimworkbench/workbenches/chambers/filerequests'))\r\n| where (type !~ ('microsoft.modsimworkbench/workbenches/chambers/licenses'))\r\n| where (type !~ ('microsoft.modsimworkbench/workbenches/chambers/connectors'))\r\n| where (type !~ ('microsoft.modsimworkbench/workbenches/sharedstorages'))\r\n| where (type !~ ('microsoft.modsimworkbench/workbenches/chambers/storages'))\r\n| where (type !~ ('microsoft.modsimworkbench/workbenches/chambers/workloads'))\r\n| where (type !~ ('microsoft.insights/diagnosticsettings'))\r\n| where not((type =~ ('microsoft.network/serviceendpointpolicies')) and ((kind =~ ('internal'))))\r\n| where (type !~ ('microsoft.resources/resourcegraphvisualizer'))\r\n| where (type !~ ('microsoft.iotoperationsmq/mq'))\r\n| where (type !~ ('microsoft.orbital/cloudaccessrouters'))\r\n| where (type !~ ('microsoft.orbital/terminals'))\r\n| where (type !~ ('microsoft.orbital/sdwancontrollers'))\r\n| where (type !~ ('microsoft.orbital/geocatalogs'))\r\n| where (type !~ ('microsoft.recommendationsservice/accounts/modeling'))\r\n| where (type !~ ('microsoft.recommendationsservice/accounts/serviceendpoints'))\r\n| where (type !~ ('microsoft.recoveryservicesbvtd/vaults'))\r\n| where (type !~ ('microsoft.recoveryservicesbvtd2/vaults'))\r\n| where (type !~ ('microsoft.recoveryservicesintd/vaults'))\r\n| where (type !~ ('microsoft.recoveryservicesintd2/vaults'))\r\n| where (type !~ ('microsoft.resources/deletedresources'))\r\n| where (type !~ ('microsoft.deploymentmanager/rollouts'))\r\n| where (type !~ ('microsoft.features/featureprovidernamespaces/featureconfigurations'))\r\n| where (type !~ ('microsoft.saashub/cloudservices/hidden'))\r\n| where (type !~ ('microsoft.providerhub/providerregistrations'))\r\n| where (type !~ ('microsoft.providerhub/providerregistrations/customrollouts'))\r\n| where (type !~ ('microsoft.providerhub/providerregistrations/defaultrollouts'))\r\n| where (type !~ ('microsoft.edge/configurations'))\r\n| where not((type =~ ('microsoft.synapse/workspaces/sqlpools')) and ((kind =~ ('v3'))))\r\n| where (type !~ ('microsoft.mission/approvals'))\r\n| where (type !~ ('microsoft.mission/catalogs'))\r\n| where (type !~ ('microsoft.mission/communities'))\r\n| where (type !~ ('microsoft.mission/communities/communityendpoints'))\r\n| where (type !~ ('microsoft.mission/enclaveconnections'))\r\n| where (type !~ ('microsoft.mission/virtualenclaves/enclaveendpoints'))\r\n| where (type !~ ('microsoft.mission/communities/transithubs'))\r\n| where (type !~ ('microsoft.mission/virtualenclaves'))\r\n| where (type !~ ('microsoft.mission/virtualenclaves/workloads'))\r\n| where (type !~ ('microsoft.workloads/insights'))\r\n| where (type !~ ('microsoft.hanaonazure/sapmonitors'))\r\n| where (type !~ ('microsoft.cloudhealth/healthmodels'))\r\n| where (type !~ ('microsoft.connectedcache/enterprisemcccustomers/enterprisemcccachenodes'))\r\n| where not((type =~ ('microsoft.sql/servers/databases')) and ((kind in~ ('system','v2.0,system','v12.0,system','v12.0,system,serverless','v12.0,user,datawarehouse,gen2,analytics'))))\r\n| where not((type =~ ('microsoft.sql/servers')) and ((kind =~ ('v12.0,analytics'))))\r\n| project name,sku,totalCores,coreType,status,statusIcon,resources,id,resourceGroup,subscriptionDisplayName,type,kind,location,subscriptionId,tags\r\n| sort by (tolower(tostring(name))) asc",
+ "size": 0,
+ "title": "Eligible licenses",
+ "noDataMessage": "There are no eligible licenses.",
+ "queryType": 1,
+ "resourceType": "microsoft.resourcegraph/resources",
+ "crossComponentResources": [
+ "{Subscription}"
+ ]
+ },
+ "conditionalVisibility": {
+ "parameterName": "eligibleLicenses",
+ "comparison": "isEqualTo",
+ "value": "Yes"
+ },
+ "name": "arclicenses"
+ }
+ ]
+ },
+ "conditionalVisibility": {
+ "parameterName": "eligibleLicenses",
+ "comparison": "isEqualTo",
+ "value": "Yes"
+ },
+ "name": "group-eligibleLicenses"
+ }
+ ]
+ },
+ "conditionalVisibility": {
+ "parameterName": "SelectedSubTab",
+ "comparison": "isEqualTo",
+ "value": "windowsEsu"
+ },
+ "name": "group-Esu"
+ },
+ {
+ "type": 12,
+ "content": {
+ "version": "NotebookGroup/1.0",
+ "groupType": "editable",
+ "title": "Windows Server Management enabled by Azure Arc",
+ "items": [
+ {
+ "type": 1,
+ "content": {
+ "json": "## Benefits of Windows Server Management with Azure Arc\r\n\r\nWindows Server Management enabled by Azure Arc offers customers with Windows Server licenses that have active Software Assurances or Windows Server licenses that are active subscription licenses a few benefits, including access to Azure Update Management, Azure Change Tracking and Inventory and Windwos best practices assessment. FOr the full list of benefits, visit [Windows Server Management enabled by Azure Arc.](https://learn.microsoft.com/azure/azure-arc/servers/windows-server-management-overview?tabs=portal)\r\n\r\n",
+ "style": "info"
+ },
+ "name": "text - 5"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "// Run query to see results.\r\nresources\r\n| where type =~ \"microsoft.hybridcompute/machines\" and isempty(kind)\r\n| extend status = properties.status\r\n| extend operatingSystem = properties.osSku\r\n| where properties.osType =~ 'windows'\r\n| extend licenseProfile = properties.licenseProfile\r\n| extend licenseStatus = tostring(licenseProfile.licenseStatus)\r\n| extend licenseChannel = tostring(licenseProfile.licenseChannel)\r\n| extend productSubscriptionStatus = tostring(licenseProfile.productProfile.subscriptionStatus)\r\n| extend softwareAssurance = licenseProfile.softwareAssurance\r\n| extend softwareAssuranceCustomer = licenseProfile.softwareAssurance.softwareAssuranceCustomer\r\n| extend benefitsStatus = case(\r\n softwareAssuranceCustomer == true, \"Activated\",\r\n (licenseStatus =~ \"Licensed\" and licenseChannel =~ \"PGS:TB\") or productSubscriptionStatus =~ \"Enabled\", \"Activated via Pay-as-you-go\",\r\n isnull(softwareAssurance) or isnull(softwareAssuranceCustomer) or softwareAssuranceCustomer == false, \"Not activated\",\r\n \"Not activated\")\r\n| extend benefitsStatusIcon = case(\r\n softwareAssuranceCustomer == true, \"8\",\r\n softwareAssuranceCustomer == true, \"8\",\r\n (licenseStatus =~ \"Licensed\" and licenseChannel =~ \"PGS:TB\") or productSubscriptionStatus =~ \"Enabled\", \"8\",\r\n isnull(softwareAssurance) or isnull(softwareAssuranceCustomer) or softwareAssuranceCustomer == false, \"7\",\r\n \"7\")\r\n| project name, status, benefitsStatus, benefitsStatusIcon, resourceGroup, subscriptionId, operatingSystem, id, type, location, kind, tags\r\n| where (type !~ ('dell.storage/filesystems'))\r\n| where (type !~ ('arizeai.observabilityeval/organizations'))\r\n| where (type !~ ('lambdatest.hyperexecute/organizations'))\r\n| where (type !~ ('pinecone.vectordb/organizations'))\r\n| where (type !~ ('microsoft.weightsandbiases/instances'))\r\n| where (type !~ ('purestorage.block/storagepools/avsstoragecontainers'))\r\n| where (type !~ ('purestorage.block/reservations'))\r\n| where (type !~ ('purestorage.block/storagepools'))\r\n| where (type !~ ('solarwinds.observability/organizations'))\r\n| where (type !~ ('splitio.experimentation/experimentationworkspaces'))\r\n| where (type !~ ('microsoft.agfoodplatform/farmbeats'))\r\n| where (type !~ ('microsoft.appsecurity/policies'))\r\n| where (type !~ ('microsoft.arc/all'))\r\n| where (type !~ ('microsoft.arc/allfairfax'))\r\n| where (type !~ ('microsoft.cdn/profiles/customdomains'))\r\n| where (type !~ ('microsoft.cdn/profiles/afdendpoints'))\r\n| where (type !~ ('microsoft.cdn/profiles/origingroups/origins'))\r\n| where (type !~ ('microsoft.cdn/profiles/origingroups'))\r\n| where (type !~ ('microsoft.cdn/profiles/afdendpoints/routes'))\r\n| where (type !~ ('microsoft.cdn/profiles/rulesets/rules'))\r\n| where (type !~ ('microsoft.cdn/profiles/rulesets'))\r\n| where (type !~ ('microsoft.cdn/profiles/secrets'))\r\n| where (type !~ ('microsoft.cdn/profiles/securitypolicies'))\r\n| where (type !~ ('microsoft.chaos/privateaccesses'))\r\n| where (type !~ ('microsoft.sovereign/transparencylogs'))\r\n| where (type !~ ('microsoft.sovereign/landingzoneconfigurations'))\r\n| where (type !~ ('microsoft.hardwaresecuritymodules/cloudhsmclusters'))\r\n| where (type !~ ('microsoft.compute/computefleetinstances'))\r\n| where (type !~ ('microsoft.compute/standbypoolinstance'))\r\n| where (type !~ ('microsoft.compute/virtualmachineflexinstances'))\r\n| where (type !~ ('microsoft.kubernetesconfiguration/extensions'))\r\n| where (type !~ ('microsoft.containerservice/managedclusters/microsoft.kubernetesconfiguration/extensions'))\r\n| where (type !~ ('microsoft.kubernetes/connectedclusters/microsoft.kubernetesconfiguration/namespaces'))\r\n| where (type !~ ('microsoft.containerservice/managedclusters/microsoft.kubernetesconfiguration/namespaces'))\r\n| where (type !~ ('microsoft.kubernetes/connectedclusters/microsoft.kubernetesconfiguration/fluxconfigurations'))\r\n| where (type !~ ('microsoft.containerservice/managedclusters/microsoft.kubernetesconfiguration/fluxconfigurations'))\r\n| where (type !~ ('microsoft.portalservices/extensions/deployments'))\r\n| where (type !~ ('microsoft.portalservices/extensions'))\r\n| where (type !~ ('microsoft.portalservices/extensions/slots'))\r\n| where (type !~ ('microsoft.portalservices/extensions/versions'))\r\n| where (type !~ ('microsoft.datacollaboration/workspaces'))\r\n| where (type !~ ('microsoft.deviceregistry/devices'))\r\n| where (type !~ ('microsoft.deviceupdate/updateaccounts/activedeployments'))\r\n| where (type !~ ('microsoft.deviceupdate/updateaccounts/agents'))\r\n| where (type !~ ('microsoft.deviceupdate/updateaccounts/deployments'))\r\n| where (type !~ ('microsoft.deviceupdate/updateaccounts/deviceclasses'))\r\n| where (type !~ ('microsoft.deviceupdate/updateaccounts/updates'))\r\n| where (type !~ ('microsoft.deviceupdate/updateaccounts'))\r\n| where (type !~ ('private.devtunnels/tunnelplans'))\r\n| where (type !~ ('private.easm/workspaces'))\r\n| where (type !~ ('microsoft.edgeorder/virtual_orderitems'))\r\n| where (type !~ ('microsoft.workloads/epicvirtualinstances'))\r\n| where (type !~ ('microsoft.fairfieldgardens/provisioningresources/provisioningpolicies'))\r\n| where (type !~ ('microsoft.fairfieldgardens/provisioningresources'))\r\n| where (type !~ ('microsoft.healthmodel/healthmodels'))\r\n| where (type !~ ('microsoft.hybridcompute/arcserverwithwac'))\r\n| where (type !~ ('microsoft.hybridcompute/machinessovereign'))\r\n| where (type !~ ('microsoft.hybridcompute/machinesesu'))\r\n| where (type !~ ('microsoft.hybridcompute/machinespaygo'))\r\n| where (type !~ ('microsoft.network/virtualhubs')) or ((kind =~ ('routeserver')))\r\n| where (type !~ ('microsoft.network/networkvirtualappliances'))\r\n| where (type !~ ('microsoft.devhub/iacprofiles'))\r\n| where (type !~ ('microsoft.modsimworkbench/workbenches/chambers'))\r\n| where (type !~ ('microsoft.modsimworkbench/workbenches/chambers/files'))\r\n| where (type !~ ('microsoft.modsimworkbench/workbenches/chambers/filerequests'))\r\n| where (type !~ ('microsoft.modsimworkbench/workbenches/chambers/licenses'))\r\n| where (type !~ ('microsoft.modsimworkbench/workbenches/chambers/connectors'))\r\n| where (type !~ ('microsoft.modsimworkbench/workbenches/sharedstorages'))\r\n| where (type !~ ('microsoft.modsimworkbench/workbenches/chambers/storages'))\r\n| where (type !~ ('microsoft.modsimworkbench/workbenches/chambers/workloads'))\r\n| where (type !~ ('microsoft.insights/diagnosticsettings'))\r\n| where not((type =~ ('microsoft.network/serviceendpointpolicies')) and ((kind =~ ('internal'))))\r\n| where (type !~ ('microsoft.resources/resourcegraphvisualizer'))\r\n| where (type !~ ('microsoft.iotoperationsmq/mq'))\r\n| where (type !~ ('microsoft.orbital/cloudaccessrouters'))\r\n| where (type !~ ('microsoft.orbital/terminals'))\r\n| where (type !~ ('microsoft.orbital/sdwancontrollers'))\r\n| where (type !~ ('microsoft.orbital/geocatalogs'))\r\n| where (type !~ ('microsoft.recommendationsservice/accounts/modeling'))\r\n| where (type !~ ('microsoft.recommendationsservice/accounts/serviceendpoints'))\r\n| where (type !~ ('microsoft.recoveryservicesbvtd/vaults'))\r\n| where (type !~ ('microsoft.recoveryservicesbvtd2/vaults'))\r\n| where (type !~ ('microsoft.recoveryservicesintd/vaults'))\r\n| where (type !~ ('microsoft.recoveryservicesintd2/vaults'))\r\n| where (type !~ ('microsoft.resources/deletedresources'))\r\n| where (type !~ ('microsoft.deploymentmanager/rollouts'))\r\n| where (type !~ ('microsoft.features/featureprovidernamespaces/featureconfigurations'))\r\n| where (type !~ ('microsoft.saashub/cloudservices/hidden'))\r\n| where (type !~ ('microsoft.providerhub/providerregistrations'))\r\n| where (type !~ ('microsoft.providerhub/providerregistrations/customrollouts'))\r\n| where (type !~ ('microsoft.providerhub/providerregistrations/defaultrollouts'))\r\n| where (type !~ ('microsoft.edge/configurations'))\r\n| where not((type =~ ('microsoft.synapse/workspaces/sqlpools')) and ((kind =~ ('v3'))))\r\n| where (type !~ ('microsoft.mission/approvals'))\r\n| where (type !~ ('microsoft.mission/catalogs'))\r\n| where (type !~ ('microsoft.mission/communities'))\r\n| where (type !~ ('microsoft.mission/communities/communityendpoints'))\r\n| where (type !~ ('microsoft.mission/enclaveconnections'))\r\n| where (type !~ ('microsoft.mission/virtualenclaves/enclaveendpoints'))\r\n| where (type !~ ('microsoft.mission/communities/transithubs'))\r\n| where (type !~ ('microsoft.mission/virtualenclaves'))\r\n| where (type !~ ('microsoft.mission/virtualenclaves/workloads'))\r\n| where (type !~ ('microsoft.workloads/insights'))\r\n| where (type !~ ('microsoft.hanaonazure/sapmonitors'))\r\n| where (type !~ ('microsoft.cloudhealth/healthmodels'))\r\n| where (type !~ ('microsoft.connectedcache/enterprisemcccustomers/enterprisemcccachenodes'))\r\n| where not((type =~ ('microsoft.sql/servers/databases')) and ((kind in~ ('system','v2.0,system','v12.0,system','v12.0,system,serverless','v12.0,user,datawarehouse,gen2,analytics'))))\r\n| where not((type =~ ('microsoft.sql/servers')) and ((kind =~ ('v12.0,analytics'))))\r\n| where (type in~ ('Microsoft.HybridCompute/machinesSoftwareAssurance','Microsoft.HybridCompute/machines'))\r\n| project name,benefitsStatus,benefitsStatusIcon,status,resourceGroup,operatingSystem,id,type,kind,location,subscriptionId\r\n| summarize count() by benefitsStatus",
+ "size": 0,
+ "title": "Coverage Summary",
+ "showRefreshButton": true,
+ "queryType": 1,
+ "resourceType": "microsoft.resourcegraph/resources",
+ "crossComponentResources": [
+ "{Subscription}"
+ ],
+ "visualization": "piechart",
+ "chartSettings": {
+ "yAxis": [
+ "count_"
+ ],
+ "showLegend": true,
+ "seriesLabelSettings": [
+ {
+ "seriesName": "Not activated",
+ "color": "red"
+ },
+ {
+ "seriesName": "Activated",
+ "color": "green"
+ },
+ {
+ "seriesName": "Activated via Pay-as-you-go",
+ "color": "greenDarkDark"
+ }
+ ]
+ }
+ },
+ "name": "coverageSummary"
+ },
+ {
+ "type": 9,
+ "content": {
+ "version": "KqlParameterItem/1.0",
+ "parameters": [
+ {
+ "id": "16791a28-f78e-4b26-a2e9-a9fbbda915df",
+ "version": "KqlParameterItem/1.0",
+ "name": "eligibleResources",
+ "label": "View eligible resources?",
+ "type": 2,
+ "isRequired": true,
+ "typeSettings": {
+ "additionalResourceOptions": [],
+ "showDefault": false
+ },
+ "jsonData": "[\r\n {\"value\":\"Yes\"},\r\n {\"value\":\"No\", \"selected\":true}\r\n]\r\n\r\n",
+ "timeContext": {
+ "durationMs": 86400000
+ },
+ "value": "Yes"
+ }
+ ],
+ "style": "pills",
+ "queryType": 0,
+ "resourceType": "microsoft.operationalinsights/workspaces"
+ },
+ "name": "parameters - 5"
+ },
+ {
+ "type": 12,
+ "content": {
+ "version": "NotebookGroup/1.0",
+ "groupType": "editable",
+ "title": "Eligible Resources",
+ "items": [
+ {
+ "type": 1,
+ "content": {
+ "json": "To enable Windows Server Management with Azure Arc, visit the [Arc service blade.](https://ms.portal.azure.com/#view/Microsoft_Azure_ArcCenterUX/ArcCenterMenuBlade/~/softwareAssurance)\r\n\r\n",
+ "style": "info"
+ },
+ "name": "txtEligibleAHBResources"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "// Run query to see results.\r\nresources\r\n| where type =~ \"microsoft.hybridcompute/machines\" and isempty(kind)\r\n| extend status = properties.status\r\n| extend operatingSystem = properties.osSku\r\n| where properties.osType =~ 'windows'\r\n| extend licenseProfile = properties.licenseProfile\r\n| extend licenseStatus = tostring(licenseProfile.licenseStatus)\r\n| extend licenseChannel = tostring(licenseProfile.licenseChannel)\r\n| extend productSubscriptionStatus = tostring(licenseProfile.productProfile.subscriptionStatus)\r\n| extend softwareAssurance = licenseProfile.softwareAssurance\r\n| extend softwareAssuranceCustomer = licenseProfile.softwareAssurance.softwareAssuranceCustomer\r\n| extend benefitsStatus = case(\r\n softwareAssuranceCustomer == true, \"Activated\",\r\n (licenseStatus =~ \"Licensed\" and licenseChannel =~ \"PGS:TB\") or productSubscriptionStatus =~ \"Enabled\", \"Activated via Pay-as-you-go\",\r\n isnull(softwareAssurance) or isnull(softwareAssuranceCustomer) or softwareAssuranceCustomer == false, \"Not activated\",\r\n \"Not activated\")\r\n| extend benefitsStatusIcon = case(\r\n softwareAssuranceCustomer == true, \"8\",\r\n softwareAssuranceCustomer == true, \"8\",\r\n (licenseStatus =~ \"Licensed\" and licenseChannel =~ \"PGS:TB\") or productSubscriptionStatus =~ \"Enabled\", \"8\",\r\n isnull(softwareAssurance) or isnull(softwareAssuranceCustomer) or softwareAssuranceCustomer == false, \"7\",\r\n \"7\")\r\n| project name, status, benefitsStatus, benefitsStatusIcon, resourceGroup, subscriptionId, operatingSystem, id, type, location, kind, tags\r\n| where (type !~ ('dell.storage/filesystems'))\r\n| where (type !~ ('arizeai.observabilityeval/organizations'))\r\n| where (type !~ ('lambdatest.hyperexecute/organizations'))\r\n| where (type !~ ('pinecone.vectordb/organizations'))\r\n| where (type !~ ('microsoft.weightsandbiases/instances'))\r\n| where (type !~ ('purestorage.block/storagepools/avsstoragecontainers'))\r\n| where (type !~ ('purestorage.block/reservations'))\r\n| where (type !~ ('purestorage.block/storagepools'))\r\n| where (type !~ ('solarwinds.observability/organizations'))\r\n| where (type !~ ('splitio.experimentation/experimentationworkspaces'))\r\n| where (type !~ ('microsoft.agfoodplatform/farmbeats'))\r\n| where (type !~ ('microsoft.appsecurity/policies'))\r\n| where (type !~ ('microsoft.arc/all'))\r\n| where (type !~ ('microsoft.arc/allfairfax'))\r\n| where (type !~ ('microsoft.cdn/profiles/customdomains'))\r\n| where (type !~ ('microsoft.cdn/profiles/afdendpoints'))\r\n| where (type !~ ('microsoft.cdn/profiles/origingroups/origins'))\r\n| where (type !~ ('microsoft.cdn/profiles/origingroups'))\r\n| where (type !~ ('microsoft.cdn/profiles/afdendpoints/routes'))\r\n| where (type !~ ('microsoft.cdn/profiles/rulesets/rules'))\r\n| where (type !~ ('microsoft.cdn/profiles/rulesets'))\r\n| where (type !~ ('microsoft.cdn/profiles/secrets'))\r\n| where (type !~ ('microsoft.cdn/profiles/securitypolicies'))\r\n| where (type !~ ('microsoft.chaos/privateaccesses'))\r\n| where (type !~ ('microsoft.sovereign/transparencylogs'))\r\n| where (type !~ ('microsoft.sovereign/landingzoneconfigurations'))\r\n| where (type !~ ('microsoft.hardwaresecuritymodules/cloudhsmclusters'))\r\n| where (type !~ ('microsoft.compute/computefleetinstances'))\r\n| where (type !~ ('microsoft.compute/standbypoolinstance'))\r\n| where (type !~ ('microsoft.compute/virtualmachineflexinstances'))\r\n| where (type !~ ('microsoft.kubernetesconfiguration/extensions'))\r\n| where (type !~ ('microsoft.containerservice/managedclusters/microsoft.kubernetesconfiguration/extensions'))\r\n| where (type !~ ('microsoft.kubernetes/connectedclusters/microsoft.kubernetesconfiguration/namespaces'))\r\n| where (type !~ ('microsoft.containerservice/managedclusters/microsoft.kubernetesconfiguration/namespaces'))\r\n| where (type !~ ('microsoft.kubernetes/connectedclusters/microsoft.kubernetesconfiguration/fluxconfigurations'))\r\n| where (type !~ ('microsoft.containerservice/managedclusters/microsoft.kubernetesconfiguration/fluxconfigurations'))\r\n| where (type !~ ('microsoft.portalservices/extensions/deployments'))\r\n| where (type !~ ('microsoft.portalservices/extensions'))\r\n| where (type !~ ('microsoft.portalservices/extensions/slots'))\r\n| where (type !~ ('microsoft.portalservices/extensions/versions'))\r\n| where (type !~ ('microsoft.datacollaboration/workspaces'))\r\n| where (type !~ ('microsoft.deviceregistry/devices'))\r\n| where (type !~ ('microsoft.deviceupdate/updateaccounts/activedeployments'))\r\n| where (type !~ ('microsoft.deviceupdate/updateaccounts/agents'))\r\n| where (type !~ ('microsoft.deviceupdate/updateaccounts/deployments'))\r\n| where (type !~ ('microsoft.deviceupdate/updateaccounts/deviceclasses'))\r\n| where (type !~ ('microsoft.deviceupdate/updateaccounts/updates'))\r\n| where (type !~ ('microsoft.deviceupdate/updateaccounts'))\r\n| where (type !~ ('private.devtunnels/tunnelplans'))\r\n| where (type !~ ('private.easm/workspaces'))\r\n| where (type !~ ('microsoft.edgeorder/virtual_orderitems'))\r\n| where (type !~ ('microsoft.workloads/epicvirtualinstances'))\r\n| where (type !~ ('microsoft.fairfieldgardens/provisioningresources/provisioningpolicies'))\r\n| where (type !~ ('microsoft.fairfieldgardens/provisioningresources'))\r\n| where (type !~ ('microsoft.healthmodel/healthmodels'))\r\n| where (type !~ ('microsoft.hybridcompute/arcserverwithwac'))\r\n| where (type !~ ('microsoft.hybridcompute/machinessovereign'))\r\n| where (type !~ ('microsoft.hybridcompute/machinesesu'))\r\n| where (type !~ ('microsoft.hybridcompute/machinespaygo'))\r\n| where (type !~ ('microsoft.network/virtualhubs')) or ((kind =~ ('routeserver')))\r\n| where (type !~ ('microsoft.network/networkvirtualappliances'))\r\n| where (type !~ ('microsoft.devhub/iacprofiles'))\r\n| where (type !~ ('microsoft.modsimworkbench/workbenches/chambers'))\r\n| where (type !~ ('microsoft.modsimworkbench/workbenches/chambers/files'))\r\n| where (type !~ ('microsoft.modsimworkbench/workbenches/chambers/filerequests'))\r\n| where (type !~ ('microsoft.modsimworkbench/workbenches/chambers/licenses'))\r\n| where (type !~ ('microsoft.modsimworkbench/workbenches/chambers/connectors'))\r\n| where (type !~ ('microsoft.modsimworkbench/workbenches/sharedstorages'))\r\n| where (type !~ ('microsoft.modsimworkbench/workbenches/chambers/storages'))\r\n| where (type !~ ('microsoft.modsimworkbench/workbenches/chambers/workloads'))\r\n| where (type !~ ('microsoft.insights/diagnosticsettings'))\r\n| where not((type =~ ('microsoft.network/serviceendpointpolicies')) and ((kind =~ ('internal'))))\r\n| where (type !~ ('microsoft.resources/resourcegraphvisualizer'))\r\n| where (type !~ ('microsoft.iotoperationsmq/mq'))\r\n| where (type !~ ('microsoft.orbital/cloudaccessrouters'))\r\n| where (type !~ ('microsoft.orbital/terminals'))\r\n| where (type !~ ('microsoft.orbital/sdwancontrollers'))\r\n| where (type !~ ('microsoft.orbital/geocatalogs'))\r\n| where (type !~ ('microsoft.recommendationsservice/accounts/modeling'))\r\n| where (type !~ ('microsoft.recommendationsservice/accounts/serviceendpoints'))\r\n| where (type !~ ('microsoft.recoveryservicesbvtd/vaults'))\r\n| where (type !~ ('microsoft.recoveryservicesbvtd2/vaults'))\r\n| where (type !~ ('microsoft.recoveryservicesintd/vaults'))\r\n| where (type !~ ('microsoft.recoveryservicesintd2/vaults'))\r\n| where (type !~ ('microsoft.resources/deletedresources'))\r\n| where (type !~ ('microsoft.deploymentmanager/rollouts'))\r\n| where (type !~ ('microsoft.features/featureprovidernamespaces/featureconfigurations'))\r\n| where (type !~ ('microsoft.saashub/cloudservices/hidden'))\r\n| where (type !~ ('microsoft.providerhub/providerregistrations'))\r\n| where (type !~ ('microsoft.providerhub/providerregistrations/customrollouts'))\r\n| where (type !~ ('microsoft.providerhub/providerregistrations/defaultrollouts'))\r\n| where (type !~ ('microsoft.edge/configurations'))\r\n| where not((type =~ ('microsoft.synapse/workspaces/sqlpools')) and ((kind =~ ('v3'))))\r\n| where (type !~ ('microsoft.mission/approvals'))\r\n| where (type !~ ('microsoft.mission/catalogs'))\r\n| where (type !~ ('microsoft.mission/communities'))\r\n| where (type !~ ('microsoft.mission/communities/communityendpoints'))\r\n| where (type !~ ('microsoft.mission/enclaveconnections'))\r\n| where (type !~ ('microsoft.mission/virtualenclaves/enclaveendpoints'))\r\n| where (type !~ ('microsoft.mission/communities/transithubs'))\r\n| where (type !~ ('microsoft.mission/virtualenclaves'))\r\n| where (type !~ ('microsoft.mission/virtualenclaves/workloads'))\r\n| where (type !~ ('microsoft.workloads/insights'))\r\n| where (type !~ ('microsoft.hanaonazure/sapmonitors'))\r\n| where (type !~ ('microsoft.cloudhealth/healthmodels'))\r\n| where (type !~ ('microsoft.connectedcache/enterprisemcccustomers/enterprisemcccachenodes'))\r\n| where not((type =~ ('microsoft.sql/servers/databases')) and ((kind in~ ('system','v2.0,system','v12.0,system','v12.0,system,serverless','v12.0,user,datawarehouse,gen2,analytics'))))\r\n| where not((type =~ ('microsoft.sql/servers')) and ((kind =~ ('v12.0,analytics'))))\r\n| where (type in~ ('Microsoft.HybridCompute/machinesSoftwareAssurance','Microsoft.HybridCompute/machines'))\r\n| project name,benefitsStatus,benefitsStatusIcon,status,resourceGroup,operatingSystem,id,type,kind,location,subscriptionId\r\n| sort by (tolower(tostring(name))) asc",
+ "size": 0,
+ "title": "Eligible resources",
+ "noDataMessage": "There are no eligible resources.",
+ "showExportToExcel": true,
+ "queryType": 1,
+ "resourceType": "microsoft.resourcegraph/resources",
+ "crossComponentResources": [
+ "{Subscription}"
+ ],
+ "gridSettings": {
+ "formatters": [
+ {
+ "columnMatch": "benefitsStatusIcon",
+ "formatter": 18,
+ "formatOptions": {
+ "thresholdsOptions": "icons",
+ "thresholdsGrid": [
+ {
+ "operator": "==",
+ "thresholdValue": "7",
+ "representation": "3",
+ "text": ""
+ },
+ {
+ "operator": "==",
+ "thresholdValue": "8",
+ "representation": "success",
+ "text": ""
+ },
+ {
+ "operator": "Default",
+ "thresholdValue": null,
+ "representation": "unknown",
+ "text": ""
+ }
+ ]
+ }
+ },
+ {
+ "columnMatch": "esuStatusIcon",
+ "formatter": 18,
+ "formatOptions": {
+ "thresholdsOptions": "icons",
+ "thresholdsGrid": [
+ {
+ "operator": "==",
+ "thresholdValue": "7",
+ "representation": "4",
+ "text": ""
+ },
+ {
+ "operator": "==",
+ "thresholdValue": "9",
+ "representation": "warning",
+ "text": ""
+ },
+ {
+ "operator": "==",
+ "thresholdValue": "8",
+ "representation": "success",
+ "text": ""
+ },
+ {
+ "operator": "==",
+ "thresholdValue": "91",
+ "representation": "unknown",
+ "text": "{0}{1}"
+ },
+ {
+ "sourceColumn": "esuStatus",
+ "operator": "Default",
+ "thresholdValue": null,
+ "representation": "unknown",
+ "text": ""
+ }
+ ]
+ }
+ }
+ ]
+ }
+ },
+ "conditionalVisibility": {
+ "parameterName": "eligibleResources",
+ "comparison": "isEqualTo",
+ "value": "Yes"
+ },
+ "name": "arcAHBResources"
+ }
+ ]
+ },
+ "conditionalVisibility": {
+ "parameterName": "eligibleResources",
+ "comparison": "isEqualTo",
+ "value": "Yes"
+ },
+ "name": "group-eligibleResources"
+ },
+ {
+ "type": 12,
+ "content": {
+ "version": "NotebookGroup/1.0",
+ "groupType": "editable",
+ "title": "Eligible licenses",
+ "items": [
+ {
+ "type": 1,
+ "content": {
+ "json": "Keep in mind, subscription read permissions are required to give accurate core count and usage information for your ESU licenses. Physical core based licenses are subject to different licensing guidelines and are excluded from this view.[Learn more.](https://learn.microsoft.com/azure/azure-arc/servers/license-extended-security-updates)",
+ "style": "info"
+ },
+ "name": "txtLearnMoreLicense"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "// Run query to see results.\r\nresources\r\n| where type =~ \"microsoft.hybridcompute/licenses\"\r\n| extend sku = properties.licenseDetails.edition\r\n| extend totalCores = properties.licenseDetails.processors\r\n| extend coreType = case(\r\n properties.licenseDetails.type =~ 'vCore','Virtual core',\r\n properties.licenseDetails.type =~ 'pCore','Physical core',\r\n 'Unknown'\r\n)\r\n| extend statusIcon = case(\r\n properties.licenseDetails.state =~ 'Activated', '8',\r\n properties.licenseDetails.state =~ 'Deactivated', '7',\r\n '91'\r\n)\r\n| extend status = case(\r\n properties.licenseDetails.state =~ 'Activated', 'Activated',\r\n properties.licenseDetails.state =~ 'Deactivated','Deactivated',\r\n 'Unknown'\r\n)\r\n| extend licenseId = tolower(tostring(id)) // Depending on what is stored in license profile, might have to get the immutableId instead\r\n| join kind=leftouter(\r\n resources\r\n | where type =~ \"microsoft.hybridcompute/machines/licenseProfiles\"\r\n | extend machineId = tolower(tostring(trim_end(@\"\\/\\w+\\/(\\w|\\.)+\", id)))\r\n | extend licenseId = tolower(tostring(properties.esuProfile.assignedLicense))\r\n | summarize resources = count() by licenseId\r\n) on licenseId // Get count of license profile per license, a license profile is created for each machine that is assigned a license\r\n| extend resources = iff(isnull(resources), 0, resources)\r\n| project id, name, type, location, subscriptionId, resourceGroup, kind, tags, extendedLocation, sku, totalCores, coreType, status, statusIcon, resources\r\n| extend subscriptionDisplayName=case(subscriptionId =~ 'e75c95f3-27b4-410f-a40e-2b9153a807dd','AEther Dev',subscriptionId =~ '823ca539-d44d-43ee-8dc8-023fd4f27396','AIOps_FailureSimulation_DevTest',subscriptionId =~ 'b2a328a7-ffff-4c09-b643-a4758cf170bc','AISC-DEV-02',subscriptionId =~ 'eef8b6d5-94da-4b36-9327-a662f2674efb','AISC-EngSys-01',subscriptionId =~ 'e0fd569c-e34a-4249-8c24-e8d723c7f054','AML - Responsible AI R&D',subscriptionId =~ 'f1d79e73-f8e3-4b10-bfdb-4207ca0723ed','AML Infra - Engineering System',subscriptionId =~ 'dad45786-32e5-4ef3-b90e-8e0838fbadb6','AnE.ExP.NonProduction',subscriptionId =~ '017ad81c-b730-4564-9109-9b763243a9a6','Anomaly Real Time-DevTest',subscriptionId =~ 'e686ef8c-d35d-4e9b-92f8-caaaa7948c0a','Applied Sciences Group Dev',subscriptionId =~ '6e967edb-425b-4a33-ae98-f1d2c509dda3','Arc enabled Infrastructure - Demo',subscriptionId =~ '710c6ed8-d8d9-4c51-b100-dc4d9e10dd18','ARC-ESU-TESTING-03',subscriptionId =~ '2145a411-d149-4010-84d4-40fe8a55db44','ARM Test Environment',subscriptionId =~ 'e2a8a7b3-cb7a-4930-9c79-2b0eb7bf843c','ASZ_Lab_Hardware_Dev_1',subscriptionId =~ '4c33a6bb-d566-4d0b-8951-00b55a91fba8','AzPIESecurity-DEV-Apple',subscriptionId =~ 'b65b516b-415b-4c68-a254-bfa7411275f8','Azure CloudES CDP ER - Test',subscriptionId =~ '6785ea1f-ac40-4244-a9ce-94b12fd832ca','Azure Migrate Demo Subscription',subscriptionId =~ '8c3c936a-c09b-4de3-830b-3f5f244d72e9','Azure Migrate Program Management Team',subscriptionId =~ '432a7068-99ae-4975-ad38-d96b71172cdf','Azure Profiler - Testing',subscriptionId =~ 'caffe3c0-acbd-4d01-af76-a45f421bfb64','Azure_Base_LivesiteArmory_test',subscriptionId =~ 'a1920ebd-59b7-4f19-af9f-5e80599e88e4','Babel',subscriptionId =~ 'b43a6159-1bea-4fa2-9407-e875fdc0ff55','BAP IA EU Schrems (P)',subscriptionId =~ 'ae71ef11-a03f-4b4f-a0e6-ef144727c711','Bing MM Measurement',subscriptionId =~ '8ef80208-601f-4c83-802e-751d211745f9','CloudAnalytics_Prod1',subscriptionId =~ 'f7b4a5ce-d3bd-4a03-84fe-8bcad772c8c1','Cog Services Computer Vision',subscriptionId =~ '38dbd059-bd26-4172-af17-bcc5a00744de','Core-ES-STREAM-DeXDI',subscriptionId =~ '87e8a61c-4832-4cfe-8b72-c12554f2309a','Cosmos_C&E_Azure_Azure Resource Manager_100424',subscriptionId =~ '8c4b5b03-3b24-4ed0-91f5-a703cd91b412','Cosmos_C&E_Azure_AzureEngineeringSystems_100200',subscriptionId =~ 'b988efc7-1bc8-4a73-b4a2-5ad864580250','Cosmos_C&E_DPG_Big Data_100036',subscriptionId =~ '6121bf73-2dc9-47ac-8b6a-c6ae4b88ef39','Cost Management PM',subscriptionId =~ '44074499-ad9f-45b9-9b0b-f594f8736a45','CSX-WSD-CFE-TNT-QPP',subscriptionId =~ '3cd01953-be46-4f9b-a4e0-26f19f428765','CSX-WSD-CFE-TNT-TOOLKITHUB',subscriptionId =~ '60214a3c-65a2-46f8-8b32-f959f2454106','Data Pillar Security Tooling',subscriptionId =~ 'f7c445af-a4de-4264-9e87-3196d6bc384d','Efficiency Pack Services (MSIT)',subscriptionId =~ '86f010b8-6473-4cb9-90c1-671c74faa4ee','emilyzhu dev subscription',subscriptionId =~ 'f3326bfd-5406-4136-a835-f64ccbfd9050','FTK @ MS',subscriptionId =~ 'd2c9544f-4329-4642-b73d-020e7fef844f','HPCScrub1',subscriptionId =~ 'bac420ed-c6fc-4a05-8ac1-8c0c52da1d6e','IDEAs MS Reporting',subscriptionId =~ '3cd95ff9-ac62-4b5c-8240-0cd046687ea0','Internal App Insights Resources for Perflens',subscriptionId =~ 'a386d5ea-ea90-441a-8263-d816368c84a1','IOT_PLATFORM_UPX_TEST',subscriptionId =~ '6a0ab98c-24d4-4131-8cd7-0a78bfce58f5','ITSM Integration - Production - New',subscriptionId =~ '13723929-6644-4060-a50a-cc38ebc5e8b1','LinuxMdsd Test',subscriptionId =~ '98b02a69-28a5-4ee7-a622-cd69c7a59c4e','Marvel Intelligence Model Training Subscription',subscriptionId =~ '1278a874-89fc-418c-b6b9-ac763b000415','Microsoft Azure Internal Consumption (nbrady)',subscriptionId =~ '29de2cfc-f00a-43bb-bdc8-3108795bd282','MSFT-Modern Device-Modern Mgmt-Imaging00',subscriptionId =~ '54b875cc-a81a-4914-8bfd-1a36bc7ddf4d','MSFT-WindowsVirtualDesktop-01',subscriptionId =~ '4dc2cd39-7a89-43d8-bebe-8bb501359891','Observability_AzMon_Grafana_Dev',subscriptionId =~ 'a471d615-ff98-4e80-b375-a19543d4691e','ODC-OneBox-Resources',subscriptionId =~ '1163fbbe-27e7-4b0f-8466-195fe5417043','Python_AI_Tools_PM_Team_Sub (jbinder)',subscriptionId =~ '3905431d-c062-4c17-8fd9-c51f89f334c4','Pytorch Build',subscriptionId =~ '3f577935-3138-4d07-86b3-75651b696483','Responsible & OpenAi Research',subscriptionId =~ '0f301386-8979-4981-acca-973d553078e7','Scope Team Test Subscription',subscriptionId =~ '1b0a5c20-7373-41a2-8fec-7364cceb7bbf','Services Hub Demo Open',subscriptionId =~ 'e72e5254-f265-4e95-9bd2-9ee8e7329051','Speech Services - DEV - SDK (carbon)',subscriptionId =~ 'a1c3dc6b-8630-4bb7-a29e-4ed4407c329b','Speech Services - EXP2',subscriptionId =~ '736af2bf-9fcb-4145-a19b-5b30b2b8949d','Trey International UK',subscriptionId =~ '51f73f67-1f29-4120-863e-dd315f743fc1','Trey Partner Lab 2',subscriptionId =~ '9ec51cfd-5ca7-4d76-8101-dd0a4abc5674','Trey Research Corporate',subscriptionId =~ '73c0021f-a37d-433f-8baa-7450cb54eea6','Trey Research Finance',subscriptionId =~ 'ed570627-0265-4620-bb42-bae06bcfa914','Trey Research IT',subscriptionId =~ '64e355d7-997c-491d-b0c1-8414dccfcf42','Trey Research R&D Playground',subscriptionId =~ '586f1d47-9dd9-43d5-b196-6e28f8405ff8','Trey Research R&D Production',subscriptionId =~ '9ec1d932-0f3f-486c-acc6-e7d78b358f9b','TScience',subscriptionId =~ '79f57c16-00fe-48da-87d4-5192e86cd047','TScienceGPU',subscriptionId =~ 'bac044cf-49e1-4843-8dda-1ce9662606c8','UI Fabric',subscriptionId =~ '6760347d-9ffe-41a9-ba11-c139dcea5ce6','xt-teams-migration-dev',subscriptionId =~ '45f9252d-e27e-4ed8-ab4e-dc5054de13fa','Contoso IT - Retail - Prod',subscriptionId)\r\n| where (type !~ ('dell.storage/filesystems'))\r\n| where (type !~ ('arizeai.observabilityeval/organizations'))\r\n| where (type !~ ('lambdatest.hyperexecute/organizations'))\r\n| where (type !~ ('pinecone.vectordb/organizations'))\r\n| where (type !~ ('microsoft.weightsandbiases/instances'))\r\n| where (type !~ ('purestorage.block/storagepools/avsstoragecontainers'))\r\n| where (type !~ ('purestorage.block/reservations'))\r\n| where (type !~ ('purestorage.block/storagepools'))\r\n| where (type !~ ('solarwinds.observability/organizations'))\r\n| where (type !~ ('splitio.experimentation/experimentationworkspaces'))\r\n| where (type !~ ('microsoft.agfoodplatform/farmbeats'))\r\n| where (type !~ ('microsoft.appsecurity/policies'))\r\n| where (type !~ ('microsoft.arc/all'))\r\n| where (type !~ ('microsoft.arc/allfairfax'))\r\n| where (type !~ ('microsoft.cdn/profiles/customdomains'))\r\n| where (type !~ ('microsoft.cdn/profiles/afdendpoints'))\r\n| where (type !~ ('microsoft.cdn/profiles/origingroups/origins'))\r\n| where (type !~ ('microsoft.cdn/profiles/origingroups'))\r\n| where (type !~ ('microsoft.cdn/profiles/afdendpoints/routes'))\r\n| where (type !~ ('microsoft.cdn/profiles/rulesets/rules'))\r\n| where (type !~ ('microsoft.cdn/profiles/rulesets'))\r\n| where (type !~ ('microsoft.cdn/profiles/secrets'))\r\n| where (type !~ ('microsoft.cdn/profiles/securitypolicies'))\r\n| where (type !~ ('microsoft.chaos/privateaccesses'))\r\n| where (type !~ ('microsoft.sovereign/transparencylogs'))\r\n| where (type !~ ('microsoft.sovereign/landingzoneconfigurations'))\r\n| where (type !~ ('microsoft.hardwaresecuritymodules/cloudhsmclusters'))\r\n| where (type !~ ('microsoft.compute/computefleetinstances'))\r\n| where (type !~ ('microsoft.compute/standbypoolinstance'))\r\n| where (type !~ ('microsoft.compute/virtualmachineflexinstances'))\r\n| where (type !~ ('microsoft.kubernetesconfiguration/extensions'))\r\n| where (type !~ ('microsoft.containerservice/managedclusters/microsoft.kubernetesconfiguration/extensions'))\r\n| where (type !~ ('microsoft.kubernetes/connectedclusters/microsoft.kubernetesconfiguration/namespaces'))\r\n| where (type !~ ('microsoft.containerservice/managedclusters/microsoft.kubernetesconfiguration/namespaces'))\r\n| where (type !~ ('microsoft.kubernetes/connectedclusters/microsoft.kubernetesconfiguration/fluxconfigurations'))\r\n| where (type !~ ('microsoft.containerservice/managedclusters/microsoft.kubernetesconfiguration/fluxconfigurations'))\r\n| where (type !~ ('microsoft.portalservices/extensions/deployments'))\r\n| where (type !~ ('microsoft.portalservices/extensions'))\r\n| where (type !~ ('microsoft.portalservices/extensions/slots'))\r\n| where (type !~ ('microsoft.portalservices/extensions/versions'))\r\n| where (type !~ ('microsoft.datacollaboration/workspaces'))\r\n| where (type !~ ('microsoft.deviceregistry/devices'))\r\n| where (type !~ ('microsoft.deviceupdate/updateaccounts/activedeployments'))\r\n| where (type !~ ('microsoft.deviceupdate/updateaccounts/agents'))\r\n| where (type !~ ('microsoft.deviceupdate/updateaccounts/deployments'))\r\n| where (type !~ ('microsoft.deviceupdate/updateaccounts/deviceclasses'))\r\n| where (type !~ ('microsoft.deviceupdate/updateaccounts/updates'))\r\n| where (type !~ ('microsoft.deviceupdate/updateaccounts'))\r\n| where (type !~ ('private.devtunnels/tunnelplans'))\r\n| where (type !~ ('private.easm/workspaces'))\r\n| where (type !~ ('microsoft.edgeorder/virtual_orderitems'))\r\n| where (type !~ ('microsoft.workloads/epicvirtualinstances'))\r\n| where (type !~ ('microsoft.fairfieldgardens/provisioningresources/provisioningpolicies'))\r\n| where (type !~ ('microsoft.fairfieldgardens/provisioningresources'))\r\n| where (type !~ ('microsoft.healthmodel/healthmodels'))\r\n| where (type !~ ('microsoft.hybridcompute/arcserverwithwac'))\r\n| where (type !~ ('microsoft.hybridcompute/machinessovereign'))\r\n| where (type !~ ('microsoft.hybridcompute/machinesesu'))\r\n| where (type !~ ('microsoft.hybridcompute/machinespaygo'))\r\n| where (type !~ ('microsoft.hybridcompute/machinessoftwareassurance'))\r\n| where (type !~ ('microsoft.network/virtualhubs')) or ((kind =~ ('routeserver')))\r\n| where (type !~ ('microsoft.network/networkvirtualappliances'))\r\n| where (type !~ ('microsoft.devhub/iacprofiles'))\r\n| where (type !~ ('microsoft.modsimworkbench/workbenches/chambers'))\r\n| where (type !~ ('microsoft.modsimworkbench/workbenches/chambers/files'))\r\n| where (type !~ ('microsoft.modsimworkbench/workbenches/chambers/filerequests'))\r\n| where (type !~ ('microsoft.modsimworkbench/workbenches/chambers/licenses'))\r\n| where (type !~ ('microsoft.modsimworkbench/workbenches/chambers/connectors'))\r\n| where (type !~ ('microsoft.modsimworkbench/workbenches/sharedstorages'))\r\n| where (type !~ ('microsoft.modsimworkbench/workbenches/chambers/storages'))\r\n| where (type !~ ('microsoft.modsimworkbench/workbenches/chambers/workloads'))\r\n| where (type !~ ('microsoft.insights/diagnosticsettings'))\r\n| where not((type =~ ('microsoft.network/serviceendpointpolicies')) and ((kind =~ ('internal'))))\r\n| where (type !~ ('microsoft.resources/resourcegraphvisualizer'))\r\n| where (type !~ ('microsoft.iotoperationsmq/mq'))\r\n| where (type !~ ('microsoft.orbital/cloudaccessrouters'))\r\n| where (type !~ ('microsoft.orbital/terminals'))\r\n| where (type !~ ('microsoft.orbital/sdwancontrollers'))\r\n| where (type !~ ('microsoft.orbital/geocatalogs'))\r\n| where (type !~ ('microsoft.recommendationsservice/accounts/modeling'))\r\n| where (type !~ ('microsoft.recommendationsservice/accounts/serviceendpoints'))\r\n| where (type !~ ('microsoft.recoveryservicesbvtd/vaults'))\r\n| where (type !~ ('microsoft.recoveryservicesbvtd2/vaults'))\r\n| where (type !~ ('microsoft.recoveryservicesintd/vaults'))\r\n| where (type !~ ('microsoft.recoveryservicesintd2/vaults'))\r\n| where (type !~ ('microsoft.resources/deletedresources'))\r\n| where (type !~ ('microsoft.deploymentmanager/rollouts'))\r\n| where (type !~ ('microsoft.features/featureprovidernamespaces/featureconfigurations'))\r\n| where (type !~ ('microsoft.saashub/cloudservices/hidden'))\r\n| where (type !~ ('microsoft.providerhub/providerregistrations'))\r\n| where (type !~ ('microsoft.providerhub/providerregistrations/customrollouts'))\r\n| where (type !~ ('microsoft.providerhub/providerregistrations/defaultrollouts'))\r\n| where (type !~ ('microsoft.edge/configurations'))\r\n| where not((type =~ ('microsoft.synapse/workspaces/sqlpools')) and ((kind =~ ('v3'))))\r\n| where (type !~ ('microsoft.mission/approvals'))\r\n| where (type !~ ('microsoft.mission/catalogs'))\r\n| where (type !~ ('microsoft.mission/communities'))\r\n| where (type !~ ('microsoft.mission/communities/communityendpoints'))\r\n| where (type !~ ('microsoft.mission/enclaveconnections'))\r\n| where (type !~ ('microsoft.mission/virtualenclaves/enclaveendpoints'))\r\n| where (type !~ ('microsoft.mission/communities/transithubs'))\r\n| where (type !~ ('microsoft.mission/virtualenclaves'))\r\n| where (type !~ ('microsoft.mission/virtualenclaves/workloads'))\r\n| where (type !~ ('microsoft.workloads/insights'))\r\n| where (type !~ ('microsoft.hanaonazure/sapmonitors'))\r\n| where (type !~ ('microsoft.cloudhealth/healthmodels'))\r\n| where (type !~ ('microsoft.connectedcache/enterprisemcccustomers/enterprisemcccachenodes'))\r\n| where not((type =~ ('microsoft.sql/servers/databases')) and ((kind in~ ('system','v2.0,system','v12.0,system','v12.0,system,serverless','v12.0,user,datawarehouse,gen2,analytics'))))\r\n| where not((type =~ ('microsoft.sql/servers')) and ((kind =~ ('v12.0,analytics'))))\r\n| project name,sku,totalCores,coreType,status,statusIcon,resources,id,resourceGroup,subscriptionDisplayName,type,kind,location,subscriptionId,tags\r\n| sort by (tolower(tostring(name))) asc",
+ "size": 0,
+ "title": "Eligible licenses",
+ "noDataMessage": "There are no eligible licenses.",
+ "queryType": 1,
+ "resourceType": "microsoft.resourcegraph/resources",
+ "crossComponentResources": [
+ "{Subscription}"
+ ]
+ },
+ "conditionalVisibility": {
+ "parameterName": "eligibleLicenses",
+ "comparison": "isEqualTo",
+ "value": "Yes"
+ },
+ "name": "arclicenses"
+ }
+ ]
+ },
+ "conditionalVisibility": {
+ "parameterName": "eligibleLicenses",
+ "comparison": "isEqualTo",
+ "value": "Yes"
+ },
+ "name": "group-eligibleLicenses"
+ }
+ ]
+ },
+ "conditionalVisibility": {
+ "parameterName": "SelectedSubTab",
+ "comparison": "isEqualTo",
+ "value": "arcAHB"
+ },
+ "name": "group-ahbArc"
+ }
+ ]
+ },
+ "conditionalVisibility": {
+ "parameterName": "SelectedSubTab",
+ "comparison": "isEqualTo",
+ "value": "arc"
+ },
+ "name": "Arc"
+ },
{
"type": 12,
"content": {
@@ -657,7 +1202,7 @@
"type": 3,
"content": {
"version": "KqlItem/1.0",
- "query": "ResourceContainers | where type =~ 'Microsoft.Resources/subscriptions' | where tostring (properties.subscriptionPolicies.quotaId) !has \"MSDNDevTest_2014-09-01\" | extend SubscriptionName=name \r\n| join (\r\nresources \r\n| where resourceGroup in ({ResourceGroup})\r\n| where type =~ 'microsoft.compute/virtualmachines' or type =~ 'microsoft.compute/virtualMachineScaleSets'\r\n| where tostring(properties.storageProfile.imageReference.publisher ) == \"MicrosoftWindowsServer\" or tostring(properties.virtualMachineProfile.storageProfile.osDisk.osType) == 'Windows' or tostring(properties.storageProfile.imageReference.publisher ) == \"microsoftsqlserver\"\r\n| where tostring(properties.['licenseType']) !has 'Windows' and tostring(properties.virtualMachineProfile.['licenseType']) != 'Windows_Server'\r\n| extend WindowsId=id, VMIDFull=id, VMName=name, VMLocation=location, VMRG=resourceGroup, OSType=tostring(properties.storageProfile.imageReference.offer), OsVersion = tostring(properties.storageProfile.imageReference.sku), VMSize=tostring (properties.hardwareProfile.vmSize), LicenseType = tostring(properties.['licenseType']), VMSSize=tostring(sku.name), QuickFix=id\r\n ) on subscriptionId \r\n| order by type asc \r\n| project WindowsId,VMName,VMRG,VMSize, VMSSize, VMLocation,OSType, OsVersion,LicenseType, subscriptionId, QuickFix, VMIDFull\r\n| join kind = innerunique(\r\n resources\r\n | extend replaced_tags = replace('{}', 'null', tostring(tags))\r\n | extend replaced_tags = parse_json(replaced_tags)\r\n | mv-expand replaced_tags\r\n | extend tagName = tostring(bag_keys(replaced_tags)[0])\r\n | extend tagValue = tostring(replaced_tags['{TagName}']), WindowsId=id\r\n | where tagName has '{TagName}' and tagValue has '{TagValue}'\r\n | distinct WindowsId\r\n )\r\n on WindowsId",
+ "query": "ResourceContainers | where type =~ 'Microsoft.Resources/subscriptions' | where tostring (properties.subscriptionPolicies.quotaId) !has \"MSDNDevTest_2014-09-01\" | extend SubscriptionName=name \r\n| join (\r\nresources \r\n| where resourceGroup in ({ResourceGroup})\r\n| where type =~ 'microsoft.compute/virtualmachines' or type =~ 'microsoft.compute/virtualMachineScaleSets'\r\n| where tostring(properties.storageProfile.imageReference.publisher ) == \"MicrosoftWindowsServer\" or tostring(properties.virtualMachineProfile.storageProfile.osDisk.osType) == 'Windows' or tostring(properties.storageProfile.imageReference.publisher ) == \"microsoftsqlserver\"\r\n| extend OS=properties.storageProfile.imageReference.id \r\n| where isnull(OS)\r\n| where tostring(properties.['licenseType']) !has 'Windows' and tostring(properties.virtualMachineProfile.['licenseType']) != 'Windows_Server'\r\n| extend WindowsId=id, VMIDFull=id, VMName=name, VMLocation=location, VMRG=resourceGroup, OSType=tostring(properties.storageProfile.imageReference.offer), OsVersion = tostring(properties.storageProfile.imageReference.sku), VMSize=tostring (properties.hardwareProfile.vmSize), LicenseType = tostring(properties.['licenseType']), VMSSize=tostring(sku.name), QuickFix=id\r\n ) on subscriptionId \r\n| order by type asc \r\n| project WindowsId,VMName,VMRG,VMSize, VMSSize, VMLocation,OSType, OsVersion,LicenseType, subscriptionId, QuickFix, VMIDFull\r\n| join kind = innerunique(\r\n resources\r\n | extend replaced_tags = replace('{}', 'null', tostring(tags))\r\n | extend replaced_tags = parse_json(replaced_tags)\r\n | mv-expand replaced_tags\r\n | extend tagName = tostring(bag_keys(replaced_tags)[0])\r\n | extend tagValue = tostring(replaced_tags['{TagName}']), WindowsId=id\r\n | where tagName has '{TagName}' and tagValue has '{TagValue}'\r\n | distinct WindowsId\r\n )\r\n on WindowsId",
"size": 0,
"title": "AHB Disabled",
"noDataMessage": "All of your VMs have AHB enabled.",
@@ -691,7 +1236,7 @@
"type": 3,
"content": {
"version": "KqlItem/1.0",
- "query": "ResourceContainers | where type =~ 'Microsoft.Resources/subscriptions' | where tostring (properties.subscriptionPolicies.quotaId) !has \"MSDNDevTest_2014-09-01\" | extend SubscriptionName=name \r\n| join (\r\nresources \r\n| where resourceGroup in ({ResourceGroup})\r\n| where type =~ 'microsoft.compute/virtualmachines'\r\n| where tostring(properties.storageProfile.imageReference.publisher ) == \"MicrosoftWindowsServer\" or tostring(properties.virtualMachineProfile.storageProfile.osDisk.osType) == 'Windows' or tostring(properties.storageProfile.imageReference.publisher ) == \"microsoftsqlserver\"\r\n| where tostring(properties.['licenseType']) has \"Windows\"\r\n| extend WindowsId=id, VMName=name, VMLocation=location, VMRG=resourceGroup, OSType=tostring(properties.storageProfile.imageReference.offer), OsVersion = tostring(properties.storageProfile.imageReference.sku), VMSize=tostring (properties.hardwareProfile.vmSize), LicenseType = tostring(properties.['licenseType']), VMSSize=tostring(sku.name)\r\n) on subscriptionId \r\n| order by type asc \r\n| project WindowsId,VMName,VMRG,VMSize, VMSSize, VMLocation,OSType, OsVersion,LicenseType, subscriptionId\r\n| join kind = innerunique(\r\n resources\r\n | extend replaced_tags = replace('{}', 'null', tostring(tags))\r\n | extend replaced_tags = parse_json(replaced_tags)\r\n | mv-expand replaced_tags\r\n | extend tagName = tostring(bag_keys(replaced_tags)[0])\r\n | extend tagValue = tostring(replaced_tags['{TagName}']), WindowsId=id\r\n | where tagName has '{TagName}' and tagValue has '{TagValue}'\r\n | distinct WindowsId\r\n )\r\n on WindowsId",
+ "query": "ResourceContainers | where type =~ 'Microsoft.Resources/subscriptions' | where tostring (properties.subscriptionPolicies.quotaId) !has \"MSDNDevTest_2014-09-01\" | extend SubscriptionName=name \r\n| join (\r\nresources \r\n| where resourceGroup in ({ResourceGroup})\r\n| where type =~ 'microsoft.compute/virtualmachines'\r\n| where tostring(properties.storageProfile.imageReference.publisher ) == \"MicrosoftWindowsServer\" or tostring(properties.virtualMachineProfile.storageProfile.osDisk.osType) == 'Windows' or tostring(properties.storageProfile.imageReference.publisher ) == \"microsoftsqlserver\"\r\n| extend OS=properties.storageProfile.imageReference.id \r\n| where isnull(OS)\r\n| where tostring(properties.['licenseType']) has \"Windows\"\r\n| extend WindowsId=id, VMName=name, VMLocation=location, VMRG=resourceGroup, OSType=tostring(properties.storageProfile.imageReference.offer), OsVersion = tostring(properties.storageProfile.imageReference.sku), VMSize=tostring (properties.hardwareProfile.vmSize), LicenseType = tostring(properties.['licenseType']), VMSSize=tostring(sku.name)\r\n) on subscriptionId \r\n| order by type asc \r\n| project WindowsId,VMName,VMRG,VMSize, VMSSize, VMLocation,OSType, OsVersion,LicenseType, subscriptionId\r\n| join kind = innerunique(\r\n resources\r\n | extend replaced_tags = replace('{}', 'null', tostring(tags))\r\n | extend replaced_tags = parse_json(replaced_tags)\r\n | mv-expand replaced_tags\r\n | extend tagName = tostring(bag_keys(replaced_tags)[0])\r\n | extend tagValue = tostring(replaced_tags['{TagName}']), WindowsId=id\r\n | where tagName has '{TagName}' and tagValue has '{TagValue}'\r\n | distinct WindowsId\r\n )\r\n on WindowsId",
"size": 0,
"title": "AHB Enabled",
"noDataMessage": "None of your VMs have AHB enabled.",
@@ -793,7 +1338,7 @@
"type": 3,
"content": {
"version": "KqlItem/1.0",
- "query": "ResourceContainers | where type =~ 'Microsoft.Resources/subscriptions' | where tostring (properties.subscriptionPolicies.quotaId) !has \"MSDNDevTest_2014-09-01\" | extend SubscriptionName=name \r\n| join (\r\nresources \r\n| where resourceGroup in ({ResourceGroup})\r\n| where type =~ 'microsoft.compute/virtualmachines'\r\n| where tostring(properties.storageProfile.osDisk.osType) == 'Windows'\r\n| extend WindowsId=id\r\n| join kind = innerunique(\r\n resources\r\n | extend replaced_tags = replace('{}', 'null', tostring(tags))\r\n | extend replaced_tags = parse_json(replaced_tags)\r\n | mv-expand replaced_tags\r\n | extend tagName = tostring(bag_keys(replaced_tags)[0])\r\n | extend tagValue = tostring(replaced_tags['{TagName}']), WindowsId=id\r\n | where tagName has '{TagName}' and tagValue has '{TagValue}'\r\n | distinct WindowsId\r\n )\r\n on WindowsId\r\n| extend LicenseType = tostring(properties.['licenseType'])\r\n| extend CheckAHBWindows = case(\r\n type == 'microsoft.compute/virtualmachines' or type =~ 'microsoft.compute/virtualMachineScaleSets', iif((properties.['licenseType'])\r\n !has 'Windows' and (properties.virtualMachineProfile.['licenseType']) !has 'Windows' , \"AHB Not Enabled\", \"AHB Enabled\"),\r\n \"Not Windows\"\r\n )\r\n) on subscriptionId \r\n| summarize count() by SubscriptionName, CheckAHBWindows\r\n",
+ "query": "ResourceContainers | where type =~ 'Microsoft.Resources/subscriptions' | where tostring (properties.subscriptionPolicies.quotaId) !has \"MSDNDevTest_2014-09-01\" | extend SubscriptionName=name \r\n| join (\r\nresources \r\n| where resourceGroup in ({ResourceGroup})\r\n| where type =~ 'microsoft.compute/virtualmachines'\r\n| where tostring(properties.storageProfile.imageReference.publisher ) == \"MicrosoftWindowsServer\" or tostring(properties.virtualMachineProfile.storageProfile.osDisk.osType) == 'Windows' or tostring(properties.storageProfile.imageReference.publisher ) == \"microsoftsqlserver\"\r\n| extend OS=properties.storageProfile.imageReference.id \r\n| where isnull(OS)\r\n| extend WindowsId=id\r\n| join kind = innerunique(\r\n resources\r\n | extend replaced_tags = replace('{}', 'null', tostring(tags))\r\n | extend replaced_tags = parse_json(replaced_tags)\r\n | mv-expand replaced_tags\r\n | extend tagName = tostring(bag_keys(replaced_tags)[0])\r\n | extend tagValue = tostring(replaced_tags['{TagName}']), WindowsId=id\r\n | where tagName has '{TagName}' and tagValue has '{TagValue}'\r\n | distinct WindowsId\r\n )\r\n on WindowsId\r\n| extend LicenseType = tostring(properties.['licenseType'])\r\n| extend CheckAHBWindows = case(\r\n type == 'microsoft.compute/virtualmachines' or type =~ 'microsoft.compute/virtualMachineScaleSets', iif((properties.['licenseType'])\r\n !has 'Windows' and (properties.virtualMachineProfile.['licenseType']) !has 'Windows' , \"AHB Not Enabled\", \"AHB Enabled\"),\r\n \"Not Windows\"\r\n )\r\n) on subscriptionId \r\n| summarize count() by SubscriptionName, CheckAHBWindows\r\n",
"size": 0,
"title": "Summary of Windows VMs with or without AHB per Subscription",
"showRefreshButton": true,
@@ -862,7 +1407,7 @@
"type": 3,
"content": {
"version": "KqlItem/1.0",
- "query": "ResourceContainers | where type =~ 'Microsoft.Resources/subscriptions' | where tostring (properties.subscriptionPolicies.quotaId) !has \"MSDNDevTest_2014-09-01\" | extend SubscriptionName=name \r\n| join (\r\nresources \r\n| where resourceGroup in ({ResourceGroup})\r\n| where type =~ 'microsoft.compute/virtualmachines'\r\n| where tostring(properties.storageProfile.osDisk.osType) == 'Windows'\r\n| extend WindowsId=id\r\n| join kind = innerunique(\r\n resources\r\n | extend replaced_tags = replace('{}', 'null', tostring(tags))\r\n | extend replaced_tags = parse_json(replaced_tags)\r\n | mv-expand replaced_tags\r\n | extend tagName = tostring(bag_keys(replaced_tags)[0])\r\n | extend tagValue = tostring(replaced_tags['{TagName}']), WindowsId=id\r\n | where tagName has '{TagName}' and tagValue has '{TagValue}'\r\n | distinct WindowsId\r\n )\r\n on WindowsId\r\n| extend LicenseType = tostring(properties.['licenseType'])\r\n| extend CheckAHBWindows = case(\r\n type == 'microsoft.compute/virtualmachines' or type =~ 'microsoft.compute/virtualMachineScaleSets', iif((properties.['licenseType'])\r\n !has 'Windows' and (properties.virtualMachineProfile.['licenseType']) !has 'Windows' , \"AHB Not Enabled\", \"AHB Enabled\"),\r\n \"Not Windows\"\r\n )\r\n) on subscriptionId \r\n| summarize count() by CheckAHBWindows",
+ "query": "ResourceContainers | where type =~ 'Microsoft.Resources/subscriptions' | where tostring (properties.subscriptionPolicies.quotaId) !has \"MSDNDevTest_2014-09-01\" | extend SubscriptionName=name \r\n| join (\r\nresources \r\n| where resourceGroup in ({ResourceGroup})\r\n| where tostring(properties.storageProfile.imageReference.publisher ) == \"MicrosoftWindowsServer\" or tostring(properties.virtualMachineProfile.storageProfile.osDisk.osType) == 'Windows' or tostring(properties.storageProfile.imageReference.publisher ) == \"microsoftsqlserver\"\r\n| where tostring(properties.storageProfile.osDisk.osType) == 'Windows'\r\n| extend OS=properties.storageProfile.imageReference.id \r\n| where isnull(OS)\r\n| extend WindowsId=id\r\n| join kind = innerunique(\r\n resources\r\n | extend replaced_tags = replace('{}', 'null', tostring(tags))\r\n | extend replaced_tags = parse_json(replaced_tags)\r\n | mv-expand replaced_tags\r\n | extend tagName = tostring(bag_keys(replaced_tags)[0])\r\n | extend tagValue = tostring(replaced_tags['{TagName}']), WindowsId=id\r\n | where tagName has '{TagName}' and tagValue has '{TagValue}'\r\n | distinct WindowsId\r\n )\r\n on WindowsId\r\n| extend LicenseType = tostring(properties.['licenseType'])\r\n| extend CheckAHBWindows = case(\r\n type == 'microsoft.compute/virtualmachines' or type =~ 'microsoft.compute/virtualMachineScaleSets', iif((properties.['licenseType'])\r\n !has 'Windows' and (properties.virtualMachineProfile.['licenseType']) !has 'Windows' , \"AHB Not Enabled\", \"AHB Enabled\"),\r\n \"Not Windows\"\r\n )\r\n) on subscriptionId \r\n| summarize count() by CheckAHBWindows",
"size": 0,
"title": "Summary of Windows VMs with or without AHB",
"showRefreshButton": true,
@@ -1067,8 +1612,7 @@
"jsonData": "[\r\n {\"value\":\"Yes\"},\r\n {\"value\":\"No\", \"selected\":true}\r\n]\r\n\r\n",
"timeContext": {
"durationMs": 86400000
- },
- "value": "Yes"
+ }
},
{
"id": "f1ac5e53-253c-4afb-8bc5-b1ba2efea3eb",
@@ -1081,8 +1625,7 @@
"additionalResourceOptions": [],
"showDefault": false
},
- "jsonData": "[\r\n {\"value\":\"Yes\"},\r\n {\"value\":\"No\", \"selected\":true}\r\n]\r\n\r\n",
- "value": "Yes"
+ "jsonData": "[\r\n {\"value\":\"Yes\"},\r\n {\"value\":\"No\", \"selected\":true}\r\n]\r\n\r\n"
},
{
"id": "20a00706-a89b-42aa-8dea-9c44c93e8014",
@@ -4972,7 +5515,7 @@
}
],
"fallbackResourceIds": [
- "Azure Monitor"
+ "Azure Advisor"
],
"$schema": "https://github.com/Microsoft/Application-Insights-Workbooks/blob/master/schema/workbook.json"
}
\ No newline at end of file
diff --git a/Workbooks/Azure Advisor/Cost Optimization/CostOptimization.workbook b/Workbooks/Azure Advisor/Cost Optimization/CostOptimization.workbook
index c57459618e..668410d8ab 100644
--- a/Workbooks/Azure Advisor/Cost Optimization/CostOptimization.workbook
+++ b/Workbooks/Azure Advisor/Cost Optimization/CostOptimization.workbook
@@ -642,7 +642,7 @@
"content": {
"version": "NotebookGroup/1.0",
"groupType": "template",
- "loadFromTemplateId": "community-Workbooks/Azure Advisor/Cost Optimization/commitmentDiscounts",
+ "loadFromTemplateId": "community-Workbooks/Azure Advisor/Cost Optimization/commitment-discounts",
"items": []
},
"conditionalVisibility": {
@@ -898,9 +898,9 @@
{
"type": 1,
"content": {
- "json": "## Prerequisites\r\n\r\nThis workbook requires the following least-privileged (minimum) roles on your Subscriptions:\r\n\r\n * **Reader** : allows you to import the workbook without saving it and view all of the workbook tabs.\r\n * **Workbook Contributor** : allows you to import and save the workbook\r\n\r\nThis workbook includes \"Quick Fix\" actions within certain queries. The permissions necessary to execute these actions may vary and are documented for each specific action.\r\n\r\n\r\n"
+ "json": "## Change log\r\n**Last update:** December 2024 \r\n\r\nTo learn more about this update and other announcements, visit the [FinOps Toolkit](https://github.com/microsoft/finops-toolkit/releases) page. \r\n\r\n### **December 2024** \r\n➕ **Added:** \r\n- Azure Arc Windows license management under the **Commitment Discounts** tab. \r\n\r\n### **November 2024** \r\n➕ **Added:** \r\n- On the **Storage** tab, included the RSVaultBackup tag in the list of non-idle disks. \r\n\r\n🛠️ **Fixed:** \r\n- Resolved an issue on the **Commitment Discounts** tab where RI rows were limited. \r\n- Corrected VM processor details on the **Compute** tab query. \r\n\r\n### **October 2024** \r\n➕ **Added:** \r\n- New **Compute** query to identify VMs by processor architecture type. \r\n- New **Database** query to identify SQL Pool instances with zero databases. \r\n- New **Storage** query to identify powered-off VMs with premium disks. \r\n\r\n✏️ **Changed:** \r\n- Redesigned the **Rate Optimization** tab for easier identification of break-even points for reservations. \r\n- Fixed the **AHB VMSS** query to count the total cores consumed across the entire scale set. \r\n- Improved the **Storage Idle Disks** query to ignore disks used by AKS pods. \r\n- Updated the **Storage Not V2** query to exclude blockBlobStorage accounts. \r\n- Added an export option for the **Idle Backups** list to streamline data extraction. \r\n"
},
- "name": "Prerequisites"
+ "name": "changelog"
},
{
"type": 1,
@@ -1082,4 +1082,4 @@
"Azure Monitor"
],
"$schema": "https://github.com/Microsoft/Application-Insights-Workbooks/blob/master/schema/workbook.json"
-}
+}
\ No newline at end of file
diff --git a/Workbooks/Azure Advisor/Cost Optimization/Databases/Databases.workbook b/Workbooks/Azure Advisor/Cost Optimization/Databases/Databases.workbook
index 470eeb6e06..62f360ebc9 100644
--- a/Workbooks/Azure Advisor/Cost Optimization/Databases/Databases.workbook
+++ b/Workbooks/Azure Advisor/Cost Optimization/Databases/Databases.workbook
@@ -434,4 +434,4 @@
"Azure Monitor"
],
"$schema": "https://github.com/Microsoft/Application-Insights-Workbooks/blob/master/schema/workbook.json"
-}
\ No newline at end of file
+}
diff --git a/Workbooks/Azure Advisor/Cost Optimization/Networking/Networking.workbook b/Workbooks/Azure Advisor/Cost Optimization/Networking/Networking.workbook
index e836374fb8..7e17f56ec5 100644
--- a/Workbooks/Azure Advisor/Cost Optimization/Networking/Networking.workbook
+++ b/Workbooks/Azure Advisor/Cost Optimization/Networking/Networking.workbook
@@ -282,7 +282,7 @@
"id": "68a77162-06c2-4648-83e0-f8f41c4fbda7",
"cellValue": "SelectedSubTab",
"linkTarget": "parameter",
- "linkLabel": "Express Route",
+ "linkLabel": "ExpressRoute",
"subTarget": "ER",
"style": "link"
},
@@ -761,7 +761,7 @@
{
"type": 1,
"content": {
- "json": "# Routing Preference\r\n\r\nAzure routing preference enables you to choose how your traffic routes between Azure and the Internet. You can choose to route traffic either via the Microsoft network or via the ISP network (public internet). By default, traffic is routed via the Microsoft global network for all Azure services.\r\n\r\nRouting preference choices include:\r\n\r\n- **Microsoft Network**: Both ingress and egress traffic stays bulk of the travel on the Microsoft global network. This routing is also known as cold potato routing. This option has a higher ingress/egress cost.\r\n\r\n- **Public Internet (ISP network)**: The new routing choice Internet routing minimizes travel on the Microsoft global network and uses the transit ISP network to route your traffic. This routing is also known as hot potato routing.\r\n\r\nFor more information about routing preference, see [What is routing preference?](https://learn.microsoft.com/en-us/azure/virtual-network/ip-services/ip-services-overview#routing-preference).\r\n\r\n",
+ "json": "# Routing Preference\r\n\r\nAzure routing preference enables you to choose how your traffic routes between Azure and the Internet. You can choose to route traffic either via the Microsoft network or via the ISP network (public internet). By default, traffic is routed via the Microsoft global network for all Azure services.\r\n\r\nRouting preference choices include:\r\n\r\n- **Microsoft Network**: Both ingress and egress traffic stays bulk of the travel on the Microsoft global network. This routing is also known as cold potato routing. This option has a higher ingress/egress cost.\r\n\r\n- **Public Internet (ISP network)**: The new routing choice Internet routing minimizes travel on the Microsoft global network and uses the transit ISP network to route your traffic. This routing is also known as hot potato routing.\r\n\r\nFor more information about routing preference, see [What is routing preference?](https://learn.microsoft.com/azure/virtual-network/ip-services/ip-services-overview#routing-preference).\r\n\r\n",
"style": "upsell"
},
"name": "text - 3"
@@ -1161,7 +1161,7 @@
"json": "# Recommendations for NAT Gateways\r\nReview idle NAT Gateways that have no subnet defined, as they may represent additional cost.\r\n",
"style": "upsell"
},
- "name": "Recommendations for idle virtualNetworkGateways"
+ "name": "Recommendations for idle NAT Gateway"
},
{
"type": 3,
@@ -1265,7 +1265,7 @@
{
"type": 1,
"content": {
- "json": "# Recommendations for Private DNS\r\nReview private DNS without [Virtual Network Links](https://learn.microsoft.com/en-us/azure/dns/private-dns-virtual-network-links).\r\n",
+ "json": "# Recommendations for Private DNS\r\nReview private DNS without [Virtual Network Links](https://learn.microsoft.com/azure/dns/private-dns-virtual-network-links).\r\n",
"style": "upsell"
},
"name": "Recommendations for idle private dns"
@@ -1370,7 +1370,7 @@
{
"type": 1,
"content": {
- "json": "# Recommendations for Private endpoints\r\nReview [Private Endpoints](https://learn.microsoft.com/en-us/azure/private-link/private-endpoint-overview) that are not connected to any resource.",
+ "json": "# Recommendations for Private endpoints\r\nReview [Private Endpoints](https://learn.microsoft.com/azure/private-link/private-endpoint-overview) that are not connected to any resource.",
"style": "upsell"
},
"name": "Recommendations for idle private endpoints"
@@ -1493,7 +1493,7 @@
{
"type": 1,
"content": {
- "json": "# Recommendations for Azure Firewall\r\n\r\n## Azure Firewall Premium SKU\r\nThis table identifies Azure Firewalls with Premium SKU and evaluates whether the associated policy incorporates premium-only features or not. If a Premium SKU Firewall lacks a policy with premium features, such as TLS or intrusion detection it will be shown here. To learn more about Azure Firewall skus, check this [SKU comparison table](https://learn.microsoft.com/en-us/azure/firewall/choose-firewall-sku). ",
+ "json": "# Recommendations for Azure Firewall\r\n\r\n## Azure Firewall Premium SKU\r\nThis table identifies Azure Firewalls with Premium SKU and evaluates whether the associated policy incorporates premium-only features or not. If a Premium SKU Firewall lacks a policy with premium features, such as TLS or intrusion detection it will be shown here. To learn more about Azure Firewall skus, check this [SKU comparison table](https://learn.microsoft.com/azure/firewall/choose-firewall-sku). ",
"style": "upsell"
},
"name": "Recommendations for premium Firewall"
@@ -1593,7 +1593,7 @@
{
"type": 1,
"content": {
- "json": "## Avoid multiple Firewall instances in the same region\r\nOptimize the use of Azure Firewall by having a central instance of Azure Firewall in the hub virtual network or Virtual WAN secure hub and share the same firewall across many spoke virtual networks that are connected to the same hub from the same region. Ensure there's no unexpected cross-region traffic as part of the hub-spoke topology nor multiple Azure firewall instances deployed to the same region. To learn more about Azure Firewall design principles, check [Azure Well-Architected Framework review - Azure Firewall](https://learn.microsoft.com/en-us/azure/well-architected/service-guides/azure-firewall#cost-optimization).",
+ "json": "## Avoid multiple Firewall instances in the same region\r\nOptimize the use of Azure Firewall by having a central instance of Azure Firewall in the hub virtual network or Virtual WAN secure hub and share the same firewall across many spoke virtual networks that are connected to the same hub from the same region. Ensure there's no unexpected cross-region traffic as part of the hub-spoke topology nor multiple Azure firewall instances deployed to the same region. To learn more about Azure Firewall design principles, check [Azure Well-Architected Framework review - Azure Firewall](https://learn.microsoft.com/azure/well-architected/service-guides/azure-firewall#cost-optimization).",
"style": "upsell"
},
"name": "text - 3"
@@ -1704,10 +1704,10 @@
{
"type": 1,
"content": {
- "json": "# Recommendations for Express Route\r\n\r\n## Express Route Gateways without a completed circuit (ISP has not completed the connection)\r\nThis table identifies Express Route circutis that have not been completed. ",
+ "json": "# Recommendations for ExpressRoute\r\n\r\nReview idle ExpressRoute circuits that has not been provisioned (service provider has not completed provisioning or has deprovisioned), as they may represent additional cost.",
"style": "upsell"
},
- "name": "Recommendations for premium Firewall"
+ "name": "Recommendations for ExpressRoute"
},
{
"type": 3,
@@ -1715,8 +1715,9 @@
"version": "KqlItem/1.0",
"query": "resources\r\n| where type =~ 'Microsoft.Network/expressRouteCircuits' and properties.serviceProviderProvisioningState == \"NotProvisioned\"\r\n| extend ServiceLocation=tostring(properties.serviceProviderProperties.peeringLocation), ServiceProvider=tostring(properties.serviceProviderProperties.serviceProviderName), BandwidthInMbps=tostring(properties.serviceProviderProperties.bandwidthInMbps)\r\n| project ERId=id,ERName = name, ERRG = resourceGroup, SKUName=tostring(sku.name), SKUTier=tostring(sku.tier), SKUFamily=tostring(sku.family), ERLocation = location, ServiceLocation, ServiceProvider, BandwidthInMbps\r\n| join kind = innerunique(\r\n resources\r\n | extend replaced_tags = replace('{}', 'null', tostring(tags))\r\n | extend replaced_tags = parse_json(replaced_tags)\r\n | mv-expand replaced_tags\r\n | extend tagName = tostring(bag_keys(replaced_tags)[0])\r\n | extend tagValue = tostring(replaced_tags['{TagName}'])\r\n | where tagName has '{TagName}' and tagValue has '{TagValue}'\r\n | extend ERId=id\r\n | distinct ERId\r\n )\r\n on ERId\r\n\r\n",
"size": 0,
- "title": "Idle Express Route circuits",
- "noDataMessage": "No idle Express Route circuit found",
+ "title": "Idle ExpressRoute circuits",
+ "noDataMessage": "No idle ExpressRoute circuits found",
+
"noDataMessageStyle": 3,
"showExportToExcel": true,
"queryType": 1,
@@ -1734,11 +1735,11 @@
"labelSettings": [
{
"columnId": "ERId",
- "label": "Express Route ID"
+ "label": "ExpressRoute ID"
},
{
"columnId": "ERName",
- "label": "E.R. Name"
+ "label": "ER Name"
},
{
"columnId": "ERRG",
@@ -1775,7 +1776,7 @@
]
}
},
- "name": "Idle Express Route circuits"
+ "name": "Idle ExpressRoute circuits"
}
]
},
@@ -1784,7 +1785,7 @@
"comparison": "isEqualTo",
"value": "ER"
},
- "name": "Express Route Group"
+ "name": "ExpressRoute Group"
}
]
},
@@ -1803,4 +1804,4 @@
"Azure Monitor"
],
"$schema": "https://github.com/Microsoft/Application-Insights-Workbooks/blob/master/schema/workbook.json"
-}
\ No newline at end of file
+}
diff --git a/Workbooks/Azure Advisor/Cost Optimization/Reservations Preview/ReservationsPreview.workbook b/Workbooks/Azure Advisor/Cost Optimization/Reservations Preview/ReservationsPreview.workbook
new file mode 100644
index 0000000000..e0d4e90156
--- /dev/null
+++ b/Workbooks/Azure Advisor/Cost Optimization/Reservations Preview/ReservationsPreview.workbook
@@ -0,0 +1,604 @@
+{
+ "version": "Notebook/1.0",
+ "items": [
+ {
+ "type": 12,
+ "content": {
+ "version": "NotebookGroup/1.0",
+ "groupType": "editable",
+ "items": [
+ {
+ "type": 9,
+ "content": {
+ "version": "KqlParameterItem/1.0",
+ "parameters": [
+ {
+ "id": "f2bb2b02-9187-4209-9fb8-eb99c60d9c9d",
+ "version": "KqlParameterItem/1.0",
+ "name": "agreementType",
+ "label": "Agreement Type",
+ "type": 10,
+ "isRequired": true,
+ "typeSettings": {
+ "additionalResourceOptions": [],
+ "showDefault": false
+ },
+ "jsonData": "[\r\n {\r\n \"value\" : \"MCA\",\r\n \"label\" : \"Microsoft Customer Agreement (MCA)\"\r\n },\r\n {\r\n \"value\" : \"EA\",\r\n \"label\" : \"Microsoft Enterprise Agreement (EA)\"\r\n }\r\n]",
+ "timeContext": {
+ "durationMs": 86400000
+ },
+ "value": "EA"
+ }
+ ],
+ "style": "pills",
+ "queryType": 0,
+ "resourceType": "microsoft.operationalinsights/workspaces"
+ },
+ "name": "parameters - 0"
+ },
+ {
+ "type": 9,
+ "content": {
+ "version": "KqlParameterItem/1.0",
+ "parameters": [
+ {
+ "id": "1007cfd0-3554-41ea-8e8c-e04d4f67add4",
+ "version": "KqlParameterItem/1.0",
+ "name": "billingAccount",
+ "label": "Billing Account",
+ "type": 2,
+ "isRequired": true,
+ "query": "{\"version\":\"ARMEndpoint/1.0\",\"data\":null,\"headers\":[],\"method\":\"GET\",\"path\":\"/providers/Microsoft.Billing/billingAccounts\",\"urlParams\":[{\"key\":\"api-version\",\"value\":\"2019-10-01-preview\"}],\"batchDisabled\":false,\"transformers\":[{\"type\":\"jsonpath\",\"settings\":{\"tablePath\":\"$.value\",\"columns\":[{\"path\":\"name\",\"columnid\":\"billingAccount\"},{\"path\":\"properties.displayName\",\"columnid\":\"Displayname\"}]}}]}",
+ "typeSettings": {
+ "additionalResourceOptions": [],
+ "showDefault": false
+ },
+ "timeContext": {
+ "durationMs": 86400000
+ },
+ "queryType": 12,
+ "value": "8611537"
+ },
+ {
+ "id": "38d70cdc-7667-44d8-8a05-f1384c8a92a2",
+ "version": "KqlParameterItem/1.0",
+ "name": "lookBackPeriod",
+ "label": "Look back period",
+ "type": 2,
+ "isRequired": true,
+ "typeSettings": {
+ "additionalResourceOptions": [],
+ "showDefault": false
+ },
+ "jsonData": "[\r\n {\r\n \"value\" : \"Last7Days\",\r\n \"label\" : \"Last 7 Days\"\r\n },\r\n {\r\n \"value\" : \"Last30Days\",\r\n \"label\" : \"Last 30 Days\",\r\n \"selected\" : true\r\n },\r\n {\r\n \"value\" : \"Last60Days\",\r\n \"label\" : \"Last 60 Days\"\r\n }\r\n]",
+ "timeContext": {
+ "durationMs": 86400000
+ },
+ "value": "Last60Days"
+ },
+ {
+ "id": "9892e53b-bda1-4cb6-a3a1-25de058c4484",
+ "version": "KqlParameterItem/1.0",
+ "name": "scope",
+ "label": "Scope",
+ "type": 10,
+ "isRequired": true,
+ "typeSettings": {
+ "additionalResourceOptions": [],
+ "showDefault": false
+ },
+ "jsonData": "[\r\n {\r\n \"value\": \"properties/scope eq 'Single'\",\r\n \"label\" : \"Single\",\r\n \"selected\": true\r\n },\r\n {\r\n \"value\": \"properties/scope eq 'Shared'\",\r\n \"label\" : \"Shared\",\r\n \"selected\": true\r\n }\r\n\r\n]",
+ "value": "properties/scope eq 'Shared'"
+ },
+ {
+ "version": "KqlParameterItem/1.0",
+ "name": "term",
+ "label": "Term",
+ "type": 10,
+ "isRequired": true,
+ "typeSettings": {
+ "additionalResourceOptions": [],
+ "showDefault": false
+ },
+ "jsonData": "[\r\n {\r\n \"value\": \"properties/term eq 'P1Y'\",\r\n \"label\" : \"1Y\",\r\n \"selected\": true\r\n },\r\n {\r\n \"value\": \"properties/term eq 'P3Y'\",\r\n \"label\" : \"3Y\",\r\n \"selected\": true\r\n }\r\n\r\n]",
+ "value": "properties/term eq 'P3Y'",
+ "id": "6850fde5-30c4-49f1-91c2-4ce150778c18"
+ }
+ ],
+ "style": "pills",
+ "queryType": 0,
+ "resourceType": "microsoft.operationalinsights/workspaces"
+ },
+ "name": "parameters - 3"
+ },
+ {
+ "type": 9,
+ "content": {
+ "version": "KqlParameterItem/1.0",
+ "parameters": [
+ {
+ "id": "78948283-c135-4603-b506-a0271660ae26",
+ "version": "KqlParameterItem/1.0",
+ "name": "billingProfile",
+ "label": "Billing profile",
+ "type": 2,
+ "isRequired": true,
+ "query": "{\"version\":\"ARMEndpoint/1.0\",\"data\":null,\"headers\":[],\"method\":\"GET\",\"path\":\"/providers/Microsoft.Billing/billingAccounts/{billingAccount}/billingProfiles\",\"urlParams\":[{\"key\":\"api-version\",\"value\":\"2020-05-01\"}],\"batchDisabled\":false,\"transformers\":[{\"type\":\"jsonpath\",\"settings\":{\"tablePath\":\"$.value\",\"columns\":[{\"path\":\"name\",\"columnid\":\"Name\"},{\"path\":\"properties.displayName\",\"columnid\":\"DisplayName\"}]}}]}",
+ "typeSettings": {
+ "additionalResourceOptions": [],
+ "showDefault": false
+ },
+ "timeContext": {
+ "durationMs": 86400000
+ },
+ "queryType": 12,
+ "value": null
+ }
+ ],
+ "style": "pills",
+ "queryType": 12
+ },
+ "conditionalVisibility": {
+ "parameterName": "agreementType",
+ "comparison": "isEqualTo",
+ "value": "MCA"
+ },
+ "name": "parameters - billingProfile"
+ },
+ {
+ "type": 11,
+ "content": {
+ "version": "LinkItem/1.0",
+ "style": "tabs",
+ "links": [
+ {
+ "id": "3122e083-af17-48c5-af19-b2dde9e55214",
+ "cellValue": "SelectedSubTab",
+ "linkTarget": "parameter",
+ "linkLabel": "Reservations Recommendations",
+ "subTarget": "riRecommendations",
+ "style": "link"
+ }
+ ]
+ },
+ "conditionalVisibility": {
+ "parameterName": "SelectedTab",
+ "comparison": "isEqualTo",
+ "value": "reservations"
+ },
+ "name": "Subtabs - Reservations"
+ },
+ {
+ "type": 12,
+ "content": {
+ "version": "NotebookGroup/1.0",
+ "groupType": "editable",
+ "items": [
+ {
+ "type": 1,
+ "content": {
+ "json": "## Reservation Recommendations - Overview"
+ },
+ "name": "reservationOverviewText"
+ },
+ {
+ "type": 1,
+ "content": {
+ "json": "## Important Information - This tab is under preview and requires different permissions.\r\n\r\n**Note:** This tab is currently in preview and requires a different set of permissions compared to the previous tab. Ensure you have the necessary permissions listed above to access the preview features.",
+ "style": "success"
+ },
+ "name": "Preview Info text"
+ },
+ {
+ "type": 1,
+ "content": {
+ "json": "## RBAC Needed\r\n\r\nThis tab displays various reservations-related details. To access the information on this tab, ensure you have the following minimum RBAC permissions:\r\n\r\n* **For Enterprise Admin (EA) Customers:** Enterprise Administrator (read-only) or EA Purchaser. Learn more about setting up these permissions here: [Organization Structure and Permissions by Role](https://learn.microsoft.com/azure/cost-management-billing/manage/understand-ea-roles#organization-structure-and-permissions-by-role).\r\n\r\n* **For Microsoft Customer Agreement (MCA) Customers:** Billing Profile Reader. Learn more about setting up these permissions here: [Billing Profile Roles and Tasks](https://learn.microsoft.com/azure/cost-management-billing/manage/understand-mca-roles#billing-profile-roles-and-tasks).\r\n",
+ "style": "warning"
+ },
+ "name": "rbacText"
+ },
+ {
+ "type": 9,
+ "content": {
+ "version": "KqlParameterItem/1.0",
+ "parameters": [
+ {
+ "id": "5c5c1817-4ccf-438d-a1b4-08ea4451438b",
+ "version": "KqlParameterItem/1.0",
+ "name": "resourceType",
+ "label": "Resource type",
+ "type": 10,
+ "isRequired": true,
+ "typeSettings": {
+ "additionalResourceOptions": []
+ },
+ "jsonData": "[\r\n {\r\n \"value\" : \"properties/resourceType eq 'VirtualMachines'\",\r\n \"label\" : \"VirtualMachines\",\r\n \"selected\": true\r\n },\r\n {\r\n \"value\" : \"properties/resourceType eq 'SQLDatabases'\",\r\n \"label\" : \"SQLDatabases\"\r\n },\r\n {\r\n \"value\" : \"properties/resourceType eq 'PostgreSQL'\",\r\n \"label\" : \"PostgreSQL\"\r\n },\r\n {\r\n \"value\" : \"properties/resourceType eq 'ManagedDisk'\",\r\n \"label\" : \"ManagedDisk\"\r\n },\r\n {\r\n \"value\" : \"properties/resourceType eq 'MySQL'\",\r\n \"label\" : \"MySQL\"\r\n },\r\n {\r\n \"value\" : \"properties/resourceType eq 'RedHat'\",\r\n \"label\" : \"RedHat\"\r\n },\r\n {\r\n \"value\" : \"properties/resourceType eq 'MariaDB'\",\r\n \"label\" : \"MariaDB\"\r\n },\r\n {\r\n \"value\" : \"properties/resourceType eq 'RedisCache'\",\r\n \"label\" : \"RedisCache\"\r\n },\r\n {\r\n \"value\" : \"properties/resourceType eq 'CosmosDB'\",\r\n \"label\" : \"CosmosDB\"\r\n },\r\n {\r\n \"value\" : \"properties/resourceType eq 'CosmosDB'\",\r\n \"label\" : \"CosmosDB\"\r\n },\r\n {\r\n \"value\" : \"properties/resourceType eq 'SUSELinux'\",\r\n \"label\" : \"SUSELinux\"\r\n },\r\n {\r\n \"value\" : \"properties/resourceType eq 'AppService'\",\r\n \"label\" : \"AppService\"\r\n },\r\n {\r\n \"value\" : \"properties/resourceType eq 'BlockBlob'\",\r\n \"label\" : \"BlockBlob\"\r\n },\r\n {\r\n \"value\" : \"properties/resourceType eq 'AzureDataExplorer'\",\r\n \"label\" : \"AzureDataExplorer\"\r\n },\r\n {\r\n \"value\" : \"properties/resourceType eq 'VMwareCloudSimple'\",\r\n \"label\" : \"VMwareCloudSimple\"\r\n }\r\n]",
+ "timeContext": {
+ "durationMs": 86400000
+ }
+ }
+ ],
+ "style": "pills",
+ "queryType": 0,
+ "resourceType": "microsoft.operationalinsights/workspaces"
+ },
+ "name": "paramResourceType"
+ },
+ {
+ "type": 12,
+ "content": {
+ "version": "NotebookGroup/1.0",
+ "groupType": "editable",
+ "items": [
+ {
+ "type": 1,
+ "content": {
+ "json": "## Reservation Recommendations - Microsoft Customer Agreement (MCA)"
+ },
+ "name": "reservationOverviewText-MCA"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "{\"version\":\"ARMEndpoint/1.0\",\"data\":null,\"headers\":[],\"method\":\"GET\",\"path\":\"/providers/Microsoft.Billing/billingAccounts/{billingAccount}/billingProfiles/{billingProfile}/providers/Microsoft.Consumption/reservationRecommendations?$filter=properties/lookBackPeriod eq '{lookBackPeriod}' AND {resourceType:escapejson} AND {scope:escapejson} \",\"urlParams\":[{\"key\":\"api-version\",\"value\":\"2021-10-01\"}],\"batchDisabled\":false,\"transformers\":[{\"type\":\"jsonpath\",\"settings\":{\"tablePath\":\"$.value\",\"columns\":[{\"path\":\"properties.term\",\"columnid\":\"Term\"},{\"path\":\"properties.scope\",\"columnid\":\"Scope\"},{\"path\":\"properties.subscriptionId\",\"columnid\":\"Subscription\"},{\"path\":\"properties.skuName\",\"columnid\":\"SKU\"},{\"path\":\"properties.location\",\"columnid\":\"Location\"},{\"path\":\"properties.recommendedQuantity\",\"columnid\":\"Quantity\"},{\"path\":\"properties.costWithNoReservedInstances.value\",\"columnid\":\"CostWithoutRI\"},{\"path\":\"properties.totalCostWithReservedInstances.value\",\"columnid\":\"CostWithRI\"},{\"path\":\"properties.netSavings.vlaue\",\"columnid\":\"Savings\"},{\"path\":\"properties.lookBackPeriod\",\"columnid\":\"LookBackPeriod\"}]}}]}",
+ "size": 0,
+ "title": "Reservations recommendations",
+ "queryType": 12,
+ "gridSettings": {
+ "filter": true
+ }
+ },
+ "conditionalVisibility": {
+ "parameterName": "isVisible",
+ "comparison": "isEqualTo",
+ "value": "true"
+ },
+ "name": "query - reservationRecommendations-MCA",
+ "styleSettings": {
+ "showBorder": true
+ }
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "{\"version\":\"Merge/1.0\",\"merges\":[{\"id\":\"06a2581c-98e0-4a40-a99e-45ea9b8f116f\",\"mergeType\":\"table\",\"leftTable\":\"query - reservationRecommendations-MCA\"}],\"projectRename\":[{\"originalName\":\"[query - reservationRecommendations-MCA].Term\",\"mergedName\":\"Term\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f116f\"},{\"originalName\":\"[query - reservationRecommendations-MCA].Scope\",\"mergedName\":\"Scope\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f116f\"},{\"originalName\":\"[query - reservationRecommendations-MCA].Subscription\",\"mergedName\":\"Subscription\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f116f\"},{\"originalName\":\"[query - reservationRecommendations-MCA].SKU\",\"mergedName\":\"SKU\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f116f\"},{\"originalName\":\"[query - reservationRecommendations-MCA].Location\",\"mergedName\":\"Location\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f116f\"},{\"originalName\":\"[query - reservationRecommendations-MCA].Quantity\",\"mergedName\":\"Quantity\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f116f\"},{\"originalName\":\"[query - reservationRecommendations-MCA].CostWithoutRI\",\"mergedName\":\"CostWithoutRI\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f116f\"},{\"originalName\":\"[query - reservationRecommendations-MCA].CostWithRI\",\"mergedName\":\"CostWithRI\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f116f\"},{\"originalName\":\"[query - reservationRecommendations-MCA].Savings\",\"mergedName\":\"Savings\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f116f\"},{\"originalName\":\"[Added column]\",\"mergedName\":\"Breakeven point (Months)\",\"fromId\":null,\"isNewItem\":true,\"newItemData\":[{\"criteriaContext\":{\"leftOperand\":\"Term\",\"operator\":\"==\",\"rightValType\":\"static\",\"rightVal\":\"P1Y\",\"resultValType\":\"expression\",\"resultVal\":\"round([\\\"CostWithRI\\\"]*12/[\\\"CostWithoutRI\\\"],0)\"}},{\"criteriaContext\":{\"leftOperand\":\"Term\",\"operator\":\"==\",\"rightValType\":\"static\",\"rightVal\":\"P3Y\",\"resultValType\":\"expression\",\"resultVal\":\"round([\\\"CostWithRI\\\"]*12*3/[\\\"CostWithoutRI\\\"],0)\"}},{\"criteriaContext\":{\"operator\":\"Default\",\"rightValType\":\"column\",\"resultValType\":\"column\"}}]},{\"originalName\":\"[query - reservationRecommendations-MCA].LookBackPeriod\",\"mergedName\":\"LookBackPeriod\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f116f\"}]}",
+ "size": 0,
+ "showRefreshButton": true,
+ "showExportToExcel": true,
+ "queryType": 7
+ },
+ "name": "reservationRecommendations-MCA-MERGE",
+ "styleSettings": {
+ "showBorder": true
+ }
+ }
+ ]
+ },
+ "conditionalVisibilities": [
+ {
+ "parameterName": "agreementType",
+ "comparison": "isEqualTo",
+ "value": "MCA"
+ },
+ {
+ "parameterName": "billingAccount",
+ "comparison": "isNotEqualTo"
+ }
+ ],
+ "name": "group - MCA"
+ },
+ {
+ "type": 12,
+ "content": {
+ "version": "NotebookGroup/1.0",
+ "groupType": "editable",
+ "loadType": "explicit",
+ "items": [
+ {
+ "type": 1,
+ "content": {
+ "json": "## Reservation Recommendations - Enterprise Admin (EA)"
+ },
+ "name": "reservationOverviewText-EA"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "{\"version\":\"ARMEndpoint/1.0\",\"data\":null,\"headers\":[],\"method\":\"GET\",\"path\":\"/providers/Microsoft.Billing/billingAccounts/{billingAccount}//providers/Microsoft.Consumption/reservationRecommendations?$filter=properties/lookBackPeriod eq '{lookBackPeriod}' AND {resourceType:escapejson} AND {scope:escapejson} AND {term:escapejson}\",\"urlParams\":[{\"key\":\"api-version\",\"value\":\"2021-10-01\"}],\"batchDisabled\":false,\"transformers\":[{\"type\":\"jsonpath\",\"settings\":{\"tablePath\":\"$.value\",\"columns\":[{\"path\":\"properties.term\",\"columnid\":\"Term\"},{\"path\":\"properties.scope\",\"columnid\":\"Scope\"},{\"path\":\"properties.subscriptionId\",\"columnid\":\"Subscription\"},{\"path\":\"sku\",\"columnid\":\"SKU\"},{\"path\":\"location\",\"columnid\":\"Location\"},{\"path\":\"properties.recommendedQuantity\",\"columnid\":\"Quantity\"},{\"path\":\"properties.costWithNoReservedInstances\",\"columnid\":\"CostWithoutRI\"},{\"path\":\"properties.totalCostWithReservedInstances\",\"columnid\":\"CostWithRI\"},{\"path\":\"properties.netSavings\",\"columnid\":\"Savings\"},{\"path\":\"properties.lookBackPeriod\",\"columnid\":\"LookBackPeriod\"}]}}]}",
+ "size": 0,
+ "title": "Reservations recommendations",
+ "noDataMessage": "No reservation recommendations found!",
+ "showExportToExcel": true,
+ "queryType": 12,
+ "gridSettings": {
+ "rowLimit": 10000,
+ "filter": true
+ }
+ },
+ "conditionalVisibility": {
+ "parameterName": "isVisible",
+ "comparison": "isEqualTo",
+ "value": "true"
+ },
+ "name": "query - reservationRecommendations-EA"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "ResourceContainers \r\n| where type =~ 'Microsoft.Resources/subscriptions'\r\n| project SubscriptionName = name, subscriptionId ",
+ "size": 0,
+ "queryType": 1,
+ "resourceType": "microsoft.resourcegraph/resources",
+ "crossComponentResources": [
+ "value::all"
+ ],
+ "gridSettings": {
+ "rowLimit": 10000,
+ "filter": true
+ }
+ },
+ "conditionalVisibility": {
+ "parameterName": "AlwaysHidden",
+ "comparison": "isEqualTo",
+ "value": "True"
+ },
+ "name": "SubNameMapping-Hidden"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "{\"version\":\"Merge/1.0\",\"merges\":[{\"id\":\"06a2581c-98e0-4a40-a99e-45ea9b8f12ad\",\"mergeType\":\"table\",\"leftTable\":\"query - reservationRecommendations-EA\"}],\"projectRename\":[{\"originalName\":\"[query - reservationRecommendations].Term\",\"mergedName\":\"Term\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f12ad\"},{\"originalName\":\"[query - reservationRecommendations].Scope\",\"mergedName\":\"Scope\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f12ad\"},{\"originalName\":\"[query - reservationRecommendations].Subscription\",\"mergedName\":\"Subscription\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f12ad\"},{\"originalName\":\"[query - reservationRecommendations].SKU\",\"mergedName\":\"SKU\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f12ad\"},{\"originalName\":\"[query - reservationRecommendations].Location\",\"mergedName\":\"Location\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f12ad\"},{\"originalName\":\"[query - reservationRecommendations].Quantity\",\"mergedName\":\"Quantity\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f12ad\"},{\"originalName\":\"[query - reservationRecommendations].CostWithoutRI\",\"mergedName\":\"CostWithoutRI\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f12ad\"},{\"originalName\":\"[query - reservationRecommendations].CostWithRI\",\"mergedName\":\"CostWithRI\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f12ad\"},{\"originalName\":\"[query - reservationRecommendations].Savings\",\"mergedName\":\"Savings\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f12ad\"},{\"originalName\":\"[query - reservationRecommendations].LookBackPeriod\",\"mergedName\":\"LookBackPeriod\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f12ad\"},{\"originalName\":\"[query - reservationRecommendations-EA].Term\",\"mergedName\":\"Term\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - reservationRecommendations-EA].Scope\",\"mergedName\":\"Scope\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - reservationRecommendations-EA].Subscription\",\"mergedName\":\"Subscription\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - reservationRecommendations-EA].SKU\",\"mergedName\":\"SKU\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - reservationRecommendations-EA].Location\",\"mergedName\":\"Location\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - reservationRecommendations-EA].Quantity\",\"mergedName\":\"Quantity\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - reservationRecommendations-EA].CostWithoutRI\",\"mergedName\":\"CostWithoutRI\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - reservationRecommendations-EA].CostWithRI\",\"mergedName\":\"CostWithRI\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - reservationRecommendations-EA].Savings\",\"mergedName\":\"Savings\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - reservationRecommendations-EA].LookBackPeriod\",\"mergedName\":\"LookBackPeriod\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - reservationRecommendations-EA].value\",\"mergedName\":\"value\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - reservationRecommendations-EA].defaultVisualization\",\"mergedName\":\"defaultVisualization\",\"fromId\":\"unknown\"}]}",
+ "size": 0,
+ "aggregation": 5,
+ "title": "Top savings by Sku",
+ "showRefreshButton": true,
+ "showExportToExcel": true,
+ "queryType": 7,
+ "visualization": "barchart",
+ "chartSettings": {
+ "xAxis": "SKU",
+ "yAxis": [
+ "Savings"
+ ],
+ "group": "SKU",
+ "createOtherGroup": 50,
+ "showLegend": true,
+ "ySettings": {
+ "numberFormatSettings": {
+ "unit": 0,
+ "options": {
+ "style": "decimal",
+ "useGrouping": true,
+ "maximumFractionDigits": 2
+ }
+ }
+ }
+ }
+ },
+ "showPin": false,
+ "name": "query - SavingsChart",
+ "styleSettings": {
+ "showBorder": true
+ }
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "{\"version\":\"Merge/1.0\",\"merges\":[{\"id\":\"06a2581c-98e0-4a40-a99e-45ea9b8f10de\",\"mergeType\":\"leftouter\",\"leftTable\":\"query - reservationRecommendations-EA\",\"rightTable\":\"SubNameMapping-Hidden\",\"leftColumn\":\"Subscription\",\"rightColumn\":\"subscriptionId\"}],\"projectRename\":[{\"originalName\":\"SubscriptionName\",\"mergedName\":\"SubscriptionName\",\"fromId\":\"unknown\"},{\"originalName\":\"[SubNameMapping-Hidden].SubscriptionName\",\"mergedName\":\"SubscriptionName1\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f10de\"},{\"originalName\":\"[query - reservationRecommendations].LookBackPeriod\",\"mergedName\":\"LookBackPeriod\",\"fromId\":\"unknown\"},{\"originalName\":\"subscriptionId\",\"mergedName\":\"subscriptionId\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - reservationRecommendations].Term\",\"mergedName\":\"Term\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f10de\"},{\"originalName\":\"[query - reservationRecommendations].Scope\",\"mergedName\":\"Scope\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f10de\"},{\"originalName\":\"[query - reservationRecommendations].Subscription\",\"mergedName\":\"Subscription\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f10de\"},{\"originalName\":\"[query - reservationRecommendations].SKU\",\"mergedName\":\"SKU\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f10de\"},{\"originalName\":\"[Added column]\",\"mergedName\":\"Breakeven point (Months)\",\"fromId\":null,\"isNewItem\":true,\"newItemData\":[{\"criteriaContext\":{\"leftOperand\":\"Term\",\"operator\":\"==\",\"rightValType\":\"static\",\"rightVal\":\"P1Y\",\"resultValType\":\"expression\",\"resultVal\":\"round([\\\"CostWithRI\\\"]*12/[\\\"CostWithoutRI\\\"],0)\"}},{\"criteriaContext\":{\"leftOperand\":\"Term\",\"operator\":\"==\",\"rightValType\":\"static\",\"rightVal\":\"P3Y\",\"resultValType\":\"expression\",\"resultVal\":\"round([\\\"CostWithRI\\\"]*12*3/[\\\"CostWithoutRI\\\"],0)\"}},{\"criteriaContext\":{\"operator\":\"Default\",\"rightValType\":\"column\",\"resultValType\":\"column\"}}]},{\"originalName\":\"[query - reservationRecommendations].Location\",\"mergedName\":\"Location\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f10de\"},{\"originalName\":\"[query - reservationRecommendations].Quantity\",\"mergedName\":\"Quantity\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f10de\"},{\"originalName\":\"[query - reservationRecommendations].CostWithoutRI\",\"mergedName\":\"CostWithoutRI\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f10de\"},{\"originalName\":\"[query - reservationRecommendations].CostWithRI\",\"mergedName\":\"CostWithRI\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f10de\"},{\"originalName\":\"[query - reservationRecommendations].Savings\",\"mergedName\":\"Savings\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f10de\"},{\"originalName\":\"[SubNameMapping-Hidden].subscriptionId\",\"mergedName\":\"subscriptionId1\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f10de\"},{\"originalName\":\"[query - reservationRecommendations-EA].Term\",\"mergedName\":\"Term\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - reservationRecommendations-EA].Scope\",\"mergedName\":\"Scope\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - reservationRecommendations-EA].Subscription\",\"mergedName\":\"Subscription\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - reservationRecommendations-EA].SKU\",\"mergedName\":\"SKU\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - reservationRecommendations-EA].Location\",\"mergedName\":\"Location\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - reservationRecommendations-EA].Quantity\",\"mergedName\":\"Quantity\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - reservationRecommendations-EA].CostWithoutRI\",\"mergedName\":\"CostWithoutRI\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - reservationRecommendations-EA].CostWithRI\",\"mergedName\":\"CostWithRI\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - reservationRecommendations-EA].Savings\",\"mergedName\":\"Savings\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - reservationRecommendations-EA].LookBackPeriod\",\"mergedName\":\"LookBackPeriod\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - Get All subscriptions].zones\"},{\"originalName\":\"[query - Get All subscriptions].identity\"},{\"originalName\":\"[query - Get All subscriptions].tags\"},{\"originalName\":\"[query - Get All subscriptions].properties\"},{\"originalName\":\"[query - Get All subscriptions].plan\"},{\"originalName\":\"[query - Get All subscriptions].sku\"},{\"originalName\":\"[query - Get All subscriptions].managedBy\"},{\"originalName\":\"[query - Get All subscriptions].resourceGroup\"},{\"originalName\":\"[query - Get All subscriptions].location\"},{\"originalName\":\"[query - Get All subscriptions].kind\"},{\"originalName\":\"[query - Get All subscriptions].tenantId\"},{\"originalName\":\"[query - Get All subscriptions].type\"},{\"originalName\":\"[query - Get All subscriptions].subscriptionId\"},{\"originalName\":\"[query - Get All subscriptions].extendedLocation\"},{\"originalName\":\"[query - Get All subscriptions].name\"},{\"originalName\":\"[query - Get All subscriptions].id\"}]}",
+ "size": 0,
+ "title": "Reservations recommendations",
+ "showRefreshButton": true,
+ "showExportToExcel": true,
+ "queryType": 7,
+ "gridSettings": {
+ "formatters": [
+ {
+ "columnMatch": "SubscriptionName1",
+ "formatter": 5
+ },
+ {
+ "columnMatch": "subscriptionId1",
+ "formatter": 5,
+ "formatOptions": {
+ "linkTarget": "Resource",
+ "linkIsContextBlade": true,
+ "customColumnWidthSetting": "37ch"
+ }
+ },
+ {
+ "columnMatch": "Scope",
+ "formatter": 0,
+ "formatOptions": {
+ "customColumnWidthSetting": "12ch"
+ }
+ },
+ {
+ "columnMatch": "Subscription",
+ "formatter": 15,
+ "formatOptions": {
+ "linkTarget": null,
+ "showIcon": true
+ }
+ },
+ {
+ "columnMatch": "SKU",
+ "formatter": 0,
+ "formatOptions": {
+ "customColumnWidthSetting": "18ch"
+ }
+ },
+ {
+ "columnMatch": "Location",
+ "formatter": 0,
+ "formatOptions": {
+ "customColumnWidthSetting": "13.7143ch"
+ }
+ },
+ {
+ "columnMatch": "Quantity",
+ "formatter": 0,
+ "formatOptions": {
+ "customColumnWidthSetting": "13.2857ch"
+ }
+ },
+ {
+ "columnMatch": "Breakeven point (Months)",
+ "formatter": 0,
+ "formatOptions": {
+ "customColumnWidthSetting": "27.4286ch"
+ }
+ },
+ {
+ "columnMatch": "CostWithoutRI",
+ "formatter": 0,
+ "formatOptions": {
+ "customColumnWidthSetting": "19.4286ch"
+ },
+ "numberFormat": {
+ "unit": 0,
+ "options": {
+ "style": "decimal",
+ "useGrouping": true,
+ "maximumFractionDigits": 2
+ }
+ }
+ },
+ {
+ "columnMatch": "CostWithRI",
+ "formatter": 0,
+ "formatOptions": {
+ "aggregation": "Sum",
+ "customColumnWidthSetting": "15.8571ch"
+ },
+ "numberFormat": {
+ "unit": 0,
+ "options": {
+ "style": "decimal",
+ "useGrouping": true,
+ "maximumFractionDigits": 2
+ }
+ }
+ },
+ {
+ "columnMatch": "Savings",
+ "formatter": 0,
+ "formatOptions": {
+ "customColumnWidthSetting": "16.1429ch"
+ },
+ "numberFormat": {
+ "unit": 0,
+ "options": {
+ "style": "decimal",
+ "useGrouping": true,
+ "maximumFractionDigits": 2
+ }
+ }
+ },
+ {
+ "columnMatch": "LookBackPeriod",
+ "formatter": 0,
+ "formatOptions": {
+ "customColumnWidthSetting": "21ch"
+ }
+ }
+ ],
+ "rowLimit": 10000,
+ "filter": true,
+ "labelSettings": [
+ {
+ "columnId": "SubscriptionName1",
+ "label": "Subscription Name"
+ },
+ {
+ "columnId": "subscriptionId1",
+ "label": "Subscription Id"
+ },
+ {
+ "columnId": "Term",
+ "label": "Term"
+ },
+ {
+ "columnId": "Scope",
+ "label": "Scope"
+ },
+ {
+ "columnId": "SKU",
+ "label": "SKU"
+ },
+ {
+ "columnId": "Location",
+ "label": "Location"
+ },
+ {
+ "columnId": "Quantity",
+ "label": "Quantity"
+ },
+ {
+ "columnId": "Breakeven point (Months)",
+ "label": "Breakeven point (Months)"
+ },
+ {
+ "columnId": "CostWithoutRI",
+ "label": "Cost Without RI"
+ },
+ {
+ "columnId": "CostWithRI",
+ "label": "Cost With RI"
+ },
+ {
+ "columnId": "Savings",
+ "label": "Savings"
+ },
+ {
+ "columnId": "LookBackPeriod",
+ "label": "Lookback Period"
+ }
+ ]
+ },
+ "sortBy": []
+ },
+ "name": "query - Reservations recommendations",
+ "styleSettings": {
+ "showBorder": true
+ }
+ }
+ ]
+ },
+ "conditionalVisibilities": [
+ {
+ "parameterName": "agreementType",
+ "comparison": "isEqualTo",
+ "value": "EA"
+ },
+ {
+ "parameterName": "billingAccount",
+ "comparison": "isNotEqualTo"
+ }
+ ],
+ "name": "group - EA"
+ }
+ ]
+ },
+ "conditionalVisibility": {
+ "parameterName": "SelectedSubTab",
+ "comparison": "isEqualTo",
+ "value": "riRecommendations"
+ },
+ "name": "Group Reservations Recommendations"
+ }
+ ]
+ },
+ "name": "group - 0"
+ }
+ ],
+ "fallbackResourceIds": [
+ "Azure Monitor"
+ ],
+ "$schema": "https://github.com/Microsoft/Application-Insights-Workbooks/blob/master/schema/workbook.json"
+}
\ No newline at end of file
diff --git a/Workbooks/Azure Advisor/Cost Optimization/Reservations/Reservations.workbook b/Workbooks/Azure Advisor/Cost Optimization/Reservations/Reservations.workbook
index 192a42f075..d0019423a9 100644
--- a/Workbooks/Azure Advisor/Cost Optimization/Reservations/Reservations.workbook
+++ b/Workbooks/Azure Advisor/Cost Optimization/Reservations/Reservations.workbook
@@ -10,7 +10,7 @@
{
"type": 1,
"content": {
- "json": "**Reserved instances** can provide a significant discount over on-demand prices. With reserved instances, you can pre-purchase the base costs for your virtual machines. \r\n
Discounts will automatically apply to new or existing VMs that have the same size and region as your reserved instance.
We analyzed your usage over selected Term, look-back period and recommend money-saving reserved instances.\r\n
This query will only provide you recommendations for single scope reserved instances. *To learn more about Reserved Instances, go to this [link.](https://learn.microsoft.com/en-us/azure/cost-management-billing/manage/understand-vm-reservation-charges)*",
+ "json": "**Reserved instances** can provide a significant discount over on-demand prices. With reserved instances, you can pre-purchase the base costs for your virtual machines. \r\n
Discounts will automatically apply to new or existing VMs that have the same size and region as your reserved instance.
We analyzed your usage over selected Term, look-back period and recommend money-saving reserved instances.\r\n
This query will only provide you recommendations for single scope reserved instances. *To learn more about Reserved Instances, go to this [link.](https://learn.microsoft.com/azure/cost-management-billing/manage/understand-vm-reservation-charges)*",
"style": "info"
},
"name": "text - advisorReservationdDisclaimer"
diff --git a/Workbooks/Azure Advisor/Cost Optimization/SavingsPlan/SavingsPlan.workbook b/Workbooks/Azure Advisor/Cost Optimization/SavingsPlan/SavingsPlan.workbook
index ddf617b8fd..4a2ed55b76 100644
--- a/Workbooks/Azure Advisor/Cost Optimization/SavingsPlan/SavingsPlan.workbook
+++ b/Workbooks/Azure Advisor/Cost Optimization/SavingsPlan/SavingsPlan.workbook
@@ -10,7 +10,7 @@
{
"type": 1,
"content": {
- "json": "We analyzed your compute usage over the last 30 days and recommend adding a savings plan to increase your savings.
The savings plan unlocks lower prices on select compute services when you commit to spend a fixed hourly amount for 1 or 3 years.
As you use select compute services globally, your usage is covered by the plan at reduced prices. During the times when your usage is above your hourly commitment, you’ll simply be billed at your regular pay-as-you-go prices. With savings automatically applying across compute usage globally, you’ll continue saving even as your usage needs change over time.
Savings plan are more suited for dynamic workloads while accommodating for planned or unplanned changes while reservations are more suited for stable, predictable workloads with no planned changes.
Saving estimates are calculated for individual subscriptions and the usage pattern observed over last 30 days. **Shared scope savings plans are available in purchase experience and can further increase savings.**
\r\nTo learn more about Savings Plan, check out this [link.](https://learn.microsoft.com/en-us/azure/cost-management-billing/savings-plan/purchase-recommendations)",
+ "json": "We analyzed your compute usage over the last 30 days and recommend adding a savings plan to increase your savings.
The savings plan unlocks lower prices on select compute services when you commit to spend a fixed hourly amount for 1 or 3 years.
As you use select compute services globally, your usage is covered by the plan at reduced prices. During the times when your usage is above your hourly commitment, you’ll simply be billed at your regular pay-as-you-go prices. With savings automatically applying across compute usage globally, you’ll continue saving even as your usage needs change over time.
Savings plan are more suited for dynamic workloads while accommodating for planned or unplanned changes while reservations are more suited for stable, predictable workloads with no planned changes.
Saving estimates are calculated for individual subscriptions and the usage pattern observed over last 30 days. **Shared scope savings plans are available in purchase experience and can further increase savings.**
\r\nTo learn more about Savings Plan, check out this [link.](https://learn.microsoft.com/azure/cost-management-billing/savings-plan/purchase-recommendations)",
"style": "info"
},
"name": "text - advisorSavingsPlanDisclaimer"
diff --git a/Workbooks/Azure Advisor/Cost Optimization/Storage/Storage.workbook b/Workbooks/Azure Advisor/Cost Optimization/Storage/Storage.workbook
index fc973a37f8..2bf49df7d6 100644
--- a/Workbooks/Azure Advisor/Cost Optimization/Storage/Storage.workbook
+++ b/Workbooks/Azure Advisor/Cost Optimization/Storage/Storage.workbook
@@ -287,6 +287,7 @@
"query": "recoveryservicesresources\r\n| where type =~ 'microsoft.recoveryservices/vaults/backupfabrics/protectioncontainers/protecteditems'\r\n| extend vaultId = tostring(properties.vaultId),resourceId = tostring(properties.sourceResourceId),idleBackup= datetime_diff('day', now(), todatetime(properties.lastBackupTime)) > 90, resourceType=tostring(properties.workloadType), protectionState=tostring(properties.protectionState),lastBackupTime=tostring(properties.lastBackupTime), resourceGroup=strcat('/subscriptions/',subscriptionId,'/resourceGroups/',resourceGroup),lastBackupDate=todatetime(properties.lastBackupTime)\r\n| where idleBackup != 0\r\n| project resourceId,vaultId,idleBackup,lastBackupDate,resourceType,protectionState,lastBackupTime,location,resourceGroup,subscriptionId\r\n| join kind = inner(\r\n resources\r\n | extend replaced_tags = replace('{}', 'null', tostring(tags))\r\n | extend replaced_tags = parse_json(replaced_tags)\r\n | mv-expand replaced_tags\r\n | extend tagName = tostring(bag_keys(replaced_tags)[0])\r\n | extend tagValue = tostring(replaced_tags['{TagName}'])\r\n | extend vaultId = id\r\n | where tagName has '{TagName}' and tagValue has '{TagValue}'\r\n | project vaultId\r\n )\r\n on vaultId\r\n | project-away vaultId1",
"size": 0,
"title": "Idle backups",
+ "showExportToExcel": true,
"queryType": 1,
"resourceType": "microsoft.resourcegraph/resources",
"crossComponentResources": [
@@ -971,7 +972,7 @@
"type": 3,
"content": {
"version": "KqlItem/1.0",
- "query": "resources\r\n| where type == 'microsoft.compute/snapshots'\r\n| where resourceGroup in ({ResourceGroup})\r\n| extend StorageSku = tostring(sku.tier), resourceGroup=strcat('/subscriptions/',subscriptionId,'/resourceGroups/',resourceGroup),diskSize=tostring(properties.diskSizeGB)\r\n| where StorageSku == \"Premium\"\r\n| project id,name,StorageSku,diskSize,location,resourceGroup,subscriptionId\r\n| join kind = innerunique(\r\n resources\r\n | extend replaced_tags = replace('{}', 'null', tostring(tags))\r\n | extend replaced_tags = parse_json(replaced_tags)\r\n | mv-expand replaced_tags\r\n | extend tagName = tostring(bag_keys(replaced_tags)[0])\r\n | extend tagValue = tostring(replaced_tags['{TagName}'])\r\n | where tagName has '{TagName}' and tagValue has '{TagValue}'\r\n | distinct id\r\n )\r\n on id\r\n",
+ "query": "resources\r\n| where type == 'microsoft.compute/snapshots'\r\n| where resourceGroup in ({ResourceGroup})\r\n| extend StorageSku = tostring(sku.tier), resourceGroup=strcat('/subscriptions/',subscriptionId,'/resourceGroups/',resourceGroup),diskSize=tostring(properties.diskSizeGB)\r\n| where StorageSku == \"Premium\"\r\n| project id,name,StorageSku,diskSize,location,resourceGroup,subscriptionId\r\n| join kind = innerunique(\r\n resources\r\n | extend replaced_tags = replace('{}', 'null', tostring(tags))\r\n | extend replaced_tags = parse_json(replaced_tags)\r\n | mv-expand replaced_tags\r\n | extend tagName = tostring(bag_keys(replaced_tags)[0])\r\n | extend tagValue = tostring(replaced_tags['{TagName}'])\r\n | where tagName has '{TagName}' and tagValue has '{TagValue}'\r\n | distinct id\r\n )\r\n on id\r\n",
"size": 0,
"title": "Snapshots using premium storage",
"noDataMessage": "No snapshots are using Premium storage",
@@ -1050,7 +1051,7 @@
"type": 3,
"content": {
"version": "KqlItem/1.0",
- "query": "resources\r\n| where type == 'microsoft.compute/snapshots'\r\n| where resourceGroup in ({ResourceGroup})\r\n| extend parentDisk = properties.creationData.sourceResourceId, diskSize=tostring(properties.diskSizeGB),resourceGroup=strcat('/subscriptions/',subscriptionId,'/resourceGroups/',resourceGroup)\r\n| project id,parentDisk,diskSize,location,resourceGroup,subscriptionId\r\n| join kind = innerunique(\r\n resources\r\n | extend replaced_tags = replace('{}', 'null', tostring(tags))\r\n | extend replaced_tags = parse_json(replaced_tags)\r\n | mv-expand replaced_tags\r\n | extend tagName = tostring(bag_keys(replaced_tags)[0])\r\n | extend tagValue = tostring(replaced_tags['{TagName}'])\r\n | where tagName has '{TagName}' and tagValue has '{TagValue}'\r\n | distinct id\r\n )\r\n on id\r\n",
+ "query": "resources\r\n| where type == 'microsoft.compute/snapshots'\r\n| where resourceGroup in ({ResourceGroup})\r\n| extend parentDisk = properties.creationData.sourceResourceId, diskSize=tostring(properties.diskSizeGB),resourceGroup=strcat('/subscriptions/',subscriptionId,'/resourceGroups/',resourceGroup)\r\n| project id,parentDisk,diskSize,location,resourceGroup,subscriptionId\r\n| join kind = innerunique(\r\n resources\r\n | extend replaced_tags = replace('{}', 'null', tostring(tags))\r\n | extend replaced_tags = parse_json(replaced_tags)\r\n | mv-expand replaced_tags\r\n | extend tagName = tostring(bag_keys(replaced_tags)[0])\r\n | extend tagValue = tostring(replaced_tags['{TagName}'])\r\n | where tagName has '{TagName}' and tagValue has '{TagValue}'\r\n | distinct id\r\n )\r\n on id\r\n",
"size": 0,
"title": "All Managed Disks snapshots",
"noDataMessage": "No snapshots found",
@@ -1099,7 +1100,7 @@
"type": 3,
"content": {
"version": "KqlItem/1.0",
- "query": "resources\r\n| where type == 'microsoft.compute/disks'\r\n| project id\r\n",
+ "query": "resources\r\n| where type == 'microsoft.compute/disks'\r\n| project id\r\n",
"size": 0,
"title": "All managed disks",
"queryType": 1,
diff --git a/Workbooks/Azure Advisor/Cost Optimization/Top10Services/Top10Services.workbook b/Workbooks/Azure Advisor/Cost Optimization/Top10Services/Top10Services.workbook
index 71d474641c..a798d452dc 100644
--- a/Workbooks/Azure Advisor/Cost Optimization/Top10Services/Top10Services.workbook
+++ b/Workbooks/Azure Advisor/Cost Optimization/Top10Services/Top10Services.workbook
@@ -888,7 +888,7 @@
{
"type": 1,
"content": {
- "json": "## Log Analytics workspace\r\nA [Log Analytics workspace](https://learn.microsoft.com/en-us/azure/azure-monitor/logs/log-analytics-workspace-overview) is a unique environment for log data from Azure Monitor and other Azure services, such as Microsoft Sentinel and Microsoft Defender for Cloud. Each workspace has its own data repository and configuration but might combine data from multiple services. The following advices could be of help in cost optimization:\r\n\r\n1. Adopt [commitment tiers](https://learn.microsoft.com/en-us/azure/azure-monitor/logs/cost-logs#commitment-tiers) where applicable.\r\n2. Adopt [Azure Monitor Logs dedicated cluster](https://learn.microsoft.com/en-us/azure/azure-monitor/logs/cost-logs#dedicated-clusters) if a single workspace does not ingest enough data as per the minimum commitment tier (100 GB/day) or if it is possible to aggregate ingestion costs from more than one workspace in the same region.\r\n3. Convert the free tier based workspace to **Pay-as-you-go** model and add them to an Azure Monitor Logs dedicated cluster where possible.",
+ "json": "## Log Analytics workspace\r\nA [Log Analytics workspace](https://learn.microsoft.com/azure/azure-monitor/logs/log-analytics-workspace-overview) is a unique environment for log data from Azure Monitor and other Azure services, such as Microsoft Sentinel and Microsoft Defender for Cloud. Each workspace has its own data repository and configuration but might combine data from multiple services. The following advices could be of help in cost optimization:\r\n\r\n1. Adopt [commitment tiers](https://learn.microsoft.com/azure/azure-monitor/logs/cost-logs#commitment-tiers) where applicable.\r\n2. Adopt [Azure Monitor Logs dedicated cluster](https://learn.microsoft.com/azure/azure-monitor/logs/cost-logs#dedicated-clusters) if a single workspace does not ingest enough data as per the minimum commitment tier (100 GB/day) or if it is possible to aggregate ingestion costs from more than one workspace in the same region.\r\n3. Convert the free tier based workspace to **Pay-as-you-go** model and add them to an Azure Monitor Logs dedicated cluster where possible.",
"style": "upsell"
},
"name": "MonitoringRecommendations"
diff --git a/Workbooks/Azure Advisor/Cost Optimization/commitment-discounts/commitment.workbook b/Workbooks/Azure Advisor/Cost Optimization/commitment-discounts/commitment.workbook
new file mode 100644
index 0000000000..6df93a20b6
--- /dev/null
+++ b/Workbooks/Azure Advisor/Cost Optimization/commitment-discounts/commitment.workbook
@@ -0,0 +1,1166 @@
+{
+ "version": "Notebook/1.0",
+ "items": [
+ {
+ "type": 12,
+ "content": {
+ "version": "NotebookGroup/1.0",
+ "groupType": "editable",
+ "items": [
+ {
+ "type": 12,
+ "content": {
+ "version": "NotebookGroup/1.0",
+ "groupType": "editable",
+ "items": [
+ {
+ "type": 11,
+ "content": {
+ "version": "LinkItem/1.0",
+ "style": "tabs",
+ "links": [
+ {
+ "id": "7a3920e6-db1e-4287-941e-7dde2691ffa9",
+ "cellValue": "selectedRateOptimizationTab",
+ "linkTarget": "parameter",
+ "linkLabel": "Commitment discounts",
+ "subTarget": "commitmentdiscounts",
+ "style": "link"
+ },
+ {
+ "id": "7cb64d60-4378-4ac5-986e-e2810ad73171",
+ "cellValue": "selectedRateOptimizationTab",
+ "linkTarget": "parameter",
+ "linkLabel": "Azure Hybrid Benefit",
+ "subTarget": "AHB",
+ "style": "link"
+ }
+ ]
+ },
+ "conditionalVisibility": {
+ "parameterName": "SelectedTab",
+ "comparison": "isEqualTo",
+ "value": "AlwaysHidden"
+ },
+ "name": "links - rate optimization tabs"
+ },
+ {
+ "type": 1,
+ "content": {
+ "json": "## Commitment-based savings\r\nTo maximize your Azure savings, consider savings plans for flexible usage and reserved instances for persistent needs. Azure Savings plans offer reduced rates with a fixed hourly spend and reserved instances allow pre-purchasing VM base price. Both options provide discounts and adapt to your usage patterns, helping you manage costs effectively. Below is an estimate of how much you can potentially save with 1-Year commitment for each option based on your usage pattern for the last 30 days.",
+ "style": "upsell"
+ },
+ "customWidth": "50",
+ "name": "text - P1YTotalSavings"
+ },
+ {
+ "type": 1,
+ "content": {
+ "json": "## Commitment-based savings\r\nTo maximize your Azure savings, consider savings plans for flexible usage and reserved instances for persistent needs. Savings plans offer reduced rates with a fixed hourly spend, while reserved instances allow pre-purchasing VM base price. Both options provide discounts and adapt to your usage patterns, helping you manage costs effectively. Below is an estimate of how much you can save with 3-Year commitment for each option based on your usage pattern for the last 30 days.",
+ "style": "upsell"
+ },
+ "customWidth": "50",
+ "name": "text - P3YTotalSavings - Copy"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "AdvisorResources \r\n| where type == 'microsoft.advisor/recommendations' \r\n| where properties.category == 'Cost' and (properties.shortDescription.solution contains \"Reserved Instance\" or properties.shortDescription.solution contains \"savings plan\")\r\n| extend\r\nrecommendationTypeId = tostring(properties.recommendationTypeId),\r\nreservedResourceType=tostring(properties.extendedProperties.reservedResourceType),\r\nlookbackPeriod=tostring(strcat(\"Last \",properties.extendedProperties.lookbackPeriod,\" days\")),\r\nterm=tostring(properties.extendedProperties.term),\r\nstableId = name,\r\nsubscriptionId = tostring(properties.extendedProperties.subId)\r\n| where term == \"P1Y\" and lookbackPeriod == \"Last 30 days\"\r\n| extend subscriptionId,stableId\r\n| join kind = leftouter\r\n(advisorresources | where type=~'microsoft.advisor/suppressions'\r\n| extend tokens = split(id, '/')\r\n| extend stableId = iff(array_length(tokens) > 3, tokens[(array_length(tokens)-3)], '')\r\n| extend expirationTimeStamp = todatetime(iff(strcmp(tostring(properties.ttl), '-1') == 0, '9999-12-31', properties.expirationTimeStamp))\r\n| where expirationTimeStamp > now()\r\n| project stableId, expirationTimeStamp)\r\non stableId\r\n| where isempty(expirationTimeStamp)\r\n| extend subscriptionId,stableId\r\n| join kind = leftouter\r\n(advisorresources \r\n| where type =~ 'microsoft.advisor/configurations'\r\n| where isempty(resourceGroup) == true\r\n| extend\r\nmaxCpuP95 = properties.extendedProperties.MaxCpuP95,\r\nlowCpuThreshold = properties.lowCpuThreshold,\r\nexcludeRecomm = properties.exclude,\r\nreservedResourceType=tostring(properties.extendedProperties.reservedResourceType),\r\nlookbackPeriod=tostring(strcat(\"Last \",properties.extendedProperties.lookbackPeriod,\" days\")),\r\nscope=tostring(properties.extendedProperties.scope),\r\nterm=tostring(properties.extendedProperties.term),\r\nsavings=todouble(properties.extendedProperties.annualSavingsAmount),\r\nsavingsAmount = todouble(properties.extendedProperties.savingsAmount),\r\nRecommendation=tostring(properties.shortDescription.solution), \r\ncurrency = tostring(properties.extendedProperties.savingsCurrency),\r\ndisplayQty = tostring(properties.extendedProperties.displayQty),\r\ndisplaySKU = tostring(properties.extendedProperties.displaySKU),\r\nregion = tostring(properties.extendedProperties.region),\r\nstableId = name,\r\nsubscriptionId = tostring(properties.extendedProperties.subId))\r\non subscriptionId\r\n| extend isActive1 = iff(isnull(excludeRecomm), true, tobool(excludeRecomm) == false)\r\n| extend isActive2 = iff(recommendationTypeId == 'e10b1381-5f0a-47ff-8c7b-37bd13d7c974', iff((isnotempty(lowCpuThreshold) and isnotempty(maxCpuP95)), toint(maxCpuP95) < toint(lowCpuThreshold), iff((isempty(maxCpuP95) or toint(maxCpuP95) < 5), true, false)), true)\r\n| where isActive1 == true and isActive2 == true\r\n| join kind = leftouter\r\n(advisorresources | where type =~ 'microsoft.advisor/configurations' | where isnotempty(resourceGroup) == true\r\n| project subscriptionId, resourceGroup, excludeProperty = properties.exclude)\r\non subscriptionId, resourceGroup\r\n| extend isActive3 = iff(isnull(excludeProperty), true, tobool(excludeProperty) == false)\r\n| where isActive3 == true\r\n| extend reservedResourceType=tostring(properties.extendedProperties.reservedResourceType),\r\nlookbackPeriod=tostring(strcat(\"Last \",properties.extendedProperties.lookbackPeriod,\" days\")),\r\nscope=tostring(properties.extendedProperties.scope),\r\nterm=tostring(properties.extendedProperties.term),\r\nsavings=todouble(properties.extendedProperties.annualSavingsAmount),\r\nsavingsAmount = todouble(properties.extendedProperties.savingsAmount),\r\nRecommendation=tostring(properties.shortDescription.solution), \r\ncurrency = tostring(properties.extendedProperties.savingsCurrency),\r\ndisplayQty = tostring(properties.extendedProperties.displayQty),\r\ndisplaySKU = tostring(properties.extendedProperties.displaySKU),\r\nregion = tostring(properties.extendedProperties.region),\r\nresources=tostring(properties.resourceMetadata.resourceId), \r\nsubscription = tostring(properties.extendedProperties.subId),\r\ntypeOfRecommendation = iif(properties.shortDescription.solution contains \"Reserved Instance\", \"Reservations\", \"Savings plan\")\r\n| where term == \"P1Y\" and lookbackPeriod == \"Last 30 days\"\r\n| summarize bin (sum(savings), 0.01) by typeOfRecommendation,currency\r\n| order by sum_savings desc\r\n",
+ "size": 0,
+ "title": "1 year total commitment-based savings",
+ "noDataMessage": "There are no commitment-based recommendations",
+ "noDataMessageStyle": 3,
+ "queryType": 1,
+ "resourceType": "microsoft.resourcegraph/resources",
+ "crossComponentResources": [
+ "value::all"
+ ],
+ "visualization": "piechart",
+ "chartSettings": {
+ "seriesLabelSettings": [
+ {
+ "seriesName": "Reservations",
+ "label": "Azure Reservations"
+ },
+ {
+ "seriesName": "Savings plan",
+ "label": "Azure Savings Plan for Compute"
+ }
+ ]
+ }
+ },
+ "customWidth": "50",
+ "name": "query - CommitmentBasedSavingsP1Y"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "AdvisorResources \r\n| where type == 'microsoft.advisor/recommendations' \r\n| where properties.category == 'Cost' and (properties.shortDescription.solution contains \"Reserved Instance\" or properties.shortDescription.solution contains \"savings plan\")\r\n| extend\r\nrecommendationTypeId = tostring(properties.recommendationTypeId),\r\nreservedResourceType=tostring(properties.extendedProperties.reservedResourceType),\r\nlookbackPeriod=tostring(strcat(\"Last \",properties.extendedProperties.lookbackPeriod,\" days\")),\r\nterm=tostring(properties.extendedProperties.term),\r\nstableId = name,\r\nsubscriptionId = tostring(properties.extendedProperties.subId)\r\n| where term == \"P3Y\" and lookbackPeriod == \"Last 30 days\"\r\n| extend subscriptionId,stableId\r\n| join kind = leftouter\r\n(advisorresources | where type=~'microsoft.advisor/suppressions'\r\n| extend tokens = split(id, '/')\r\n| extend stableId = iff(array_length(tokens) > 3, tokens[(array_length(tokens)-3)], '')\r\n| extend expirationTimeStamp = todatetime(iff(strcmp(tostring(properties.ttl), '-1') == 0, '9999-12-31', properties.expirationTimeStamp))\r\n| where expirationTimeStamp > now()\r\n| project stableId, expirationTimeStamp)\r\non stableId\r\n| where isempty(expirationTimeStamp)\r\n| extend subscriptionId,stableId\r\n| join kind = leftouter\r\n(advisorresources \r\n| where type =~ 'microsoft.advisor/configurations'\r\n| where isempty(resourceGroup) == true\r\n| extend\r\nmaxCpuP95 = properties.extendedProperties.MaxCpuP95,\r\nlowCpuThreshold = properties.lowCpuThreshold,\r\nexcludeRecomm = properties.exclude,\r\nreservedResourceType=tostring(properties.extendedProperties.reservedResourceType),\r\nlookbackPeriod=tostring(strcat(\"Last \",properties.extendedProperties.lookbackPeriod,\" days\")),\r\nscope=tostring(properties.extendedProperties.scope),\r\nterm=tostring(properties.extendedProperties.term),\r\nsavings=todouble(properties.extendedProperties.annualSavingsAmount),\r\nsavingsAmount = todouble(properties.extendedProperties.savingsAmount),\r\nRecommendation=tostring(properties.shortDescription.solution), \r\ncurrency = tostring(properties.extendedProperties.savingsCurrency),\r\ndisplayQty = tostring(properties.extendedProperties.displayQty),\r\ndisplaySKU = tostring(properties.extendedProperties.displaySKU),\r\nregion = tostring(properties.extendedProperties.region),\r\nstableId = name,\r\nsubscriptionId = tostring(properties.extendedProperties.subId))\r\non subscriptionId\r\n| extend isActive1 = iff(isnull(excludeRecomm), true, tobool(excludeRecomm) == false)\r\n| extend isActive2 = iff(recommendationTypeId == 'e10b1381-5f0a-47ff-8c7b-37bd13d7c974', iff((isnotempty(lowCpuThreshold) and isnotempty(maxCpuP95)), toint(maxCpuP95) < toint(lowCpuThreshold), iff((isempty(maxCpuP95) or toint(maxCpuP95) < 5), true, false)), true)\r\n| where isActive1 == true and isActive2 == true\r\n| join kind = leftouter\r\n(advisorresources | where type =~ 'microsoft.advisor/configurations' | where isnotempty(resourceGroup) == true\r\n| project subscriptionId, resourceGroup, excludeProperty = properties.exclude)\r\non subscriptionId, resourceGroup\r\n| extend isActive3 = iff(isnull(excludeProperty), true, tobool(excludeProperty) == false)\r\n| where isActive3 == true\r\n| extend reservedResourceType=tostring(properties.extendedProperties.reservedResourceType),\r\nlookbackPeriod=tostring(strcat(\"Last \",properties.extendedProperties.lookbackPeriod,\" days\")),\r\nscope=tostring(properties.extendedProperties.scope),\r\nterm=tostring(properties.extendedProperties.term),\r\nsavings=todouble(properties.extendedProperties.annualSavingsAmount),\r\nsavingsAmount = todouble(properties.extendedProperties.savingsAmount),\r\nRecommendation=tostring(properties.shortDescription.solution), \r\ncurrency = tostring(properties.extendedProperties.savingsCurrency),\r\ndisplayQty = tostring(properties.extendedProperties.displayQty),\r\ndisplaySKU = tostring(properties.extendedProperties.displaySKU),\r\nregion = tostring(properties.extendedProperties.region),\r\nresources=tostring(properties.resourceMetadata.resourceId), \r\nsubscription = tostring(properties.extendedProperties.subId),\r\ntypeOfRecommendation = iif(properties.shortDescription.solution contains \"Reserved Instance\", \"Reservations\", \"Savings plan\")\r\n| where term == \"P3Y\" and lookbackPeriod == \"Last 30 days\"\r\n| summarize bin (sum(savings), 0.01) by typeOfRecommendation,currency\r\n| order by sum_savings desc\r\n",
+ "size": 0,
+ "title": "3 years total commitment-based savings",
+ "noDataMessage": "There are no commitment-based recommendations",
+ "noDataMessageStyle": 3,
+ "queryType": 1,
+ "resourceType": "microsoft.resourcegraph/resources",
+ "crossComponentResources": [
+ "value::all"
+ ],
+ "visualization": "piechart",
+ "chartSettings": {
+ "seriesLabelSettings": [
+ {
+ "seriesName": "Reservations",
+ "label": "Azure Reservations"
+ },
+ {
+ "seriesName": "Savings plan",
+ "label": "Azure Savings Plan for Compute"
+ }
+ ]
+ }
+ },
+ "customWidth": "50",
+ "name": "query - CommitmentBasedSavingsP3Y"
+ },
+ {
+ "type": 11,
+ "content": {
+ "version": "LinkItem/1.0",
+ "style": "tabs",
+ "links": [
+ {
+ "id": "56eb4166-cb7c-4384-94a9-c5f201e1316d",
+ "cellValue": "selectedRateOptimizationSubTab",
+ "linkTarget": "parameter",
+ "linkLabel": "Azure Reservations",
+ "subTarget": "reservations",
+ "style": "link"
+ },
+ {
+ "id": "799d4fc7-5790-467c-84cc-ce4b4cc34a3f",
+ "cellValue": "selectedRateOptimizationSubTab",
+ "linkTarget": "parameter",
+ "linkLabel": "Azure Savings Plan for Compute",
+ "subTarget": "SavingsPlan",
+ "style": "link"
+ }
+ ]
+ },
+ "name": "links - rate optimization tabs"
+ },
+ {
+ "type": 1,
+ "content": {
+ "json": "**Reserved instances** can provide a significant discount over on-demand prices. With reserved instances, you can pre-purchase the base costs for your virtual machines. \r\n
Discounts will automatically apply to new or existing VMs that have the same size and region as your reserved instance.
We analyzed your usage over selected Term, look-back period and recommend money-saving reserved instances.\r\n
This query will only provide you recommendations for single scope reserved instances. *To learn more about Reserved Instances, go to this [link.](https://learn.microsoft.com/en-us/azure/cost-management-billing/manage/understand-vm-reservation-charges)*",
+ "style": "info"
+ },
+ "conditionalVisibility": {
+ "parameterName": "selectedRateOptimizationSubTab",
+ "comparison": "isEqualTo",
+ "value": "reservations"
+ },
+ "name": "text - advisorReservationdDisclaimer"
+ },
+ {
+ "type": 1,
+ "content": {
+ "json": "### Understanding the Break-Even Point for Reserved Instances\r\n\r\nThe break-even point is the time it takes for the cost savings from a Reserved Instance (RI) to equal the upfront payment. For Azure Reserved Instances, this is calculated by comparing the cost of the RI against the pay-as-you-go pricing for the same virtual machine.\r\n\r\nTo calculate:\r\n\r\n1. Determine the total cost of the RI over its term (e.g., 1 or 3 years).\r\n2. Calculate the pay-as-you-go cost for the same duration.\r\n3. Find the point where the cumulative savings equal the RI's upfront or periodic payments.\r\n\r\nThis helps you understand how long it will take for the investment in a Reserved Instance to start saving money compared to on-demand pricing.\r\n\r\nThe breakeven point (in months) is calculated based on 100% utilization within the term (1 yr or 3 yrs) of Reservations. Your actual usage of RI may vary and can change the breakeven point. To monitor the RI usage data consider using the RI utilization alerts.",
+ "style": "upsell"
+ },
+ "conditionalVisibility": {
+ "parameterName": "selectedRateOptimizationSubTab",
+ "comparison": "isEqualTo",
+ "value": "reservations"
+ },
+ "name": "text-breakeven explanation"
+ },
+ {
+ "type": 12,
+ "content": {
+ "version": "NotebookGroup/1.0",
+ "groupType": "editable",
+ "loadType": "explicit",
+ "loadButtonText": "Show reservation break-even analysis",
+ "items": [
+ {
+ "type": 12,
+ "content": {
+ "version": "NotebookGroup/1.0",
+ "groupType": "editable",
+ "items": [
+ {
+ "type": 9,
+ "content": {
+ "version": "KqlParameterItem/1.0",
+ "parameters": [
+ {
+ "id": "f2bb2b02-9187-4209-9fb8-eb99c60d9c9d",
+ "version": "KqlParameterItem/1.0",
+ "name": "agreementType",
+ "label": "Agreement Type",
+ "type": 10,
+ "isRequired": true,
+ "typeSettings": {
+ "additionalResourceOptions": [],
+ "showDefault": false
+ },
+ "jsonData": "[\r\n {\r\n \"value\" : \"MCA\",\r\n \"label\" : \"Microsoft Customer Agreement (MCA)\"\r\n },\r\n {\r\n \"value\" : \"EA\",\r\n \"label\" : \"Microsoft Enterprise Agreement (EA)\"\r\n }\r\n]",
+ "timeContext": {
+ "durationMs": 86400000
+ },
+ "value": "EA"
+ }
+ ],
+ "style": "pills",
+ "queryType": 0,
+ "resourceType": "microsoft.operationalinsights/workspaces"
+ },
+ "name": "parameters - 0"
+ },
+ {
+ "type": 9,
+ "content": {
+ "version": "KqlParameterItem/1.0",
+ "parameters": [
+ {
+ "id": "1007cfd0-3554-41ea-8e8c-e04d4f67add4",
+ "version": "KqlParameterItem/1.0",
+ "name": "billingAccount",
+ "label": "Billing Account",
+ "type": 2,
+ "isRequired": true,
+ "query": "{\"version\":\"ARMEndpoint/1.0\",\"data\":null,\"headers\":[],\"method\":\"GET\",\"path\":\"/providers/Microsoft.Billing/billingAccounts\",\"urlParams\":[{\"key\":\"api-version\",\"value\":\"2019-10-01-preview\"}],\"batchDisabled\":false,\"transformers\":[{\"type\":\"jsonpath\",\"settings\":{\"tablePath\":\"$.value\",\"columns\":[{\"path\":\"name\",\"columnid\":\"billingAccount\"},{\"path\":\"properties.displayName\",\"columnid\":\"Displayname\"}]}}]}",
+ "typeSettings": {
+ "additionalResourceOptions": [],
+ "showDefault": false
+ },
+ "timeContext": {
+ "durationMs": 86400000
+ },
+ "queryType": 12,
+ "value": "8611537"
+ },
+ {
+ "id": "38d70cdc-7667-44d8-8a05-f1384c8a92a2",
+ "version": "KqlParameterItem/1.0",
+ "name": "lookBackPeriod",
+ "label": "Look back period",
+ "type": 2,
+ "isRequired": true,
+ "typeSettings": {
+ "additionalResourceOptions": [],
+ "showDefault": false
+ },
+ "jsonData": "[\r\n {\r\n \"value\" : \"Last7Days\",\r\n \"label\" : \"Last 7 Days\"\r\n },\r\n {\r\n \"value\" : \"Last30Days\",\r\n \"label\" : \"Last 30 Days\",\r\n \"selected\" : true\r\n },\r\n {\r\n \"value\" : \"Last60Days\",\r\n \"label\" : \"Last 60 Days\"\r\n }\r\n]",
+ "timeContext": {
+ "durationMs": 86400000
+ },
+ "value": "Last60Days"
+ },
+ {
+ "id": "9892e53b-bda1-4cb6-a3a1-25de058c4484",
+ "version": "KqlParameterItem/1.0",
+ "name": "scope",
+ "label": "Scope",
+ "type": 10,
+ "isRequired": true,
+ "typeSettings": {
+ "additionalResourceOptions": [],
+ "showDefault": false
+ },
+ "jsonData": "[\r\n {\r\n \"value\": \"properties/scope eq 'Single'\",\r\n \"label\" : \"Single\",\r\n \"selected\": true\r\n },\r\n {\r\n \"value\": \"properties/scope eq 'Shared'\",\r\n \"label\" : \"Shared\",\r\n \"selected\": true\r\n }\r\n\r\n]",
+ "value": "properties/scope eq 'Shared'"
+ },
+ {
+ "version": "KqlParameterItem/1.0",
+ "name": "term",
+ "label": "Term",
+ "type": 10,
+ "isRequired": true,
+ "typeSettings": {
+ "additionalResourceOptions": [],
+ "showDefault": false
+ },
+ "jsonData": "[\r\n {\r\n \"value\": \"properties/term eq 'P1Y'\",\r\n \"label\" : \"1Y\",\r\n \"selected\": true\r\n },\r\n {\r\n \"value\": \"properties/term eq 'P3Y'\",\r\n \"label\" : \"3Y\",\r\n \"selected\": true\r\n }\r\n\r\n]",
+ "value": "properties/term eq 'P3Y'",
+ "id": "6850fde5-30c4-49f1-91c2-4ce150778c18"
+ }
+ ],
+ "style": "pills",
+ "queryType": 0,
+ "resourceType": "microsoft.operationalinsights/workspaces"
+ },
+ "name": "parameters - 3"
+ },
+ {
+ "type": 9,
+ "content": {
+ "version": "KqlParameterItem/1.0",
+ "parameters": [
+ {
+ "id": "78948283-c135-4603-b506-a0271660ae26",
+ "version": "KqlParameterItem/1.0",
+ "name": "billingProfile",
+ "label": "Billing profile",
+ "type": 2,
+ "isRequired": true,
+ "query": "{\"version\":\"ARMEndpoint/1.0\",\"data\":null,\"headers\":[],\"method\":\"GET\",\"path\":\"/providers/Microsoft.Billing/billingAccounts/{billingAccount}/billingProfiles\",\"urlParams\":[{\"key\":\"api-version\",\"value\":\"2020-05-01\"}],\"batchDisabled\":false,\"transformers\":[{\"type\":\"jsonpath\",\"settings\":{\"tablePath\":\"$.value\",\"columns\":[{\"path\":\"name\",\"columnid\":\"Name\"},{\"path\":\"properties.displayName\",\"columnid\":\"DisplayName\"}]}}]}",
+ "typeSettings": {
+ "additionalResourceOptions": [],
+ "showDefault": false
+ },
+ "timeContext": {
+ "durationMs": 86400000
+ },
+ "queryType": 12,
+ "value": null
+ }
+ ],
+ "style": "pills",
+ "queryType": 12
+ },
+ "conditionalVisibility": {
+ "parameterName": "agreementType",
+ "comparison": "isEqualTo",
+ "value": "MCA"
+ },
+ "name": "parameters - billingProfile"
+ },
+ {
+ "type": 11,
+ "content": {
+ "version": "LinkItem/1.0",
+ "style": "tabs",
+ "links": [
+ {
+ "id": "3122e083-af17-48c5-af19-b2dde9e55214",
+ "cellValue": "SelectedSubTab",
+ "linkTarget": "parameter",
+ "linkLabel": "Reservations Recommendations",
+ "subTarget": "riRecommendations",
+ "style": "link"
+ }
+ ]
+ },
+ "conditionalVisibility": {
+ "parameterName": "SelectedTab",
+ "comparison": "isEqualTo",
+ "value": "reservations"
+ },
+ "name": "Subtabs - Reservations"
+ },
+ {
+ "type": 12,
+ "content": {
+ "version": "NotebookGroup/1.0",
+ "groupType": "editable",
+ "items": [
+ {
+ "type": 1,
+ "content": {
+ "json": "## Reservation Break-Even Analysis"
+ },
+ "name": "reservationOverviewText"
+ },
+ {
+ "type": 1,
+ "content": {
+ "json": "## Important Information - This tab is under preview and requires different permissions.\r\n",
+ "style": "success"
+ },
+ "name": "Preview Info text"
+ },
+ {
+ "type": 1,
+ "content": {
+ "json": "## RBAC Needed\r\n\r\nThis tab displays various reservations-related details. To access the information on this tab, ensure you have the following minimum RBAC permissions:\r\n\r\n* **For Enterprise Admin (EA) Customers:** Enterprise Administrator (read-only) or EA Purchaser. Learn more about setting up these permissions here: [Organization Structure and Permissions by Role](https://learn.microsoft.com/en-us/azure/cost-management-billing/manage/understand-ea-roles#organization-structure-and-permissions-by-role).\r\n\r\n* **For Microsoft Customer Agreement (MCA) Customers:** Billing Profile Reader. Learn more about setting up these permissions here: [Billing Profile Roles and Tasks](https://learn.microsoft.com/en-us/azure/cost-management-billing/manage/understand-mca-roles#billing-profile-roles-and-tasks).\r\n",
+ "style": "warning"
+ },
+ "name": "rbacText"
+ },
+ {
+ "type": 9,
+ "content": {
+ "version": "KqlParameterItem/1.0",
+ "parameters": [
+ {
+ "id": "5c5c1817-4ccf-438d-a1b4-08ea4451438b",
+ "version": "KqlParameterItem/1.0",
+ "name": "resourceType",
+ "label": "Resource type",
+ "type": 10,
+ "isRequired": true,
+ "typeSettings": {
+ "additionalResourceOptions": []
+ },
+ "jsonData": "[\r\n {\r\n \"value\" : \"properties/resourceType eq 'VirtualMachines'\",\r\n \"label\" : \"VirtualMachines\",\r\n \"selected\": true\r\n },\r\n {\r\n \"value\" : \"properties/resourceType eq 'SQLDatabases'\",\r\n \"label\" : \"SQLDatabases\"\r\n },\r\n {\r\n \"value\" : \"properties/resourceType eq 'PostgreSQL'\",\r\n \"label\" : \"PostgreSQL\"\r\n },\r\n {\r\n \"value\" : \"properties/resourceType eq 'ManagedDisk'\",\r\n \"label\" : \"ManagedDisk\"\r\n },\r\n {\r\n \"value\" : \"properties/resourceType eq 'MySQL'\",\r\n \"label\" : \"MySQL\"\r\n },\r\n {\r\n \"value\" : \"properties/resourceType eq 'RedHat'\",\r\n \"label\" : \"RedHat\"\r\n },\r\n {\r\n \"value\" : \"properties/resourceType eq 'MariaDB'\",\r\n \"label\" : \"MariaDB\"\r\n },\r\n {\r\n \"value\" : \"properties/resourceType eq 'RedisCache'\",\r\n \"label\" : \"RedisCache\"\r\n },\r\n {\r\n \"value\" : \"properties/resourceType eq 'CosmosDB'\",\r\n \"label\" : \"CosmosDB\"\r\n },\r\n {\r\n \"value\" : \"properties/resourceType eq 'CosmosDB'\",\r\n \"label\" : \"CosmosDB\"\r\n },\r\n {\r\n \"value\" : \"properties/resourceType eq 'SUSELinux'\",\r\n \"label\" : \"SUSELinux\"\r\n },\r\n {\r\n \"value\" : \"properties/resourceType eq 'AppService'\",\r\n \"label\" : \"AppService\"\r\n },\r\n {\r\n \"value\" : \"properties/resourceType eq 'BlockBlob'\",\r\n \"label\" : \"BlockBlob\"\r\n },\r\n {\r\n \"value\" : \"properties/resourceType eq 'AzureDataExplorer'\",\r\n \"label\" : \"AzureDataExplorer\"\r\n },\r\n {\r\n \"value\" : \"properties/resourceType eq 'VMwareCloudSimple'\",\r\n \"label\" : \"VMwareCloudSimple\"\r\n }\r\n]",
+ "timeContext": {
+ "durationMs": 86400000
+ }
+ }
+ ],
+ "style": "pills",
+ "queryType": 0,
+ "resourceType": "microsoft.operationalinsights/workspaces"
+ },
+ "name": "paramResourceType"
+ },
+ {
+ "type": 12,
+ "content": {
+ "version": "NotebookGroup/1.0",
+ "groupType": "editable",
+ "items": [
+ {
+ "type": 1,
+ "content": {
+ "json": "## Reservation Recommendations - Microsoft Customer Agreement (MCA)"
+ },
+ "name": "reservationOverviewText-MCA"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "{\"version\":\"ARMEndpoint/1.0\",\"data\":null,\"headers\":[],\"method\":\"GET\",\"path\":\"/providers/Microsoft.Billing/billingAccounts/{billingAccount}/billingProfiles/{billingProfile}/providers/Microsoft.Consumption/reservationRecommendations?$filter=properties/lookBackPeriod eq '{lookBackPeriod}' AND {resourceType:escapejson} AND {scope:escapejson} \",\"urlParams\":[{\"key\":\"api-version\",\"value\":\"2021-10-01\"}],\"batchDisabled\":false,\"transformers\":[{\"type\":\"jsonpath\",\"settings\":{\"tablePath\":\"$.value\",\"columns\":[{\"path\":\"properties.term\",\"columnid\":\"Term\"},{\"path\":\"properties.scope\",\"columnid\":\"Scope\"},{\"path\":\"properties.subscriptionId\",\"columnid\":\"Subscription\"},{\"path\":\"properties.skuName\",\"columnid\":\"SKU\"},{\"path\":\"properties.location\",\"columnid\":\"Location\"},{\"path\":\"properties.recommendedQuantity\",\"columnid\":\"Quantity\"},{\"path\":\"properties.costWithNoReservedInstances.value\",\"columnid\":\"CostWithoutRI\"},{\"path\":\"properties.totalCostWithReservedInstances.value\",\"columnid\":\"CostWithRI\"},{\"path\":\"properties.netSavings.vlaue\",\"columnid\":\"Savings\"},{\"path\":\"properties.lookBackPeriod\",\"columnid\":\"LookBackPeriod\"}]}}]}",
+ "size": 0,
+ "title": "Reservations recommendations",
+ "queryType": 12,
+ "gridSettings": {
+ "filter": true
+ }
+ },
+ "conditionalVisibility": {
+ "parameterName": "isVisible",
+ "comparison": "isEqualTo",
+ "value": "true"
+ },
+ "name": "query - reservationRecommendations-MCA",
+ "styleSettings": {
+ "showBorder": true
+ }
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "{\"version\":\"Merge/1.0\",\"merges\":[{\"id\":\"06a2581c-98e0-4a40-a99e-45ea9b8f116f\",\"mergeType\":\"table\",\"leftTable\":\"query - reservationRecommendations-MCA\"}],\"projectRename\":[{\"originalName\":\"[query - reservationRecommendations-MCA].Term\",\"mergedName\":\"Term\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f116f\"},{\"originalName\":\"[query - reservationRecommendations-MCA].Scope\",\"mergedName\":\"Scope\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f116f\"},{\"originalName\":\"[query - reservationRecommendations-MCA].Subscription\",\"mergedName\":\"Subscription\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f116f\"},{\"originalName\":\"[query - reservationRecommendations-MCA].SKU\",\"mergedName\":\"SKU\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f116f\"},{\"originalName\":\"[query - reservationRecommendations-MCA].Location\",\"mergedName\":\"Location\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f116f\"},{\"originalName\":\"[query - reservationRecommendations-MCA].Quantity\",\"mergedName\":\"Quantity\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f116f\"},{\"originalName\":\"[query - reservationRecommendations-MCA].CostWithoutRI\",\"mergedName\":\"CostWithoutRI\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f116f\"},{\"originalName\":\"[query - reservationRecommendations-MCA].CostWithRI\",\"mergedName\":\"CostWithRI\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f116f\"},{\"originalName\":\"[query - reservationRecommendations-MCA].Savings\",\"mergedName\":\"Savings\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f116f\"},{\"originalName\":\"[Added column]\",\"mergedName\":\"Breakeven point (Months)\",\"fromId\":null,\"isNewItem\":true,\"newItemData\":[{\"criteriaContext\":{\"leftOperand\":\"Term\",\"operator\":\"==\",\"rightValType\":\"static\",\"rightVal\":\"P1Y\",\"resultValType\":\"expression\",\"resultVal\":\"round([\\\"CostWithRI\\\"]*12/[\\\"CostWithoutRI\\\"],0)\"}},{\"criteriaContext\":{\"leftOperand\":\"Term\",\"operator\":\"==\",\"rightValType\":\"static\",\"rightVal\":\"P3Y\",\"resultValType\":\"expression\",\"resultVal\":\"round([\\\"CostWithRI\\\"]*12*3/[\\\"CostWithoutRI\\\"],0)\"}},{\"criteriaContext\":{\"operator\":\"Default\",\"rightValType\":\"column\",\"resultValType\":\"column\"}}]},{\"originalName\":\"[query - reservationRecommendations-MCA].LookBackPeriod\",\"mergedName\":\"LookBackPeriod\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f116f\"}]}",
+ "size": 0,
+ "showRefreshButton": true,
+ "showExportToExcel": true,
+ "queryType": 7
+ },
+ "name": "reservationRecommendations-MCA-MERGE",
+ "styleSettings": {
+ "showBorder": true
+ }
+ }
+ ]
+ },
+ "conditionalVisibilities": [
+ {
+ "parameterName": "agreementType",
+ "comparison": "isEqualTo",
+ "value": "MCA"
+ },
+ {
+ "parameterName": "billingAccount",
+ "comparison": "isNotEqualTo"
+ }
+ ],
+ "name": "group - MCA"
+ },
+ {
+ "type": 12,
+ "content": {
+ "version": "NotebookGroup/1.0",
+ "groupType": "editable",
+ "loadType": "explicit",
+ "items": [
+ {
+ "type": 1,
+ "content": {
+ "json": "## Reservation Recommendations - Enterprise Admin (EA)"
+ },
+ "name": "reservationOverviewText-EA"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "{\"version\":\"ARMEndpoint/1.0\",\"data\":null,\"headers\":[],\"method\":\"GET\",\"path\":\"/providers/Microsoft.Billing/billingAccounts/{billingAccount}//providers/Microsoft.Consumption/reservationRecommendations?$filter=properties/lookBackPeriod eq '{lookBackPeriod}' AND {resourceType:escapejson} AND {scope:escapejson} AND {term:escapejson}\",\"urlParams\":[{\"key\":\"api-version\",\"value\":\"2021-10-01\"}],\"batchDisabled\":false,\"transformers\":[{\"type\":\"jsonpath\",\"settings\":{\"tablePath\":\"$.value\",\"columns\":[{\"path\":\"properties.term\",\"columnid\":\"Term\"},{\"path\":\"properties.scope\",\"columnid\":\"Scope\"},{\"path\":\"properties.subscriptionId\",\"columnid\":\"Subscription\"},{\"path\":\"sku\",\"columnid\":\"SKU\"},{\"path\":\"location\",\"columnid\":\"Location\"},{\"path\":\"properties.recommendedQuantity\",\"columnid\":\"Quantity\"},{\"path\":\"properties.costWithNoReservedInstances\",\"columnid\":\"CostWithoutRI\"},{\"path\":\"properties.totalCostWithReservedInstances\",\"columnid\":\"CostWithRI\"},{\"path\":\"properties.netSavings\",\"columnid\":\"Savings\"},{\"path\":\"properties.lookBackPeriod\",\"columnid\":\"LookBackPeriod\"}]}}]}",
+ "size": 0,
+ "title": "Reservations recommendations",
+ "noDataMessage": "No reservation recommendations found!",
+ "showExportToExcel": true,
+ "queryType": 12,
+ "gridSettings": {
+ "rowLimit": 10000,
+ "filter": true
+ }
+ },
+ "conditionalVisibility": {
+ "parameterName": "isVisible",
+ "comparison": "isEqualTo",
+ "value": "true"
+ },
+ "name": "query - reservationRecommendations-EA"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "ResourceContainers \r\n| where type =~ 'Microsoft.Resources/subscriptions'\r\n| project SubscriptionName = name, subscriptionId ",
+ "size": 0,
+ "queryType": 1,
+ "resourceType": "microsoft.resourcegraph/resources",
+ "crossComponentResources": [
+ "value::all"
+ ],
+ "gridSettings": {
+ "rowLimit": 10000,
+ "filter": true
+ }
+ },
+ "conditionalVisibility": {
+ "parameterName": "AlwaysHidden",
+ "comparison": "isEqualTo",
+ "value": "True"
+ },
+ "name": "SubNameMapping-Hidden"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "{\"version\":\"Merge/1.0\",\"merges\":[{\"id\":\"06a2581c-98e0-4a40-a99e-45ea9b8f12ad\",\"mergeType\":\"table\",\"leftTable\":\"query - reservationRecommendations-EA\"}],\"projectRename\":[{\"originalName\":\"[query - reservationRecommendations].Term\",\"mergedName\":\"Term\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f12ad\"},{\"originalName\":\"[query - reservationRecommendations].Scope\",\"mergedName\":\"Scope\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f12ad\"},{\"originalName\":\"[query - reservationRecommendations].Subscription\",\"mergedName\":\"Subscription\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f12ad\"},{\"originalName\":\"[query - reservationRecommendations].SKU\",\"mergedName\":\"SKU\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f12ad\"},{\"originalName\":\"[query - reservationRecommendations].Location\",\"mergedName\":\"Location\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f12ad\"},{\"originalName\":\"[query - reservationRecommendations].Quantity\",\"mergedName\":\"Quantity\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f12ad\"},{\"originalName\":\"[query - reservationRecommendations].CostWithoutRI\",\"mergedName\":\"CostWithoutRI\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f12ad\"},{\"originalName\":\"[query - reservationRecommendations].CostWithRI\",\"mergedName\":\"CostWithRI\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f12ad\"},{\"originalName\":\"[query - reservationRecommendations].Savings\",\"mergedName\":\"Savings\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f12ad\"},{\"originalName\":\"[query - reservationRecommendations].LookBackPeriod\",\"mergedName\":\"LookBackPeriod\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f12ad\"},{\"originalName\":\"[query - reservationRecommendations-EA].Term\",\"mergedName\":\"Term\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - reservationRecommendations-EA].Scope\",\"mergedName\":\"Scope\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - reservationRecommendations-EA].Subscription\",\"mergedName\":\"Subscription\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - reservationRecommendations-EA].SKU\",\"mergedName\":\"SKU\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - reservationRecommendations-EA].Location\",\"mergedName\":\"Location\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - reservationRecommendations-EA].Quantity\",\"mergedName\":\"Quantity\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - reservationRecommendations-EA].CostWithoutRI\",\"mergedName\":\"CostWithoutRI\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - reservationRecommendations-EA].CostWithRI\",\"mergedName\":\"CostWithRI\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - reservationRecommendations-EA].Savings\",\"mergedName\":\"Savings\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - reservationRecommendations-EA].LookBackPeriod\",\"mergedName\":\"LookBackPeriod\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - reservationRecommendations-EA].value\",\"mergedName\":\"value\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - reservationRecommendations-EA].defaultVisualization\",\"mergedName\":\"defaultVisualization\",\"fromId\":\"unknown\"}]}",
+ "size": 0,
+ "aggregation": 5,
+ "title": "Top savings by Sku",
+ "showRefreshButton": true,
+ "showExportToExcel": true,
+ "queryType": 7,
+ "visualization": "barchart",
+ "chartSettings": {
+ "xAxis": "SKU",
+ "yAxis": [
+ "Savings"
+ ],
+ "group": "SKU",
+ "createOtherGroup": 50,
+ "showLegend": true,
+ "ySettings": {
+ "numberFormatSettings": {
+ "unit": 0,
+ "options": {
+ "style": "decimal",
+ "useGrouping": true,
+ "maximumFractionDigits": 2
+ }
+ }
+ }
+ }
+ },
+ "conditionalVisibility": {
+ "parameterName": "AlwaysHidden",
+ "comparison": "isEqualTo",
+ "value": "true"
+ },
+ "showPin": false,
+ "name": "query - SavingsChart",
+ "styleSettings": {
+ "showBorder": true
+ }
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "{\"version\":\"Merge/1.0\",\"merges\":[{\"id\":\"06a2581c-98e0-4a40-a99e-45ea9b8f10de\",\"mergeType\":\"leftouter\",\"leftTable\":\"query - reservationRecommendations-EA\",\"rightTable\":\"SubNameMapping-Hidden\",\"leftColumn\":\"Subscription\",\"rightColumn\":\"subscriptionId\"}],\"projectRename\":[{\"originalName\":\"SubscriptionName\",\"mergedName\":\"SubscriptionName\",\"fromId\":\"unknown\"},{\"originalName\":\"[SubNameMapping-Hidden].SubscriptionName\",\"mergedName\":\"SubscriptionName1\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f10de\"},{\"originalName\":\"[query - reservationRecommendations].LookBackPeriod\",\"mergedName\":\"LookBackPeriod\",\"fromId\":\"unknown\"},{\"originalName\":\"subscriptionId\",\"mergedName\":\"subscriptionId\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - reservationRecommendations].Term\",\"mergedName\":\"Term\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f10de\"},{\"originalName\":\"[query - reservationRecommendations].Scope\",\"mergedName\":\"Scope\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f10de\"},{\"originalName\":\"[query - reservationRecommendations].Subscription\",\"mergedName\":\"Subscription\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f10de\"},{\"originalName\":\"[query - reservationRecommendations].SKU\",\"mergedName\":\"SKU\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f10de\"},{\"originalName\":\"[Added column]\",\"mergedName\":\"Breakeven point (Months)\",\"fromId\":null,\"isNewItem\":true,\"newItemData\":[{\"criteriaContext\":{\"leftOperand\":\"Term\",\"operator\":\"==\",\"rightValType\":\"static\",\"rightVal\":\"P1Y\",\"resultValType\":\"expression\",\"resultVal\":\"round([\\\"CostWithRI\\\"]*12/[\\\"CostWithoutRI\\\"],0)\"}},{\"criteriaContext\":{\"leftOperand\":\"Term\",\"operator\":\"==\",\"rightValType\":\"static\",\"rightVal\":\"P3Y\",\"resultValType\":\"expression\",\"resultVal\":\"round([\\\"CostWithRI\\\"]*12*3/[\\\"CostWithoutRI\\\"],0)\"}},{\"criteriaContext\":{\"operator\":\"Default\",\"rightValType\":\"column\",\"resultValType\":\"column\"}}]},{\"originalName\":\"[query - reservationRecommendations].Location\",\"mergedName\":\"Location\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f10de\"},{\"originalName\":\"[query - reservationRecommendations].Quantity\",\"mergedName\":\"Quantity\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f10de\"},{\"originalName\":\"[query - reservationRecommendations].CostWithoutRI\",\"mergedName\":\"CostWithoutRI\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f10de\"},{\"originalName\":\"[query - reservationRecommendations].CostWithRI\",\"mergedName\":\"CostWithRI\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f10de\"},{\"originalName\":\"[query - reservationRecommendations].Savings\",\"mergedName\":\"Savings\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f10de\"},{\"originalName\":\"[SubNameMapping-Hidden].subscriptionId\",\"mergedName\":\"subscriptionId1\",\"fromId\":\"06a2581c-98e0-4a40-a99e-45ea9b8f10de\"},{\"originalName\":\"[query - reservationRecommendations-EA].Term\",\"mergedName\":\"Term\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - reservationRecommendations-EA].Scope\",\"mergedName\":\"Scope\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - reservationRecommendations-EA].Subscription\",\"mergedName\":\"Subscription\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - reservationRecommendations-EA].SKU\",\"mergedName\":\"SKU\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - reservationRecommendations-EA].Location\",\"mergedName\":\"Location\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - reservationRecommendations-EA].Quantity\",\"mergedName\":\"Quantity\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - reservationRecommendations-EA].CostWithoutRI\",\"mergedName\":\"CostWithoutRI\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - reservationRecommendations-EA].CostWithRI\",\"mergedName\":\"CostWithRI\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - reservationRecommendations-EA].Savings\",\"mergedName\":\"Savings\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - reservationRecommendations-EA].LookBackPeriod\",\"mergedName\":\"LookBackPeriod\",\"fromId\":\"unknown\"},{\"originalName\":\"[query - Get All subscriptions].zones\"},{\"originalName\":\"[query - Get All subscriptions].identity\"},{\"originalName\":\"[query - Get All subscriptions].tags\"},{\"originalName\":\"[query - Get All subscriptions].properties\"},{\"originalName\":\"[query - Get All subscriptions].plan\"},{\"originalName\":\"[query - Get All subscriptions].sku\"},{\"originalName\":\"[query - Get All subscriptions].managedBy\"},{\"originalName\":\"[query - Get All subscriptions].resourceGroup\"},{\"originalName\":\"[query - Get All subscriptions].location\"},{\"originalName\":\"[query - Get All subscriptions].kind\"},{\"originalName\":\"[query - Get All subscriptions].tenantId\"},{\"originalName\":\"[query - Get All subscriptions].type\"},{\"originalName\":\"[query - Get All subscriptions].subscriptionId\"},{\"originalName\":\"[query - Get All subscriptions].extendedLocation\"},{\"originalName\":\"[query - Get All subscriptions].name\"},{\"originalName\":\"[query - Get All subscriptions].id\"}]}",
+ "size": 0,
+ "title": "Reservations recommendations",
+ "showRefreshButton": true,
+ "showExportToExcel": true,
+ "queryType": 7,
+ "gridSettings": {
+ "formatters": [
+ {
+ "columnMatch": "SubscriptionName1",
+ "formatter": 5
+ },
+ {
+ "columnMatch": "subscriptionId1",
+ "formatter": 5,
+ "formatOptions": {
+ "linkTarget": "Resource",
+ "linkIsContextBlade": true,
+ "customColumnWidthSetting": "37ch"
+ }
+ },
+ {
+ "columnMatch": "Scope",
+ "formatter": 0,
+ "formatOptions": {
+ "customColumnWidthSetting": "12ch"
+ }
+ },
+ {
+ "columnMatch": "Subscription",
+ "formatter": 15,
+ "formatOptions": {
+ "linkTarget": null,
+ "showIcon": true
+ }
+ },
+ {
+ "columnMatch": "SKU",
+ "formatter": 0,
+ "formatOptions": {
+ "customColumnWidthSetting": "18ch"
+ }
+ },
+ {
+ "columnMatch": "Location",
+ "formatter": 0,
+ "formatOptions": {
+ "customColumnWidthSetting": "13.7143ch"
+ }
+ },
+ {
+ "columnMatch": "Quantity",
+ "formatter": 0,
+ "formatOptions": {
+ "customColumnWidthSetting": "13.2857ch"
+ }
+ },
+ {
+ "columnMatch": "Breakeven point (Months)",
+ "formatter": 0,
+ "formatOptions": {
+ "customColumnWidthSetting": "27.4286ch"
+ }
+ },
+ {
+ "columnMatch": "CostWithoutRI",
+ "formatter": 0,
+ "formatOptions": {
+ "customColumnWidthSetting": "19.4286ch"
+ },
+ "numberFormat": {
+ "unit": 0,
+ "options": {
+ "style": "decimal",
+ "useGrouping": true,
+ "maximumFractionDigits": 2
+ }
+ }
+ },
+ {
+ "columnMatch": "CostWithRI",
+ "formatter": 0,
+ "formatOptions": {
+ "aggregation": "Sum",
+ "customColumnWidthSetting": "15.8571ch"
+ },
+ "numberFormat": {
+ "unit": 0,
+ "options": {
+ "style": "decimal",
+ "useGrouping": true,
+ "maximumFractionDigits": 2
+ }
+ }
+ },
+ {
+ "columnMatch": "Savings",
+ "formatter": 0,
+ "formatOptions": {
+ "customColumnWidthSetting": "16.1429ch"
+ },
+ "numberFormat": {
+ "unit": 0,
+ "options": {
+ "style": "decimal",
+ "useGrouping": true,
+ "maximumFractionDigits": 2
+ }
+ }
+ },
+ {
+ "columnMatch": "LookBackPeriod",
+ "formatter": 0,
+ "formatOptions": {
+ "customColumnWidthSetting": "21ch"
+ }
+ }
+ ],
+ "rowLimit": 10000,
+ "filter": true,
+ "labelSettings": [
+ {
+ "columnId": "SubscriptionName1",
+ "label": "Subscription Name"
+ },
+ {
+ "columnId": "subscriptionId1",
+ "label": "Subscription Id"
+ },
+ {
+ "columnId": "Term",
+ "label": "Term"
+ },
+ {
+ "columnId": "Scope",
+ "label": "Scope"
+ },
+ {
+ "columnId": "SKU",
+ "label": "SKU"
+ },
+ {
+ "columnId": "Location",
+ "label": "Location"
+ },
+ {
+ "columnId": "Quantity",
+ "label": "Quantity"
+ },
+ {
+ "columnId": "Breakeven point (Months)",
+ "label": "Breakeven point (Months)"
+ },
+ {
+ "columnId": "CostWithoutRI",
+ "label": "Cost Without RI"
+ },
+ {
+ "columnId": "CostWithRI",
+ "label": "Cost With RI"
+ },
+ {
+ "columnId": "Savings",
+ "label": "Savings"
+ },
+ {
+ "columnId": "LookBackPeriod",
+ "label": "Lookback Period"
+ }
+ ]
+ },
+ "sortBy": []
+ },
+ "name": "query - Reservations recommendations",
+ "styleSettings": {
+ "showBorder": true
+ }
+ }
+ ]
+ },
+ "conditionalVisibilities": [
+ {
+ "parameterName": "agreementType",
+ "comparison": "isEqualTo",
+ "value": "EA"
+ },
+ {
+ "parameterName": "billingAccount",
+ "comparison": "isNotEqualTo"
+ }
+ ],
+ "name": "group - EA"
+ }
+ ]
+ },
+ "conditionalVisibilities": [
+ {
+ "parameterName": "SelectedSubTab",
+ "comparison": "isEqualTo",
+ "value": "riRecommendations"
+ },
+ {
+ "parameterName": "selectedRateOptimizationTab",
+ "comparison": "isNotEqualTo",
+ "value": "AHB"
+ }
+ ],
+ "name": "Group Reservations Recommendations"
+ }
+ ]
+ },
+ "name": "group - 0"
+ }
+ ]
+ },
+ "conditionalVisibility": {
+ "parameterName": "selectedRateOptimizationSubTab",
+ "comparison": "isEqualTo",
+ "value": "reservations"
+ },
+ "name": "group - Reservations-preview"
+ },
+ {
+ "type": 12,
+ "content": {
+ "version": "NotebookGroup/1.0",
+ "groupType": "editable",
+ "items": [
+ {
+ "type": 9,
+ "content": {
+ "version": "KqlParameterItem/1.0",
+ "crossComponentResources": [
+ "{Subscription}"
+ ],
+ "parameters": [
+ {
+ "id": "a6ed5697-bc2e-442a-804f-a7c1ec3cb99b",
+ "version": "KqlParameterItem/1.0",
+ "name": "checkReservations",
+ "type": 1,
+ "query": "AdvisorResources \r\n| where type == 'microsoft.advisor/recommendations' \r\n| where properties.category == 'Cost' and properties.shortDescription.solution contains \"Reserved Instance\"\r\n| extend reservedResourceType=tostring(properties.extendedProperties.reservedResourceType)\r\n| distinct reservedResourceType\r\n",
+ "crossComponentResources": [
+ "{Subscription}"
+ ],
+ "timeContext": {
+ "durationMs": 86400000
+ },
+ "queryType": 1,
+ "resourceType": "microsoft.resourcegraph/resources"
+ }
+ ],
+ "style": "pills",
+ "queryType": 1,
+ "resourceType": "microsoft.resourcegraph/resources"
+ },
+ "conditionalVisibility": {
+ "parameterName": "AlwaysHidden",
+ "comparison": "isEqualTo",
+ "value": "true"
+ },
+ "name": "parameters - 3"
+ },
+ {
+ "type": 12,
+ "content": {
+ "version": "NotebookGroup/1.0",
+ "groupType": "editable",
+ "items": [
+ {
+ "type": 9,
+ "content": {
+ "version": "KqlParameterItem/1.0",
+ "crossComponentResources": [
+ "{Subscription}"
+ ],
+ "parameters": [
+ {
+ "id": "2b8ca845-75ba-4f4b-acad-54ee50d66d54",
+ "version": "KqlParameterItem/1.0",
+ "name": "LookBackPeriod",
+ "label": "Look back period",
+ "type": 2,
+ "isRequired": true,
+ "typeSettings": {
+ "additionalResourceOptions": [],
+ "showDefault": false
+ },
+ "jsonData": "[\r\n {\"value\": \"Last 7 days\"},\r\n {\"value\": \"Last 30 days\"},\r\n {\"value\": \"Last 60 days\"}\r\n]",
+ "timeContext": {
+ "durationMs": 86400000
+ },
+ "value": "Last 60 days"
+ },
+ {
+ "id": "953c9e4c-af03-4fb7-bf30-3f1bfdf09199",
+ "version": "KqlParameterItem/1.0",
+ "name": "term",
+ "label": "Term",
+ "type": 2,
+ "isRequired": true,
+ "typeSettings": {
+ "additionalResourceOptions": []
+ },
+ "jsonData": "[\r\n {\r\n \"value\": \"P1Y\",\r\n \"Selected\": \"true\"\r\n },\r\n {\r\n \"value\": \"P3Y\"\r\n }\r\n]",
+ "timeContext": {
+ "durationMs": 86400000
+ },
+ "value": "P3Y"
+ },
+ {
+ "id": "c46193fe-f1b2-49d1-a9bc-c9f5149f0194",
+ "version": "KqlParameterItem/1.0",
+ "name": "resourceType",
+ "label": "Resource type",
+ "type": 2,
+ "isRequired": true,
+ "multiSelect": true,
+ "quote": "'",
+ "delimiter": ",",
+ "query": "AdvisorResources \r\n| where type == 'microsoft.advisor/recommendations' \r\n| where properties.category == 'Cost' and properties.shortDescription.solution contains \"Reserved Instance\"\r\n| extend reservedResourceType=tostring(properties.extendedProperties.reservedResourceType)\r\n| distinct reservedResourceType",
+ "crossComponentResources": [
+ "{Subscription}"
+ ],
+ "typeSettings": {
+ "additionalResourceOptions": [
+ "value::all"
+ ],
+ "showDefault": false
+ },
+ "defaultValue": "value::all",
+ "queryType": 1,
+ "resourceType": "microsoft.resourcegraph/resources",
+ "value": [
+ "value::all"
+ ]
+ }
+ ],
+ "style": "pills",
+ "queryType": 1,
+ "resourceType": "microsoft.resourcegraph/resources"
+ },
+ "conditionalVisibility": {
+ "parameterName": "checkReservations",
+ "comparison": "isNotEqualTo"
+ },
+ "name": "parameters - reservationsParams"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "AdvisorResources \r\n| where type == 'microsoft.advisor/recommendations' \r\n| where properties.category == 'Cost' and properties.shortDescription.solution contains \"Reserved Instance\" \r\n| extend\r\nrecommendationTypeId = tostring(properties.recommendationTypeId),\r\nreservedResourceType=tostring(properties.extendedProperties.reservedResourceType),\r\nlookbackPeriod=tostring(strcat(\"Last \",properties.extendedProperties.lookbackPeriod,\" days\")),\r\nterm=tostring(properties.extendedProperties.term),\r\nstableId = name,\r\nsubscriptionId = tostring(properties.extendedProperties.subId)\r\n| where term == \"{term}\" and lookbackPeriod == \"{LookBackPeriod}\" and reservedResourceType in ({resourceType})\r\n| extend subscriptionId,stableId\r\n| join kind = leftouter\r\n(advisorresources | where type=~'microsoft.advisor/suppressions'\r\n| extend tokens = split(id, '/')\r\n| extend stableId = iff(array_length(tokens) > 3, tokens[(array_length(tokens)-3)], '')\r\n| extend expirationTimeStamp = todatetime(iff(strcmp(tostring(properties.ttl), '-1') == 0, '9999-12-31', properties.expirationTimeStamp))\r\n| where expirationTimeStamp > now()\r\n| project stableId, expirationTimeStamp)\r\non stableId\r\n| where isempty(expirationTimeStamp)\r\n| extend subscriptionId,stableId\r\n| join kind = leftouter\r\n(advisorresources \r\n| where type =~ 'microsoft.advisor/configurations'\r\n| where isempty(resourceGroup) == true\r\n| extend\r\nmaxCpuP95 = properties.extendedProperties.MaxCpuP95,\r\nlowCpuThreshold = properties.lowCpuThreshold,\r\nexcludeRecomm = properties.exclude,\r\nreservedResourceType=tostring(properties.extendedProperties.reservedResourceType),\r\nlookbackPeriod=tostring(strcat(\"Last \",properties.extendedProperties.lookbackPeriod,\" days\")),\r\nscope=tostring(properties.extendedProperties.scope),\r\nterm=tostring(properties.extendedProperties.term),\r\nsavings=todouble(properties.extendedProperties.annualSavingsAmount),\r\nsavingsAmount = todouble(properties.extendedProperties.savingsAmount),\r\nRecommendation=tostring(properties.shortDescription.solution), \r\ncurrency = tostring(properties.extendedProperties.savingsCurrency),\r\ndisplayQty = tostring(properties.extendedProperties.displayQty),\r\ndisplaySKU = tostring(properties.extendedProperties.displaySKU),\r\nregion = tostring(properties.extendedProperties.region),\r\nstableId = name,\r\nsubscriptionId = tostring(properties.extendedProperties.subId))\r\non subscriptionId\r\n| extend isActive1 = iff(isnull(excludeRecomm), true, tobool(excludeRecomm) == false)\r\n| extend isActive2 = iff(recommendationTypeId == 'e10b1381-5f0a-47ff-8c7b-37bd13d7c974', iff((isnotempty(lowCpuThreshold) and isnotempty(maxCpuP95)), toint(maxCpuP95) < toint(lowCpuThreshold), iff((isempty(maxCpuP95) or toint(maxCpuP95) < 5), true, false)), true)\r\n| where isActive1 == true and isActive2 == true\r\n| join kind = leftouter\r\n(advisorresources | where type =~ 'microsoft.advisor/configurations' | where isnotempty(resourceGroup) == true\r\n| project subscriptionId, resourceGroup, excludeProperty = properties.exclude)\r\non subscriptionId, resourceGroup\r\n| extend isActive3 = iff(isnull(excludeProperty), true, tobool(excludeProperty) == false)\r\n| where isActive3 == true\r\n| extend reservedResourceType=tostring(properties.extendedProperties.reservedResourceType),\r\nlookbackPeriod=tostring(strcat(\"Last \",properties.extendedProperties.lookbackPeriod,\" days\")),\r\nscope=tostring(properties.extendedProperties.scope),\r\nterm=tostring(properties.extendedProperties.term),\r\nsavings=todouble(properties.extendedProperties.annualSavingsAmount),\r\nsavingsAmount = todouble(properties.extendedProperties.savingsAmount),\r\nRecommendation=tostring(properties.shortDescription.solution), \r\ncurrency = tostring(properties.extendedProperties.savingsCurrency),\r\ndisplayQty = tostring(properties.extendedProperties.displayQty),\r\ndisplaySKU = tostring(properties.extendedProperties.displaySKU),\r\nregion = tostring(properties.extendedProperties.region),\r\nresources=tostring(properties.resourceMetadata.resourceId), \r\nsubscription = tostring(properties.extendedProperties.subId)\r\n| where term == \"{term}\" and lookbackPeriod == \"{LookBackPeriod}\" and reservedResourceType in ({resourceType})\r\n| summarize Subscriptions=dcount(resources), \r\n bin (sum(savings), 0.01) by Recommendation ,reservedResourceType ,lookbackPeriod,scope,term ,currency\r\n| order by sum_savings desc\r\n",
+ "size": 0,
+ "title": "Reservations Summary",
+ "noDataMessage": "No reservations recommendations found!",
+ "noDataMessageStyle": 3,
+ "queryType": 1,
+ "resourceType": "microsoft.resourcegraph/resources",
+ "crossComponentResources": [
+ "{Subscription}"
+ ],
+ "visualization": "categoricalbar",
+ "gridSettings": {
+ "filter": true,
+ "labelSettings": [
+ {
+ "columnId": "reservedResourceType",
+ "label": "Resource type"
+ },
+ {
+ "columnId": "lookbackPeriod",
+ "label": "Look back period"
+ },
+ {
+ "columnId": "scope",
+ "label": "Scope"
+ },
+ {
+ "columnId": "term",
+ "label": "Term"
+ },
+ {
+ "columnId": "currency",
+ "label": "Currency"
+ },
+ {
+ "columnId": "sum_savings",
+ "label": "Total annual savings"
+ }
+ ]
+ },
+ "chartSettings": {
+ "xAxis": "reservedResourceType",
+ "yAxis": [
+ "sum_savings"
+ ],
+ "group": "reservedResourceType",
+ "createOtherGroup": 0,
+ "showLegend": true,
+ "ySettings": {
+ "numberFormatSettings": {
+ "unit": 0,
+ "options": {
+ "style": "decimal",
+ "useGrouping": true
+ }
+ }
+ }
+ }
+ },
+ "conditionalVisibility": {
+ "parameterName": "checkReservations",
+ "comparison": "isNotEqualTo"
+ },
+ "name": "query - Reservations Summary"
+ },
+ {
+ "type": 3,
+ "content": {
+ "version": "KqlItem/1.0",
+ "query": "AdvisorResources \r\n| where type == 'microsoft.advisor/recommendations' \r\n| where properties.category == 'Cost' and properties.shortDescription.solution contains \"Reserved Instance\" \r\n| extend\r\nrecommendationTypeId = tostring(properties.recommendationTypeId),\r\nreservedResourceType=tostring(properties.extendedProperties.reservedResourceType),\r\nlookbackPeriod=tostring(strcat(\"Last \",properties.extendedProperties.lookbackPeriod,\" days\")),\r\nterm=tostring(properties.extendedProperties.term),\r\nstableId = name,\r\nsubscriptionId = tostring(properties.extendedProperties.subId)\r\n| where term == \"{term}\" and lookbackPeriod == \"{LookBackPeriod}\" and reservedResourceType in ({resourceType})\r\n| extend subscriptionId,stableId\r\n| join kind = leftouter\r\n(advisorresources | where type=~'microsoft.advisor/suppressions'\r\n| extend tokens = split(id, '/')\r\n| extend stableId = iff(array_length(tokens) > 3, tokens[(array_length(tokens)-3)], '')\r\n| extend expirationTimeStamp = todatetime(iff(strcmp(tostring(properties.ttl), '-1') == 0, '9999-12-31', properties.expirationTimeStamp))\r\n| where expirationTimeStamp > now()\r\n| project stableId, expirationTimeStamp)\r\non stableId\r\n| where isempty(expirationTimeStamp)\r\n| extend subscriptionId,stableId\r\n| join kind = leftouter\r\n(advisorresources \r\n| where type =~ 'microsoft.advisor/configurations'\r\n| where isempty(resourceGroup) == true\r\n| extend\r\nmaxCpuP95 = properties.extendedProperties.MaxCpuP95,\r\nlowCpuThreshold = properties.lowCpuThreshold,\r\nexcludeRecomm = properties.exclude,\r\nreservedResourceType=tostring(properties.extendedProperties.reservedResourceType),\r\nlookbackPeriod=tostring(strcat(\"Last \",properties.extendedProperties.lookbackPeriod,\" days\")),\r\nscope=tostring(properties.extendedProperties.scope),\r\nterm=tostring(properties.extendedProperties.term),\r\nRecommendation=tostring(properties.shortDescription.solution), \r\nstableId = name,\r\nsubscriptionId = tostring(properties.extendedProperties.subId))\r\non subscriptionId\r\n| extend isActive1 = iff(isnull(excludeRecomm), true, tobool(excludeRecomm) == false)\r\n| extend isActive2 = iff(recommendationTypeId == 'e10b1381-5f0a-47ff-8c7b-37bd13d7c974', iff((isnotempty(lowCpuThreshold) and isnotempty(maxCpuP95)), toint(maxCpuP95) < toint(lowCpuThreshold), iff((isempty(maxCpuP95) or toint(maxCpuP95) < 5), true, false)), true)\r\n| where isActive1 == true and isActive2 == true\r\n| join kind = leftouter\r\n(advisorresources | where type =~ 'microsoft.advisor/configurations' | where isnotempty(resourceGroup) == true\r\n| project subscriptionId, resourceGroup, excludeProperty = properties.exclude)\r\non subscriptionId, resourceGroup\r\n| extend isActive3 = iff(isnull(excludeProperty), true, tobool(excludeProperty) == false)\r\n| where isActive3 == true\r\n| extend reservedResourceType=tostring(properties.extendedProperties.reservedResourceType),\r\nlookbackPeriod=tostring(strcat(\"Last \",properties.extendedProperties.lookbackPeriod,\" days\")),\r\nscope=tostring(properties.extendedProperties.scope),\r\nterm=tostring(properties.extendedProperties.term),\r\nsavings=todouble(properties.extendedProperties.annualSavingsAmount),\r\nsavingsAmount = todouble(properties.extendedProperties.savingsAmount),\r\nRecommendation=tostring(properties.shortDescription.solution), \r\ncurrency = tostring(properties.extendedProperties.savingsCurrency),\r\ndisplayQty = tostring(properties.extendedProperties.displayQty),\r\ndisplaySKU = tostring(properties.extendedProperties.displaySKU),\r\nregion = tostring(properties.extendedProperties.region),\r\nsubscription = tostring(properties.extendedProperties.subId)\r\n| where term == \"{term}\" and lookbackPeriod == \"{LookBackPeriod}\" and reservedResourceType in ({resourceType})\r\n| project Recommendation,reservedResourceType,displaySKU,displayQty,savings,currency,lookbackPeriod,term,region,subscription\r\n| order by savings desc\r\n",
+ "size": 0,
+ "title": "Reservations details",
+ "noDataMessage": "No reservations recommendations found!",
+ "noDataMessageStyle": 3,
+ "queryType": 1,
+ "resourceType": "microsoft.resourcegraph/resources",
+ "crossComponentResources": [
+ "{Subscription}"
+ ],
+ "gridSettings": {
+ "formatters": [
+ {
+ "columnMatch": "$gen_group",
+ "formatter": 15,
+ "formatOptions": {
+ "linkTarget": null,
+ "showIcon": true
+ }
+ },
+ {
+ "columnMatch": "Recommendation",
+ "formatter": 5
+ },
+ {
+ "columnMatch": "reservedResourceType",
+ "formatter": 5
+ },
+ {
+ "columnMatch": "subscription",
+ "formatter": 15,
+ "formatOptions": {
+ "linkTarget": null,
+ "showIcon": true
+ }
+ }
+ ],
+ "filter": true,
+ "hierarchySettings": {
+ "treeType": 1,
+ "groupBy": [
+ "subscription",
+ "reservedResourceType"
+ ],
+ "expandTopLevel": false
+ },
+ "labelSettings": [
+ {
+ "columnId": "displaySKU",
+ "label": "SKU"
+ },
+ {
+ "columnId": "displayQty",
+ "label": "Quantity"
+ },
+ {
+ "columnId": "savings",
+ "label": "Total annual savings"
+ },
+ {
+ "columnId": "currency",
+ "label": "Currency"
+ },
+ {
+ "columnId": "lookbackPeriod",
+ "label": "Look back period"
+ },
+ {
+ "columnId": "term",
+ "label": "Term"
+ },
+ {
+ "columnId": "region",
+ "label": "Region"
+ },
+ {
+ "columnId": "subscription",
+ "label": "Subscription"
+ }
+ ]
+ },
+ "chartSettings": {
+ "xAxis": "reservedResourceType",
+ "yAxis": [
+ "sum_savings"
+ ],
+ "group": "reservedResourceType",
+ "createOtherGroup": 0,
+ "showLegend": true,
+ "ySettings": {
+ "numberFormatSettings": {
+ "unit": 0,
+ "options": {
+ "style": "decimal",
+ "useGrouping": true
+ }
+ }
+ }
+ }
+ },
+ "conditionalVisibility": {
+ "parameterName": "checkReservations",
+ "comparison": "isNotEqualTo",
+ "value": ""
+ },
+ "name": "query - Reservations details"
+ },
+ {
+ "type": 1,
+ "content": {
+ "json": "No Azure Advisor reservations recommendations were found for the selected subscription(s). For further details, please review the Azure Advisor Cost Optimization recommendations.",
+ "style": "warning"
+ },
+ "conditionalVisibility": {
+ "parameterName": "checkReservations",
+ "comparison": "isEqualTo"
+ },
+ "name": "NoReservationFound"
+ }
+ ]
+ },
+ "conditionalVisibility": {
+ "parameterName": "checkReservations",
+ "comparison": "isNotEqualTo"
+ },
+ "name": "group - 0"
+ }
+ ]
+ },
+ "conditionalVisibility": {
+ "parameterName": "selectedRateOptimizationSubTab",
+ "comparison": "isEqualTo",
+ "value": "reservations"
+ },
+ "name": "group - Reservations"
+ },
+ {
+ "type": 12,
+ "content": {
+ "version": "NotebookGroup/1.0",
+ "groupType": "template",
+ "loadFromTemplateId": "community-Workbooks/Azure Advisor/Cost Optimization/SavingsPlan",
+ "items": []
+ },
+ "conditionalVisibility": {
+ "parameterName": "selectedRateOptimizationSubTab",
+ "comparison": "isEqualTo",
+ "value": "SavingsPlan"
+ },
+ "name": "group - SavingsPlan"
+ }
+ ]
+ },
+ "name": "group - 0"
+ }
+ ]
+ },
+ "name": "group - 0"
+ }
+ ],
+ "fallbackResourceIds": [
+ "Azure Advisor"
+ ],
+ "$schema": "https://github.com/Microsoft/Application-Insights-Workbooks/blob/master/schema/workbook.json"
+}