From 728740f0c69087c556cc14f8ccb3fe2386d7c228 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 10 Oct 2025 20:29:12 +0000
Subject: [PATCH 01/15] Initial plan
From 605f8c1ad340a21e447de754972dd2f7e41a9494 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 10 Oct 2025 20:34:26 +0000
Subject: [PATCH 02/15] Add detailed filtering guidance for ARG payload size
errors
Co-authored-by: MSBrett <24294904+MSBrett@users.noreply.github.com>
---
docs-mslearn/toolkit/help/errors.md | 57 +++++++++++++++++++--
docs-mslearn/toolkit/power-bi/governance.md | 12 +++++
2 files changed, 66 insertions(+), 3 deletions(-)
diff --git a/docs-mslearn/toolkit/help/errors.md b/docs-mslearn/toolkit/help/errors.md
index e774b2da8..a16ea3a15 100644
--- a/docs-mslearn/toolkit/help/errors.md
+++ b/docs-mslearn/toolkit/help/errors.md
@@ -507,9 +507,60 @@ This error means that you have more resources than are supported in an unfiltere
**Mitigation**: If you experience this error, there are several options:
-- Remove columns that are not necessary for your needs.
-- Filter the query to return fewer resources based on what's most important for you (e.g., subscriptions, tags).
-- Disable the query so it doesn't block other queries from running.
+### Option 1: Filter by subscription
+
+Modify the Azure Resource Graph queries to filter by specific subscriptions:
+
+1. Open Power BI Desktop and select **Transform data** from the ribbon.
+2. In the **Queries** pane on the left, expand the **Resource Graph** folder.
+3. Select the query that's failing (e.g., **NetworkSecurityGroups**, **Resources**).
+4. In the query editor, find the `query = "` section in the formula bar.
+5. Add a filter clause to the query. For example, to filter by subscription:
+
+ ```kusto
+ | where subscriptionId in~ ('subscription-id-1', 'subscription-id-2')
+ ```
+
+ Add this line after the `resources` line and before any `| extend` clauses.
+
+6. Select **Close & Apply** to save changes.
+
+### Option 2: Filter by tags
+
+If your resources use tags to organize by environment, cost center, or other criteria, you can filter by tags:
+
+1. Follow steps 1-4 from Option 1.
+2. Add a tag filter to the query:
+
+ ```kusto
+ | where tags.Environment in~ ('Production', 'Staging')
+ ```
+
+ Or filter by multiple tag conditions:
+
+ ```kusto
+ | where tags.CostCenter == '12345' and tags.Environment =~ 'Production'
+ ```
+
+### Option 3: Remove unnecessary columns
+
+Reduce the payload size by removing columns you don't need:
+
+1. Open the query in Power Query Editor (steps 1-3 from Option 1).
+2. In the query text, remove column names from the `extend` or `project` statements that you don't need for your analysis.
+3. Be careful not to remove columns that are used in report visuals or relationships.
+
+### Option 4: Disable problematic queries
+
+If a specific query consistently fails and isn't critical to your needs:
+
+1. In Power Query Editor, right-click the failing query in the **Queries** pane.
+2. Uncheck **Enable load** to prevent the query from loading data.
+3. The query will remain in the report but won't execute during refresh.
+
+For more information about Azure Resource Graph limits and pagination, see:
+- [Working with large Azure resource data sets](/azure/governance/resource-graph/concepts/work-with-data)
+- [Troubleshoot errors using Azure Resource Graph](/azure/governance/resource-graph/troubleshoot/general)
diff --git a/docs-mslearn/toolkit/power-bi/governance.md b/docs-mslearn/toolkit/power-bi/governance.md
index 2246fd834..d2610fc2f 100644
--- a/docs-mslearn/toolkit/power-bi/governance.md
+++ b/docs-mslearn/toolkit/power-bi/governance.md
@@ -30,6 +30,18 @@ This report pulls data from:
The Governance report is new and still being fleshed out. We will continue to expand capabilities in each release in alignment with the [Cost optimization workbook](../workbooks/optimization.md). To request additional capabilities, please [create a feature request](https://aka.ms/ftk/ideas) in GitHub.
+## Known limitations
+
+The Governance report uses Azure Resource Graph to query resource details. Azure Resource Graph has a response payload limit of 16 MB per query. The report is designed for small- and medium-sized environments and may not work for organizations with millions of resources.
+
+If you experience a "Response payload size... exceeded the limit" error, try the following:
+
+- **Filter by subscription or tags** – Update queries in Power Query Editor to filter resources by specific subscriptions or tags that are most important for your governance reporting.
+- **Remove unnecessary columns** – Edit queries to remove columns that aren't needed for your analysis to reduce the payload size.
+- **Disable problematic queries** – If a specific query consistently fails, you can disable it in Power Query Editor to allow other queries to load successfully.
+
+For detailed troubleshooting steps, see [Response payload size exceeded the limit](../help/errors.md#response-payload-size-is-and-has-exceeded-the-limit) in the error reference guide.
+
> [!div class="nextstepaction"]
> [Download for KQL](https://github.com/microsoft/finops-toolkit/releases/latest/download/PowerBI-kql.zip)
> [!div class="nextstepaction"]
From 0de9cd4b4f5cb4582159113b25998916010967a3 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 10 Oct 2025 20:35:58 +0000
Subject: [PATCH 03/15] Add changelog entry for ARG payload documentation
improvements
Co-authored-by: MSBrett <24294904+MSBrett@users.noreply.github.com>
---
docs-mslearn/toolkit/changelog.md | 4 ++++
.../toolkit/power-bi/workload-optimization.md | 12 ++++++++++++
2 files changed, 16 insertions(+)
diff --git a/docs-mslearn/toolkit/changelog.md b/docs-mslearn/toolkit/changelog.md
index 7c5d94e4b..8ec6bdc7f 100644
--- a/docs-mslearn/toolkit/changelog.md
+++ b/docs-mslearn/toolkit/changelog.md
@@ -40,6 +40,10 @@ The following section lists features and enhancements that are currently in deve
### Documentation improvements
+- **Added**
+ - Added detailed mitigation guidance for [Azure Resource Graph payload size limit errors](help/errors.md#response-payload-size-is-and-has-exceeded-the-limit) with step-by-step instructions for filtering by subscription, tags, and removing columns.
+ - Added "Known limitations" section to [Governance report](power-bi/governance.md) and [Workload optimization report](power-bi/workload-optimization.md) documentation explaining Azure Resource Graph payload limits and when to use filtering.
+
### [Power BI reports](power-bi/reports.md) v13
diff --git a/docs-mslearn/toolkit/power-bi/workload-optimization.md b/docs-mslearn/toolkit/power-bi/workload-optimization.md
index d32097b6f..78cc46f88 100644
--- a/docs-mslearn/toolkit/power-bi/workload-optimization.md
+++ b/docs-mslearn/toolkit/power-bi/workload-optimization.md
@@ -26,6 +26,18 @@ This report pulls data from:
The Workload optimization report is new and still in development. We will continue to expand capabilities in each release in alignment with the [Cost optimization workbook](../workbooks/optimization.md). To request other capabilities, [create a feature request](https://aka.ms/ftk/ideas) in GitHub.
+## Known limitations
+
+The Workload optimization report uses Azure Resource Graph to query resource details. Azure Resource Graph has a response payload limit of 16 MB per query. The report is designed for small- and medium-sized environments and may not work for organizations with millions of resources.
+
+If you experience a "Response payload size... exceeded the limit" error, try the following:
+
+- **Filter by subscription or tags** – Update queries in Power Query Editor to filter resources by specific subscriptions or tags that are most important for your workload optimization.
+- **Remove unnecessary columns** – Edit queries to remove columns that aren't needed for your analysis to reduce the payload size.
+- **Disable problematic queries** – If a specific query consistently fails, you can disable it in Power Query Editor to allow other queries to load successfully.
+
+For detailed troubleshooting steps, see [Response payload size exceeded the limit](../help/errors.md#response-payload-size-is-and-has-exceeded-the-limit) in the error reference guide.
+
> [!div class="nextstepaction"]
> [Download for KQL](https://github.com/microsoft/finops-toolkit/releases/latest/download/PowerBI-kql.zip)
> [!div class="nextstepaction"]
From f6e38089801f5603128d25b038b46d9f8df9c78c Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
Date: Wed, 11 Mar 2026 00:18:59 +0000
Subject: [PATCH 04/15] chore: Update ms.date in docs-mslearn files
---
docs-mslearn/toolkit/changelog.md | 2 +-
docs-mslearn/toolkit/help/errors.md | 2 +-
docs-mslearn/toolkit/power-bi/governance.md | 2 +-
docs-mslearn/toolkit/power-bi/workload-optimization.md | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/docs-mslearn/toolkit/changelog.md b/docs-mslearn/toolkit/changelog.md
index de99c6cdf..f150a5e33 100644
--- a/docs-mslearn/toolkit/changelog.md
+++ b/docs-mslearn/toolkit/changelog.md
@@ -3,7 +3,7 @@ title: FinOps toolkit changelog
description: Review the latest features and enhancements in the FinOps toolkit, including updates to FinOps hubs, Power BI reports, and more.
author: MSBrett
ms.author: brettwil
-ms.date: 03/04/2026
+ms.date: 03/11/2026
ms.topic: reference
ms.service: finops
ms.subservice: finops-toolkit
diff --git a/docs-mslearn/toolkit/help/errors.md b/docs-mslearn/toolkit/help/errors.md
index ca18d82cb..98da75a3a 100644
--- a/docs-mslearn/toolkit/help/errors.md
+++ b/docs-mslearn/toolkit/help/errors.md
@@ -3,7 +3,7 @@ title: Troubleshoot common FinOps toolkit errors
description: This article describes common FinOps toolkit errors and provides solutions to help you resolve issues you might encounter.
author: flanakin
ms.author: micflan
-ms.date: 02/24/2026
+ms.date: 03/11/2026
ms.topic: troubleshooting
ms.service: finops
ms.subservice: finops-toolkit
diff --git a/docs-mslearn/toolkit/power-bi/governance.md b/docs-mslearn/toolkit/power-bi/governance.md
index fffaedfe9..f4f3ae467 100644
--- a/docs-mslearn/toolkit/power-bi/governance.md
+++ b/docs-mslearn/toolkit/power-bi/governance.md
@@ -3,7 +3,7 @@ title: FinOps toolkit Governance report
description: Summarize cloud governance posture including areas like compliance, security, operations, and resource management in Power BI.
author: flanakin
ms.author: micflan
-ms.date: 02/24/2026
+ms.date: 03/11/2026
ms.topic: concept-article
ms.service: finops
ms.subservice: finops-toolkit
diff --git a/docs-mslearn/toolkit/power-bi/workload-optimization.md b/docs-mslearn/toolkit/power-bi/workload-optimization.md
index cb49e8186..f96e5f3b1 100644
--- a/docs-mslearn/toolkit/power-bi/workload-optimization.md
+++ b/docs-mslearn/toolkit/power-bi/workload-optimization.md
@@ -3,7 +3,7 @@ title: FinOps toolkit Workload optimization report
description: Learn about the Workload optimization report, which identifies opportunities for rightsizing and removing unused resources to enhance efficiency.
author: flanakin
ms.author: micflan
-ms.date: 02/24/2026
+ms.date: 03/11/2026
ms.topic: concept-article
ms.service: finops
ms.subservice: finops-toolkit
From d43608abd5828cf1e169cb9d995639b22b359a0f Mon Sep 17 00:00:00 2001
From: Michael Flanakin
Date: Tue, 10 Mar 2026 17:34:51 -0700
Subject: [PATCH 05/15] Apply suggestions
---
docs-mslearn/toolkit/changelog.md | 8 +++++---
docs-mslearn/toolkit/help/errors.md | 2 +-
docs-mslearn/toolkit/power-bi/governance.md | 10 ++--------
docs-mslearn/toolkit/power-bi/workload-optimization.md | 10 ++--------
4 files changed, 10 insertions(+), 20 deletions(-)
diff --git a/docs-mslearn/toolkit/changelog.md b/docs-mslearn/toolkit/changelog.md
index f150a5e33..2fcf469bf 100644
--- a/docs-mslearn/toolkit/changelog.md
+++ b/docs-mslearn/toolkit/changelog.md
@@ -37,9 +37,6 @@ The following section lists features and enhancements that are currently in deve
### [Implementing FinOps guide](../implementing-finops-guide.md) v14
-- **Added**
- - Added detailed mitigation guidance for [Azure Resource Graph payload size limit errors](help/errors.md#response-payload-size-is-and-has-exceeded-the-limit) with step-by-step instructions for filtering by subscription, tags, and removing columns.
- - Added "Known limitations" section to [Governance report](power-bi/governance.md) and [Workload optimization report](power-bi/workload-optimization.md) documentation explaining Azure Resource Graph payload limits and when to use filtering.
- **Fixed**
- Updated FinOps Foundation video on the overview page to use the latest public video ([#2026](https://github.com/microsoft/finops-toolkit/issues/2026)).
- **Removed**
@@ -73,6 +70,11 @@ The following section lists features and enhancements that are currently in deve
- Fixed inverted verbose logging in [Start-FinOpsCostExport](powershell/cost-management/Start-FinOpsCostExport.md) that showed blank dates when a date range was specified.
- Addressed minor lint warnings across PowerShell commands.
+### [Power BI reports](power-bi/reports.md) v14
+
+- **Added**
+ - Document [payload size limit](help/errors.md#response-payload-size-is-and-has-exceeded-the-limit) mitigation guidance and known limitations to the [Governance](power-bi/governance.md) and [Workload optimization](power-bi/workload-optimization.md) report docs ([#1768](https://github.com/microsoft/finops-toolkit/issues/1768)).
+
## v13 Update 1
diff --git a/docs-mslearn/toolkit/help/errors.md b/docs-mslearn/toolkit/help/errors.md
index 98da75a3a..b9d4d84f8 100644
--- a/docs-mslearn/toolkit/help/errors.md
+++ b/docs-mslearn/toolkit/help/errors.md
@@ -747,7 +747,7 @@ Azure Resource Graph queries in the Governance and Workload optimization Power B
> _OLE DB or ODBC error: [Expression.Error] Please provide below info when asking for support: timestamp = {timestamp}, correlationId = {guid}. Details: Response payload size is {number}, and has exceeded the limit of 16777216. Please consider querying less data at a time and make paginated call if needed._
-This error means that you have more resources than are supported in an unfiltered Resource Graph query. This happens because FinOps toolkit reports are designed to show resource-level details and are not aggregated. They are designed for small- and medium-sized environments and not designed to support organizations with millions of resources.
+This error means that you have more resources than are supported in an unfiltered Resource Graph query. This happens because FinOps toolkit reports are designed to show resource-level details and are not aggregated. They are designed for small and medium-sized environments and not designed to support organizations with millions of resources.
**Mitigation**: If you experience this error, there are several options:
diff --git a/docs-mslearn/toolkit/power-bi/governance.md b/docs-mslearn/toolkit/power-bi/governance.md
index f4f3ae467..579cf95d2 100644
--- a/docs-mslearn/toolkit/power-bi/governance.md
+++ b/docs-mslearn/toolkit/power-bi/governance.md
@@ -121,15 +121,9 @@ The **Network security groups** page lists network security groups and network s
## Known limitations
-The Governance report uses Azure Resource Graph to query resource details. Azure Resource Graph has a response payload limit of 16 MB per query. The report is designed for small- and medium-sized environments and may not work for organizations with millions of resources.
+The Governance report uses Azure Resource Graph to query resource details. Azure Resource Graph has a response payload limit of 16 MB per query. The report is designed for small and medium-sized environments and may not work for organizations with millions of resources.
-If you experience a "Response payload size... exceeded the limit" error, try the following:
-
-- **Filter by subscription or tags** – Update queries in Power Query Editor to filter resources by specific subscriptions or tags that are most important for your governance reporting.
-- **Remove unnecessary columns** – Edit queries to remove columns that aren't needed for your analysis to reduce the payload size.
-- **Disable problematic queries** – If a specific query consistently fails, you can disable it in Power Query Editor to allow other queries to load successfully.
-
-For detailed troubleshooting steps, see [Response payload size exceeded the limit](../help/errors.md#response-payload-size-is-and-has-exceeded-the-limit) in the error reference guide.
+If you experience a "Response payload size... exceeded the limit" error, try filtering queries to specific subscriptions or removing unnecessary columns. For detailed steps, see [Response payload size exceeded the limit](../help/errors.md#response-payload-size-is-and-has-exceeded-the-limit) in the error reference guide.
diff --git a/docs-mslearn/toolkit/power-bi/workload-optimization.md b/docs-mslearn/toolkit/power-bi/workload-optimization.md
index f96e5f3b1..81d362008 100644
--- a/docs-mslearn/toolkit/power-bi/workload-optimization.md
+++ b/docs-mslearn/toolkit/power-bi/workload-optimization.md
@@ -81,15 +81,9 @@ The chart shows the cost of each disk over time. The table shows the disks with
## Known limitations
-The Workload optimization report uses Azure Resource Graph to query resource details. Azure Resource Graph has a response payload limit of 16 MB per query. The report is designed for small- and medium-sized environments and may not work for organizations with millions of resources.
+The Workload optimization report uses Azure Resource Graph to query resource details. Azure Resource Graph has a response payload limit of 16 MB per query. The report is designed for small and medium-sized environments and may not work for organizations with millions of resources.
-If you experience a "Response payload size... exceeded the limit" error, try the following:
-
-- **Filter by subscription or tags** – Update queries in Power Query Editor to filter resources by specific subscriptions or tags that are most important for your workload optimization.
-- **Remove unnecessary columns** – Edit queries to remove columns that aren't needed for your analysis to reduce the payload size.
-- **Disable problematic queries** – If a specific query consistently fails, you can disable it in Power Query Editor to allow other queries to load successfully.
-
-For detailed troubleshooting steps, see [Response payload size exceeded the limit](../help/errors.md#response-payload-size-is-and-has-exceeded-the-limit) in the error reference guide.
+If you experience a "Response payload size... exceeded the limit" error, try filtering queries to specific subscriptions or removing unnecessary columns. For detailed steps, see [Response payload size exceeded the limit](../help/errors.md#response-payload-size-is-and-has-exceeded-the-limit) in the error reference guide.
From 5ac86241fb068470bfc44d5136a4eb7836480ccb Mon Sep 17 00:00:00 2001
From: Michael Flanakin
Date: Wed, 11 Mar 2026 03:18:13 -0700
Subject: [PATCH 06/15] Add subscription batching
---
docs-mslearn/toolkit/changelog.md | 4 +-
docs-mslearn/toolkit/help/errors.md | 49 +-
docs-mslearn/toolkit/power-bi/governance.md | 4 +-
.../toolkit/power-bi/workload-optimization.md | 4 +-
.../definition/expressions.tmdl | 50 +-
.../tables/AdvisorRecommendations.tmdl | 13 +-
.../AdvisorReservationRecommendations.tmdl | 172 +++++-
.../definition/tables/Disks.tmdl | 6 +-
.../definition/tables/NetworkInterfaces.tmdl | 6 +-
.../tables/NetworkSecurityGroups.tmdl | 6 +-
.../definition/tables/PolicyAssignments.tmdl | 7 +-
.../definition/tables/PolicyStates.tmdl | 7 +-
.../definition/tables/PublicIPAddresses.tmdl | 6 +-
.../definition/tables/Resources.tmdl | 6 +-
.../definition/tables/SqlDatabases.tmdl | 6 +-
.../definition/tables/VirtualMachines.tmdl | 6 +-
.../definition/expressions.tmdl | 58 +-
.../tables/AdvisorRecommendations.tmdl | 550 +-----------------
.../AdvisorReservationRecommendations.tmdl | 548 +----------------
.../definition/tables/Disks.tmdl | 225 +------
.../definition/tables/ManagementGroups.tmdl | 155 +----
.../definition/tables/NetworkInterfaces.tmdl | 360 +-----------
.../tables/NetworkSecurityGroups.tmdl | 250 +-------
.../definition/tables/PolicyAssignments.tmdl | 307 +---------
.../definition/tables/PolicyStates.tmdl | 277 +--------
.../definition/tables/PublicIPAddresses.tmdl | 117 +---
.../definition/tables/Resources.tmdl | 115 +---
.../definition/tables/SqlDatabases.tmdl | 288 +--------
.../definition/tables/Subscriptions.tmdl | 176 +-----
.../definition/tables/VirtualMachines.tmdl | 537 +----------------
30 files changed, 328 insertions(+), 3987 deletions(-)
mode change 100644 => 120000 src/power-bi/storage/Shared.Dataset/definition/tables/AdvisorRecommendations.tmdl
mode change 100644 => 120000 src/power-bi/storage/Shared.Dataset/definition/tables/AdvisorReservationRecommendations.tmdl
mode change 100644 => 120000 src/power-bi/storage/Shared.Dataset/definition/tables/Disks.tmdl
mode change 100644 => 120000 src/power-bi/storage/Shared.Dataset/definition/tables/ManagementGroups.tmdl
mode change 100644 => 120000 src/power-bi/storage/Shared.Dataset/definition/tables/NetworkInterfaces.tmdl
mode change 100644 => 120000 src/power-bi/storage/Shared.Dataset/definition/tables/NetworkSecurityGroups.tmdl
mode change 100644 => 120000 src/power-bi/storage/Shared.Dataset/definition/tables/PolicyAssignments.tmdl
mode change 100644 => 120000 src/power-bi/storage/Shared.Dataset/definition/tables/PolicyStates.tmdl
mode change 100644 => 120000 src/power-bi/storage/Shared.Dataset/definition/tables/PublicIPAddresses.tmdl
mode change 100644 => 120000 src/power-bi/storage/Shared.Dataset/definition/tables/Resources.tmdl
mode change 100644 => 120000 src/power-bi/storage/Shared.Dataset/definition/tables/SqlDatabases.tmdl
mode change 100644 => 120000 src/power-bi/storage/Shared.Dataset/definition/tables/Subscriptions.tmdl
mode change 100644 => 120000 src/power-bi/storage/Shared.Dataset/definition/tables/VirtualMachines.tmdl
diff --git a/docs-mslearn/toolkit/changelog.md b/docs-mslearn/toolkit/changelog.md
index 2fcf469bf..2e8d0e235 100644
--- a/docs-mslearn/toolkit/changelog.md
+++ b/docs-mslearn/toolkit/changelog.md
@@ -72,8 +72,8 @@ The following section lists features and enhancements that are currently in deve
### [Power BI reports](power-bi/reports.md) v14
-- **Added**
- - Document [payload size limit](help/errors.md#response-payload-size-is-and-has-exceeded-the-limit) mitigation guidance and known limitations to the [Governance](power-bi/governance.md) and [Workload optimization](power-bi/workload-optimization.md) report docs ([#1768](https://github.com/microsoft/finops-toolkit/issues/1768)).
+- **Fixed**
+ - Paginate Azure Resource Graph queries by subscription to mitigate [payload size limit](help/errors.md#response-payload-size-is-and-has-exceeded-the-limit) errors in the [Governance](power-bi/governance.md) and [Workload optimization](power-bi/workload-optimization.md) reports ([#1768](https://github.com/microsoft/finops-toolkit/issues/1768)).
diff --git a/docs-mslearn/toolkit/help/errors.md b/docs-mslearn/toolkit/help/errors.md
index b9d4d84f8..393c858ad 100644
--- a/docs-mslearn/toolkit/help/errors.md
+++ b/docs-mslearn/toolkit/help/errors.md
@@ -747,54 +747,51 @@ Azure Resource Graph queries in the Governance and Workload optimization Power B
> _OLE DB or ODBC error: [Expression.Error] Please provide below info when asking for support: timestamp = {timestamp}, correlationId = {guid}. Details: Response payload size is {number}, and has exceeded the limit of 16777216. Please consider querying less data at a time and make paginated call if needed._
-This error means that you have more resources than are supported in an unfiltered Resource Graph query. This happens because FinOps toolkit reports are designed to show resource-level details and are not aggregated. They are designed for small and medium-sized environments and not designed to support organizations with millions of resources.
+Azure Resource Graph enforces a 16 MB response payload limit per query. FinOps toolkit reports automatically paginate queries in batches of subscriptions (default: 100 per batch) to stay within this limit, so most environments should not encounter this error. If you still see it, it means the resources in a single batch of subscriptions exceed the 16 MB limit.
-**Mitigation**: If you experience this error, there are several options:
+**Mitigation**: Try the following options in order:
-### Option 1: Filter by subscription
+### Option 1: Reduce the batch size
-Modify the Azure Resource Graph queries to filter by specific subscriptions:
+Reduce the number of subscriptions queried in each batch:
+
+1. Open Power BI Desktop and select **Transform data** from the ribbon.
+2. In the **Queries** pane on the left, expand the **Functions** folder.
+3. Select the **ftk_ARGBatchSize** function.
+4. Change the return value from `100` to a smaller number (e.g., `20` or `10`).
+5. Select **Close & Apply** to save changes.
+
+### Option 2: Filter by resource group or tags
+
+Add a filter clause to the failing query to reduce the number of resources returned:
1. Open Power BI Desktop and select **Transform data** from the ribbon.
2. In the **Queries** pane on the left, expand the **Resource Graph** folder.
3. Select the query that's failing (e.g., **NetworkSecurityGroups**, **Resources**).
4. In the query editor, find the `query = "` section in the formula bar.
-5. Add a filter clause to the query. For example, to filter by subscription:
+5. Add a filter clause after the `| where type` line and before any `| extend` clauses. For example:
```kusto
- | where subscriptionId in~ ('subscription-id-1', 'subscription-id-2')
+ | where resourceGroup in~ ('rg-production', 'rg-staging')
```
- Add this line after the `resources` line and before any `| extend` clauses.
-
-6. Select **Close & Apply** to save changes.
-
-### Option 2: Filter by tags
-
-If your resources use tags to organize by environment, cost center, or other criteria, you can filter by tags:
-
-1. Follow steps 1-4 from Option 1.
-2. Add a tag filter to the query:
+ Or filter by tags:
```kusto
- | where tags.Environment in~ ('Production', 'Staging')
+ | where tags.Environment =~ 'Production'
```
- Or filter by multiple tag conditions:
-
- ```kusto
- | where tags.CostCenter == '12345' and tags.Environment =~ 'Production'
- ```
+6. Select **Close & Apply** to save changes.
### Option 3: Remove unnecessary columns
Reduce the payload size by removing columns you don't need:
-1. Open the query in Power Query Editor (steps 1-3 from Option 1).
+1. Open the query in Power Query Editor (steps 1-3 from Option 2).
2. In the query text, remove column names from the `extend` or `project` statements that you don't need for your analysis.
3. Be careful not to remove columns that are used in report visuals or relationships.
-### Option 4: Disable problematic queries
+### Option 4: Disable the failing query
If a specific query consistently fails and isn't critical to your needs:
@@ -802,9 +799,7 @@ If a specific query consistently fails and isn't critical to your needs:
2. Uncheck **Enable load** to prevent the query from loading data.
3. The query will remain in the report but won't execute during refresh.
-For more information about Azure Resource Graph limits and pagination, see:
-- [Working with large Azure resource data sets](/azure/governance/resource-graph/concepts/work-with-data)
-- [Troubleshoot errors using Azure Resource Graph](/azure/governance/resource-graph/troubleshoot/general)
+For more information about Azure Resource Graph limits, see [Working with large Azure resource data sets](/azure/governance/resource-graph/concepts/work-with-data).
diff --git a/docs-mslearn/toolkit/power-bi/governance.md b/docs-mslearn/toolkit/power-bi/governance.md
index 579cf95d2..9a6456e72 100644
--- a/docs-mslearn/toolkit/power-bi/governance.md
+++ b/docs-mslearn/toolkit/power-bi/governance.md
@@ -121,9 +121,9 @@ The **Network security groups** page lists network security groups and network s
## Known limitations
-The Governance report uses Azure Resource Graph to query resource details. Azure Resource Graph has a response payload limit of 16 MB per query. The report is designed for small and medium-sized environments and may not work for organizations with millions of resources.
+The Governance report uses Azure Resource Graph to query resource details. Azure Resource Graph has a response payload limit of 16 MB per query. The report automatically paginates queries in batches of subscriptions to stay within this limit, but may not work for large environments where a single batch exceeds the limit.
-If you experience a "Response payload size... exceeded the limit" error, try filtering queries to specific subscriptions or removing unnecessary columns. For detailed steps, see [Response payload size exceeded the limit](../help/errors.md#response-payload-size-is-and-has-exceeded-the-limit) in the error reference guide.
+If you experience a "Response payload size... exceeded the limit" error, open the report in Power BI Desktop, go to the Power Query editor, and reduce the value returned by the `ftk_ARGBatchSize` function (default: 100). For detailed steps, see [Response payload size exceeded the limit](../help/errors.md#response-payload-size-is-and-has-exceeded-the-limit) in the error reference guide.
diff --git a/docs-mslearn/toolkit/power-bi/workload-optimization.md b/docs-mslearn/toolkit/power-bi/workload-optimization.md
index 81d362008..ab4d20abd 100644
--- a/docs-mslearn/toolkit/power-bi/workload-optimization.md
+++ b/docs-mslearn/toolkit/power-bi/workload-optimization.md
@@ -81,9 +81,9 @@ The chart shows the cost of each disk over time. The table shows the disks with
## Known limitations
-The Workload optimization report uses Azure Resource Graph to query resource details. Azure Resource Graph has a response payload limit of 16 MB per query. The report is designed for small and medium-sized environments and may not work for organizations with millions of resources.
+The Workload optimization report uses Azure Resource Graph to query resource details. Azure Resource Graph has a response payload limit of 16 MB per query. The report automatically paginates queries in batches of subscriptions to stay within this limit, but may not work for large environments where a single batch exceeds the limit.
-If you experience a "Response payload size... exceeded the limit" error, try filtering queries to specific subscriptions or removing unnecessary columns. For detailed steps, see [Response payload size exceeded the limit](../help/errors.md#response-payload-size-is-and-has-exceeded-the-limit) in the error reference guide.
+If you experience a "Response payload size... exceeded the limit" error, open the report in Power BI Desktop, go to the Power Query editor, and reduce the value returned by the `ftk_ARGBatchSize` function (default: 100). For detailed steps, see [Response payload size exceeded the limit](../help/errors.md#response-payload-size-is-and-has-exceeded-the-limit) in the error reference guide.
diff --git a/src/power-bi/kql/Shared.Dataset/definition/expressions.tmdl b/src/power-bi/kql/Shared.Dataset/definition/expressions.tmdl
index 7094545d6..fe37318b6 100644
--- a/src/power-bi/kql/Shared.Dataset/definition/expressions.tmdl
+++ b/src/power-bi/kql/Shared.Dataset/definition/expressions.tmdl
@@ -89,6 +89,45 @@ expression ftk_DemoFilter =
annotation PBI_ResultType = Function
+/// Number of subscriptions to include in each Azure Resource Graph query batch. Decrease if you experience payload limit errors. Default: 100.
+expression ftk_ARGBatchSize = () => 100
+ lineageTag: f7a1b2c3-d4e5-6789-0abc-def123456789
+ queryGroup: Functions
+
+ annotation PBI_NavigationStepName = Navigation
+
+ annotation PBI_ResultType = Function
+
+/// Queries Azure Resource Graph in batches of subscriptions and combines results to avoid the 16 MB payload limit.
+expression ftk_QueryARG =
+ (query as text) =>
+ let
+ batchSize = ftk_ARGBatchSize(),
+ subQuery = "resourcecontainers | where type == 'microsoft.resources/subscriptions' | project subscriptionId" & ftk_DemoFilter(),
+ Subscriptions = AzureResourceGraph.Query(subQuery, "Tenant", null, null, [resultTruncated = false]),
+ SubscriptionIds = Subscriptions[subscriptionId],
+ BatchCount = Number.RoundUp(List.Count(SubscriptionIds) / batchSize),
+ Batches = List.Transform({0..BatchCount-1}, each
+ let
+ batchStart = _ * batchSize,
+ batchIds = List.Range(SubscriptionIds, batchStart, List.Min({batchSize, List.Count(SubscriptionIds) - batchStart})),
+ subFilter = " | where subscriptionId in (" & Text.Combine(List.Transform(batchIds, each "'" & _ & "'"), ",") & ")",
+ fullQuery = query & subFilter,
+ Source = AzureResourceGraph.Query(fullQuery, "Tenant", null, null, [resultTruncated = false])
+ in
+ if Table.HasColumns(Source, "Results") and Table.RowCount(Source) = 1 then null else Source
+ ),
+ Filtered = List.RemoveNulls(Batches),
+ Combined = if List.Count(Filtered) > 0 then Table.Combine(Filtered) else null
+ in
+ Combined
+ lineageTag: a1b2c3d4-e5f6-7890-abcd-ef1234567890
+ queryGroup: Functions
+
+ annotation PBI_NavigationStepName = Navigation
+
+ annotation PBI_ResultType = Function
+
/// URI of the FinOps hub Azure Data Explorer cluster to pull data from. Copy from the "clusterUri" deployment output.
///
/// Pro tip: As a shortcut, you can alternatively use the "{name}.{region}" subset of the URI.
@@ -114,14 +153,15 @@ expression PolicyDefinitions =
query = "
policyResources
| where type =='microsoft.authorization/policydefinitions'
- | extend displayName = properties.displayName,
+ | extend
+ subscriptionId = tostring(split(id, '/')[2]),
+ displayName = properties.displayName,
description = properties.description,
version = properties.version
- | project subscriptionId, id, name, displayName, description, version"
- & ftk_DemoFilter(),
- Source = AzureResourceGraph.Query(query, "Tenant", null, null, [resultTruncated = false]),
+ | project subscriptionId, id, name, displayName, description, version",
+ Source = ftk_QueryARG(query),
NullHandling =
- if Table.HasColumns(Source, "Results") and Table.RowCount(Source) = 1 then
+ if Source = null then
#table(
{ "subscriptionId", "id", "name", "displayName", "description", "version" },
{}
diff --git a/src/power-bi/kql/Shared.Dataset/definition/tables/AdvisorRecommendations.tmdl b/src/power-bi/kql/Shared.Dataset/definition/tables/AdvisorRecommendations.tmdl
index 3cd11b074..ab1989086 100644
--- a/src/power-bi/kql/Shared.Dataset/definition/tables/AdvisorRecommendations.tmdl
+++ b/src/power-bi/kql/Shared.Dataset/definition/tables/AdvisorRecommendations.tmdl
@@ -475,10 +475,8 @@ table AdvisorRecommendations
queryGroup: 'Resource Graph'
source = ```
let
- Source = AzureResourceGraph.Query("
-
-
- advisorresources
+ query = "
+ advisorresources
| where type == 'microsoft.advisor/recommendations'
| where properties.category == 'Cost'
| extend
@@ -523,11 +521,10 @@ table AdvisorRecommendations
['properties.resourceMetadata.action'] = properties.resourceMetadata.action,
['properties.resourceMetadata.source'] = properties.resourceMetadata.source,
SortOrder = case(properties.impact == 'High', 1, properties.impact == 'Medium', 2, properties.impact == 'Low', 3, 9)
-
-
- " & ftk_DemoFilter(), "Tenant", null, null, [resultTruncated = true]),
+ ",
+ Source = ftk_QueryARG(query),
NullHandling =
- if Table.HasColumns(Source, "Results") and Table.RowCount(Source) = 1 then
+ if Source = null then
#table(
{ "id", "name", "type", "properties.recommendationTypeId", "properties.shortDescription", "properties.resourceMetadata", "properties.suppressionIds", "properties.impactedField", "properties.impactedValue", "properties.lastUpdated", "properties.category", "properties.metadata", "properties.impact", "properties.shortDescription.problem", "properties.shortDescription.solution", "properties.extendedProperties.ObservationPeriodStartDate", "properties.extendedProperties.ObservationPeriodEndDate", "properties.extendedProperties.annualSavingsAmount", "properties.extendedProperties.HasRecommendation", "properties.extendedProperties.savingsCurrency", "properties.extendedProperties.IsInReplication", "properties.extendedProperties.Recommended_DTU", "properties.extendedProperties.Recommended_SKU", "properties.extendedProperties.ResourceGroup", "properties.extendedProperties.savingsAmount", "properties.extendedProperties.DatabaseSize", "properties.extendedProperties.DatabaseName", "properties.extendedProperties.ServerName", "properties.extendedProperties.Region", "properties.extendedProperties.lookbackPeriod", "properties.extendedProperties.subId", "properties.extendedProperties.scope", "properties.extendedProperties.term", "properties.extendedProperties.sku", "properties.extendedProperties.commitment", "properties.extendedProperties.currentSku", "properties.extendedProperties.targetSku", "properties.extendedProperties.recommendationMessage", "properties.resourceMetadata.resourceId", "properties.resourceMetadata.singular", "properties.resourceMetadata.plural", "properties.resourceMetadata.action", "properties.resourceMetadata.source", "SortOrder" },
{}
diff --git a/src/power-bi/kql/Shared.Dataset/definition/tables/AdvisorReservationRecommendations.tmdl b/src/power-bi/kql/Shared.Dataset/definition/tables/AdvisorReservationRecommendations.tmdl
index 394f7a2cf..79507d34a 100644
--- a/src/power-bi/kql/Shared.Dataset/definition/tables/AdvisorReservationRecommendations.tmdl
+++ b/src/power-bi/kql/Shared.Dataset/definition/tables/AdvisorReservationRecommendations.tmdl
@@ -298,6 +298,138 @@ table AdvisorReservationRecommendations
annotation SummarizationSetBy = Automatic
+ column 'properties.extendedProperties.ObservationPeriodStartDate'
+ dataType: dateTime
+ formatString: General Date
+ lineageTag: 1e286848-dabb-4034-8913-cd9cf2144716
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.ObservationPeriodStartDate
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.ObservationPeriodEndDate'
+ dataType: dateTime
+ formatString: General Date
+ lineageTag: 55c1b862-e2f9-4655-aedc-1e5d5b02e2d4
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.ObservationPeriodEndDate
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.HasRecommendation'
+ dataType: string
+ lineageTag: b87c10ce-9453-41d4-b56b-680bae8ac4a2
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.HasRecommendation
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.IsInReplication'
+ dataType: string
+ lineageTag: 7a6be7dd-254a-45a5-8aba-3ca27eca2b5b
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.IsInReplication
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.Recommended_DTU'
+ dataType: string
+ lineageTag: 48b988f9-4dc0-4f84-86a8-8c3b87940179
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.Recommended_DTU
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.Recommended_SKU'
+ dataType: string
+ lineageTag: 0a0fdca3-221d-4572-aed6-5c840358cb69
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.Recommended_SKU
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.ResourceGroup'
+ dataType: string
+ lineageTag: f5ffcebb-d130-457c-a298-6d462eea16bb
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.ResourceGroup
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.DatabaseSize'
+ dataType: string
+ lineageTag: 42dffd26-268e-49a1-b047-99e8c0f7f104
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.DatabaseSize
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.DatabaseName'
+ dataType: string
+ lineageTag: f74bb29d-f74d-4c35-bc25-66818909cfcc
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.DatabaseName
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.ServerName'
+ dataType: string
+ lineageTag: 804d5612-8c2e-4881-a80b-37968100ba21
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.ServerName
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.Region'
+ dataType: string
+ lineageTag: 68593266-9950-4caf-9522-ccfcbaa5d5e3
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.Region
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.commitment'
+ dataType: string
+ lineageTag: e0b87d0c-8c42-4354-b85a-5fc93d4af06a
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.commitment
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.currentSku'
+ dataType: string
+ lineageTag: 11320610-15d3-4db1-89b5-746d92fbf0fa
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.currentSku
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.targetSku'
+ dataType: string
+ lineageTag: 9a5c5a7c-8a59-4445-8946-d13f64fb3091
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.targetSku
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.recommendationMessage'
+ dataType: string
+ lineageTag: b2c1b5c3-ae28-4630-8823-d2db3604a1fb
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.recommendationMessage
+
+ annotation SummarizationSetBy = Automatic
+
+ column SortOrder
+ dataType: double
+ lineageTag: 0abaa4e9-cb2e-49bf-97ab-a0e6f54d3cb2
+ summarizeBy: sum
+ sourceColumn: SortOrder
+
+ annotation SummarizationSetBy = Automatic
+
+ annotation PBI_FormatHint = {"isGeneralNumber":true}
+
partition AdvisorReservationRecommendations = m
mode: import
queryGroup: 'Resource Graph'
@@ -306,8 +438,7 @@ table AdvisorReservationRecommendations
query = "
advisorresources
| where type == 'microsoft.advisor/recommendations'
- | where properties['category'] == 'Cost'
- | where properties['shortDescription']['solution'] == 'Consider virtual machine reserved instance to save over your on-demand costs'
+ | where properties.category == 'Cost'
| extend
['properties.recommendationTypeId'] = properties.recommendationTypeId,
['properties.shortDescription'] = properties.shortDescription,
@@ -321,12 +452,23 @@ table AdvisorReservationRecommendations
['properties.impact'] = properties.impact,
['properties.shortDescription.problem'] = properties.shortDescription.problem,
['properties.shortDescription.solution'] = properties.shortDescription.solution,
+ ['properties.extendedProperties.ObservationPeriodStartDate'] = properties.extendedProperties.ObservationPeriodStartDate,
+ ['properties.extendedProperties.ObservationPeriodEndDate'] = properties.extendedProperties.ObservationPeriodEndDate,
['properties.extendedProperties.reservedResourceType'] = properties.extendedProperties.reservedResourceType,
- ['properties.extendedProperties.annualSavingsAmount'] = properties.extendedProperties.annualSavingsAmount,
+ ['properties.extendedProperties.annualSavingsAmount'] = coalesce(properties.extendedProperties.annualSavingsAmount, 0),
['properties.extendedProperties.targetResourceCount'] = toint(properties.extendedProperties.targetResourceCount),
+ ['properties.extendedProperties.HasRecommendation'] = properties.extendedProperties.HasRecommendation,
['properties.extendedProperties.savingsCurrency'] = properties.extendedProperties.savingsCurrency,
+ ['properties.extendedProperties.IsInReplication'] = properties.extendedProperties.IsInReplication,
+ ['properties.extendedProperties.Recommended_DTU'] = properties.extendedProperties.Recommended_DTU,
+ ['properties.extendedProperties.Recommended_SKU'] = properties.extendedProperties.Recommended_SKU,
+ ['properties.extendedProperties.ResourceGroup'] = tolower(properties.extendedProperties.ResourceGroup),
['properties.extendedProperties.lookbackPeriod'] = properties.extendedProperties.lookbackPeriod,
- ['properties.extendedProperties.savingsAmount'] = properties.extendedProperties.savingsAmount,
+ ['properties.extendedProperties.savingsAmount'] = coalesce(properties.extendedProperties.savingsAmount, 0),
+ ['properties.extendedProperties.DatabaseSize'] = properties.extendedProperties.DatabaseSize,
+ ['properties.extendedProperties.DatabaseName'] = properties.extendedProperties.DatabaseName,
+ ['properties.extendedProperties.ServerName'] = properties.extendedProperties.ServerName,
+ ['properties.extendedProperties.Region'] = properties.extendedProperties.Region,
['properties.extendedProperties.displaySKU'] = properties.extendedProperties.displaySKU,
['properties.extendedProperties.displayQty'] = toint(properties.extendedProperties.displayQty),
['properties.extendedProperties.location'] = properties.extendedProperties.location,
@@ -337,21 +479,24 @@ table AdvisorReservationRecommendations
['properties.extendedProperties.term'] = properties.extendedProperties.term,
['properties.extendedProperties.sku'] = properties.extendedProperties.sku,
['properties.extendedProperties.qty'] = toint(properties.extendedProperties.qty),
+ ['properties.extendedProperties.commitment'] = properties.extendedProperties.commitment,
+ ['properties.extendedProperties.currentSku'] = properties.extendedProperties.currentSku,
+ ['properties.extendedProperties.targetSku'] = properties.extendedProperties.targetSku,
+ ['properties.extendedProperties.recommendationMessage'] = properties.extendedProperties.recommendationMessage,
['properties.resourceMetadata.resourceId'] = tolower(properties.resourceMetadata.resourceId),
['properties.resourceMetadata.singular'] = properties.resourceMetadata.singular,
['properties.resourceMetadata.plural'] = properties.resourceMetadata.plural,
['properties.resourceMetadata.action'] = properties.resourceMetadata.action,
['properties.resourceMetadata.source'] = properties.resourceMetadata.source,
- recommendedActions = strcat(properties.extendedProperties.displaySKU, ' virtual machines in ', properties.extendedProperties.location),
+ recommendedActions = iff(isnotempty(properties.extendedProperties.displaySKU), strcat(properties.extendedProperties.displaySKU, ' virtual machines in ', properties.extendedProperties.location), tostring(properties.shortDescription.solution)),
SortOrder = case(properties.impact == 'High', 1, properties.impact == 'Medium', 2, properties.impact == 'Low', 3, 9)
| order by SortOrder asc
- | project-away SortOrder
- " & ftk_DemoFilter(),
- Source = AzureResourceGraph.Query(query, "Tenant", null, null, [resultTruncated = false]),
+ ",
+ Source = ftk_QueryARG(query),
NullHandling =
- if Table.HasColumns(Source, "Results") and Table.RowCount(Source) = 1 then
+ if Source = null then
#table(
- { "id", "name", "properties.recommendationTypeId", "properties.shortDescription", "properties.resourceMetadata", "properties.suppressionIds", "properties.impactedField", "properties.impactedValue", "properties.lastUpdated", "properties.category", "properties.metadata", "properties.impact", "properties.shortDescription.problem", "properties.shortDescription.solution", "properties.extendedProperties.reservedResourceType", "properties.extendedProperties.annualSavingsAmount", "properties.extendedProperties.targetResourceCount", "properties.extendedProperties.savingsCurrency", "properties.extendedProperties.lookbackPeriod", "properties.extendedProperties.savingsAmount", "properties.extendedProperties.displaySKU", "properties.extendedProperties.displayQty", "properties.extendedProperties.location", "properties.extendedProperties.region", "properties.extendedProperties.vmSize", "properties.extendedProperties.subId", "properties.extendedProperties.scope", "properties.extendedProperties.term", "properties.extendedProperties.sku", "properties.extendedProperties.qty", "properties.resourceMetadata.resourceId", "properties.resourceMetadata.singular", "properties.resourceMetadata.plural", "properties.resourceMetadata.action", "properties.resourceMetadata.source", "recommendedActions" },
+ { "id", "name", "properties.recommendationTypeId", "properties.shortDescription", "properties.resourceMetadata", "properties.suppressionIds", "properties.impactedField", "properties.impactedValue", "properties.lastUpdated", "properties.category", "properties.metadata", "properties.impact", "properties.shortDescription.problem", "properties.shortDescription.solution", "properties.extendedProperties.ObservationPeriodStartDate", "properties.extendedProperties.ObservationPeriodEndDate", "properties.extendedProperties.reservedResourceType", "properties.extendedProperties.annualSavingsAmount", "properties.extendedProperties.targetResourceCount", "properties.extendedProperties.HasRecommendation", "properties.extendedProperties.savingsCurrency", "properties.extendedProperties.IsInReplication", "properties.extendedProperties.Recommended_DTU", "properties.extendedProperties.Recommended_SKU", "properties.extendedProperties.ResourceGroup", "properties.extendedProperties.lookbackPeriod", "properties.extendedProperties.savingsAmount", "properties.extendedProperties.DatabaseSize", "properties.extendedProperties.DatabaseName", "properties.extendedProperties.ServerName", "properties.extendedProperties.Region", "properties.extendedProperties.displaySKU", "properties.extendedProperties.displayQty", "properties.extendedProperties.location", "properties.extendedProperties.region", "properties.extendedProperties.vmSize", "properties.extendedProperties.subId", "properties.extendedProperties.scope", "properties.extendedProperties.term", "properties.extendedProperties.sku", "properties.extendedProperties.qty", "properties.extendedProperties.commitment", "properties.extendedProperties.currentSku", "properties.extendedProperties.targetSku", "properties.extendedProperties.recommendationMessage", "properties.resourceMetadata.resourceId", "properties.resourceMetadata.singular", "properties.resourceMetadata.plural", "properties.resourceMetadata.action", "properties.resourceMetadata.source", "recommendedActions", "SortOrder" },
{}
)
else Source,
@@ -360,14 +505,15 @@ table AdvisorReservationRecommendations
{"properties.extendedProperties.savingsAmount", type number},
{"properties.extendedProperties.qty", Int64.Type},
{"properties.extendedProperties.displayQty", Int64.Type},
- {"properties.extendedProperties.lookbackPeriod", Int64.Type},
{"properties.extendedProperties.targetResourceCount", Int64.Type},
+ {"SortOrder", type number},
+ {"properties.extendedProperties.ObservationPeriodStartDate", type datetimezone},
+ {"properties.extendedProperties.ObservationPeriodEndDate", type datetimezone},
{"properties.lastUpdated", type datetimezone}
- })
+ }, "en-US")
in
Types
annotation PBI_NavigationStepName = Navigation
annotation PBI_ResultType = Table
-
diff --git a/src/power-bi/kql/Shared.Dataset/definition/tables/Disks.tmdl b/src/power-bi/kql/Shared.Dataset/definition/tables/Disks.tmdl
index 076817722..45f772f61 100644
--- a/src/power-bi/kql/Shared.Dataset/definition/tables/Disks.tmdl
+++ b/src/power-bi/kql/Shared.Dataset/definition/tables/Disks.tmdl
@@ -203,10 +203,10 @@ table Disks
Redundancy,
parentVM,
diskType
- " & ftk_DemoFilter(),
- Source = AzureResourceGraph.Query(query, "Tenant", null, null, [resultTruncated = false]),
+ ",
+ Source = ftk_QueryARG(query),
NullHandling =
- if Table.HasColumns(Source, "Results") and Table.RowCount(Source) = 1 then
+ if Source = null then
#table(
{ "id", "name", "subscriptionId", "resourceGroup", "tenantId", "location", "managedBy", "osType", "skuName", "skuTier", "diskSizeGB", "diskMBpsReadWrite", "diskIOPSReadWrite", "diskState", "timeCreated", "LastOwnershipUpdateTime", "Redundancy", "parentVM", "diskType" },
{}
diff --git a/src/power-bi/kql/Shared.Dataset/definition/tables/NetworkInterfaces.tmdl b/src/power-bi/kql/Shared.Dataset/definition/tables/NetworkInterfaces.tmdl
index b686649d9..8a1588fae 100644
--- a/src/power-bi/kql/Shared.Dataset/definition/tables/NetworkInterfaces.tmdl
+++ b/src/power-bi/kql/Shared.Dataset/definition/tables/NetworkInterfaces.tmdl
@@ -437,10 +437,10 @@ table NetworkInterfaces
['properties.ipConfigurations.properties.publicIPAddress'] = properties.ipConfigurations.properties.publicIPAddress,
['properties.ipConfigurations.properties.publicIPAddress.id'] = properties.ipConfigurations.properties.publicIPAddress.id,
['properties.networkSecurityGroup.id'] = properties.networkSecurityGroup.id
- " & ftk_DemoFilter(),
- Source = AzureResourceGraph.Query(query, "Tenant", null, null, [resultTruncated = false]),
+ ",
+ Source = ftk_QueryARG(query),
NullHandling =
- if Table.HasColumns(Source, "Results") and Table.RowCount(Source) = 1 then
+ if Source = null then
#table(
{ "id", "name", "location", "resourceGroup", "properties.provisioningState", "properties.resourceGuid", "properties.enableAcceleratedNetworking", "properties.disableTcpStateTracking", "properties.vnetEncryptionSupported", "properties.networkSecurityGroup", "properties.ipConfigurations", "properties.enableIPForwarding", "properties.tapConfigurations", "properties.hostedWorkloads", "properties.allowPort25Out", "properties.auxiliaryMode", "properties.dnsSettings", "properties.auxiliarySku", "properties.macAddress", "properties.nicType", "properties.primary", "properties.virtualMachine", "properties.virtualMachine.id", "properties.ipConfigurations.type", "properties.ipConfigurations.name", "properties.ipConfigurations.properties", "properties.ipConfigurations.id", "properties.ipConfigurations.etag", "properties.ipConfigurations.properties.provisioningState", "properties.ipConfigurations.properties.privateIPAddressVersion", "properties.ipConfigurations.properties.privateIPAllocationMethod", "properties.ipConfigurations.properties.subnet", "properties.ipConfigurations.properties.privateIPAddress", "properties.ipConfigurations.properties.primary", "properties.ipConfigurations.properties.publicIPAddress", "properties.ipConfigurations.properties.publicIPAddress.id", "properties.networkSecurityGroup.id" },
{}
diff --git a/src/power-bi/kql/Shared.Dataset/definition/tables/NetworkSecurityGroups.tmdl b/src/power-bi/kql/Shared.Dataset/definition/tables/NetworkSecurityGroups.tmdl
index 130a15a78..98e115ddf 100644
--- a/src/power-bi/kql/Shared.Dataset/definition/tables/NetworkSecurityGroups.tmdl
+++ b/src/power-bi/kql/Shared.Dataset/definition/tables/NetworkSecurityGroups.tmdl
@@ -264,10 +264,10 @@ table NetworkSecurityGroups
['properties.securityRules.properties.direction'] = properties.securityRules.properties.direction,
['properties.securityRules.properties.priority'] = properties.securityRules.properties.priority,
['properties.securityRules.properties.access'] = properties.securityRules.properties.access
- " & ftk_DemoFilter(),
- Source = AzureResourceGraph.Query(query, "Tenant", null, null, [resultTruncated = false]),
+ ",
+ Source = ftk_QueryARG(query),
NullHandling =
- if Table.HasColumns(Source, "Results") and Table.RowCount(Source) = 1 then
+ if Source = null then
#table(
{ "id", "name", "location", "resourceGroup", "properties.resourceGuid", "properties.securityRules", "properties.securityRules.name", "properties.securityRules.id", "properties.securityRules.properties.destinationAddressPrefix", "properties.securityRules.properties.sourceAddressPrefix", "properties.securityRules.properties.destinationPortRange", "properties.securityRules.properties.sourcePortRange", "properties.securityRules.properties.protocol", "properties.securityRules.properties.direction", "properties.securityRules.properties.priority", "properties.securityRules.properties.access" },
{}
diff --git a/src/power-bi/kql/Shared.Dataset/definition/tables/PolicyAssignments.tmdl b/src/power-bi/kql/Shared.Dataset/definition/tables/PolicyAssignments.tmdl
index f2158a3ee..2f03b8824 100644
--- a/src/power-bi/kql/Shared.Dataset/definition/tables/PolicyAssignments.tmdl
+++ b/src/power-bi/kql/Shared.Dataset/definition/tables/PolicyAssignments.tmdl
@@ -369,6 +369,7 @@ table PolicyAssignments
query = "
policyResources
| where type =~'Microsoft.Authorization/PolicyAssignments'
+ | extend subscriptionId = tostring(split(id, '/')[2])
| extend
['properties.policyDefinitionId'] = properties.policyDefinitionId,
['properties.effectiveDefinitionVersion'] = properties.effectiveDefinitionVersion,
@@ -400,10 +401,10 @@ table PolicyAssignments
['identity.tenantId'] = identity.tenantId,
['identity.type'] = identity.type
| mv-expand ['properties.notScopes']
- " & ftk_DemoFilter(),
- Source = AzureResourceGraph.Query(query, "Tenant", null, null, [resultTruncated = false]),
+ ",
+ Source = ftk_QueryARG(query),
NullHandling =
- if Table.HasColumns(Source, "Results") and Table.RowCount(Source) = 1 then
+ if Source = null then
#table(
{ "id", "name", "location", "resourceGroup", "properties.policyDefinitionId", "properties.effectiveDefinitionVersion", "properties.latestDefinitionVersion", "properties.nonComplianceMessages", "properties.definitionVersion", "properties.resourceSelectors", "properties.enforcementMode", "properties.assignmentType", "properties.description", "properties.displayName", "properties.parameters", "properties.notScopes", "properties.overrides", "properties.metadata", "properties.scope", "properties.metadata.createdOn", "properties.metadata.createdBy", "properties.metadata.assignedBy", "properties.metadata.parameterScopes", "properties.metadata.updatedOn", "properties.metadata.updatedBy", "properties.metadata.category", "properties.metadata.managedByResourceId", "properties.metadata.securityCenter", "properties.metadata.excludedOutOfTheBoxStandards", "identity.userAssignedIdentities", "identity.principalId", "identity.tenantId", "identity.type" },
{}
diff --git a/src/power-bi/kql/Shared.Dataset/definition/tables/PolicyStates.tmdl b/src/power-bi/kql/Shared.Dataset/definition/tables/PolicyStates.tmdl
index 96ca590a7..081d2a644 100644
--- a/src/power-bi/kql/Shared.Dataset/definition/tables/PolicyStates.tmdl
+++ b/src/power-bi/kql/Shared.Dataset/definition/tables/PolicyStates.tmdl
@@ -344,6 +344,7 @@ table PolicyStates
query = "
policyResources
| where type =~'Microsoft.PolicyInsights/PolicyStates'
+ | extend subscriptionId = tostring(split(id, '/')[2])
| extend
['properties.policyAssignmentParameters'] = properties.policyAssignmentParameters,
['properties.policyDefinitionAction'] = properties.policyDefinitionAction,
@@ -369,10 +370,10 @@ table PolicyStates
['properties.policyDefinitionGroupNames'] = properties.policyDefinitionGroupNames,
['properties.complianceReasonCode'] = properties.complianceReasonCode,
['properties.stateDetails'] = properties.stateDetails
- " & ftk_DemoFilter(),
- Source = AzureResourceGraph.Query(query, "Tenant", null, null, [resultTruncated = false]),
+ ",
+ Source = ftk_QueryARG(query),
NullHandling =
- if Table.HasColumns(Source, "Results") and Table.RowCount(Source) = 1 then
+ if Source = null then
#table(
{ "id", "name", "location", "resourceGroup", "properties.policyAssignmentParameters", "properties.policyDefinitionAction", "properties.policyAssignmentScope", "properties.policyAssignmentName", "properties.policyDefinitionName", "properties.policyDefinitionReferenceId", "properties.policyDefinitionId", "properties.managementGroupIds", "properties.policyAssignmentId", "properties.policySetDefinitionName", "properties.complianceState", "properties.policySetDefinitionId", "properties.subscriptionId", "properties.resourceType", "properties.stateWeight", "properties.resourceGroup", "properties.resourceId", "properties.timestamp", "properties.isDeleted", "properties.resourceLocation", "properties.policySetDefinitionCategory", "properties.policyDefinitionGroupNames", "properties.complianceReasonCode", "properties.stateDetails" },
{}
diff --git a/src/power-bi/kql/Shared.Dataset/definition/tables/PublicIPAddresses.tmdl b/src/power-bi/kql/Shared.Dataset/definition/tables/PublicIPAddresses.tmdl
index 02001da39..7775c5fd4 100644
--- a/src/power-bi/kql/Shared.Dataset/definition/tables/PublicIPAddresses.tmdl
+++ b/src/power-bi/kql/Shared.Dataset/definition/tables/PublicIPAddresses.tmdl
@@ -210,10 +210,10 @@ table PublicIPAddresses
['properties.ipAddress'] = properties.ipAddress,
['properties.ipConfiguration'] = properties.ipConfiguration,
['properties.ipTags'] = properties.ipTags
- " & ftk_DemoFilter(),
- Source = AzureResourceGraph.Query(query, "Tenant", null, null, [resultTruncated = false]),
+ ",
+ Source = ftk_QueryARG(query),
NullHandling =
- if Table.HasColumns(Source, "Results") and Table.RowCount(Source) = 1 then
+ if Source = null then
#table(
{ "id", "name", "location", "resourceGroup", "properties.provisioningState", "properties.resourceGuid", "properties.idleTimeoutInMinutes", "properties.publicIPAllocationMethod", "properties.publicIPAddressVersion", "properties.ipAddress", "properties.ipConfiguration", "properties.ipTags" },
{}
diff --git a/src/power-bi/kql/Shared.Dataset/definition/tables/Resources.tmdl b/src/power-bi/kql/Shared.Dataset/definition/tables/Resources.tmdl
index 920ac471e..7fb4b5320 100644
--- a/src/power-bi/kql/Shared.Dataset/definition/tables/Resources.tmdl
+++ b/src/power-bi/kql/Shared.Dataset/definition/tables/Resources.tmdl
@@ -91,10 +91,10 @@ table Resources
['creationTime'] = properties.creationTime,
['timeModified'] = properties.timeModified
| project id, name, type, tenantId, location, subscriptionId, resourceGroup, creationTime, timeModified
- " & ftk_DemoFilter(),
- Source = AzureResourceGraph.Query(query, "Tenant", null, null, [resultTruncated = false]),
+ ",
+ Source = ftk_QueryARG(query),
NullHandling =
- if Table.HasColumns(Source, "Results") and Table.RowCount(Source) = 1 then
+ if Source = null then
#table(
{ "id", "name", "type", "tenantId", "location", "subscriptionId", "resourceGroup", "creationTime", "timeModified" },
{}
diff --git a/src/power-bi/kql/Shared.Dataset/definition/tables/SqlDatabases.tmdl b/src/power-bi/kql/Shared.Dataset/definition/tables/SqlDatabases.tmdl
index 58b6a81dd..020eceaaf 100644
--- a/src/power-bi/kql/Shared.Dataset/definition/tables/SqlDatabases.tmdl
+++ b/src/power-bi/kql/Shared.Dataset/definition/tables/SqlDatabases.tmdl
@@ -364,10 +364,10 @@ table SqlDatabases
['properties.currentSku'] = properties.currentSku,
['properties.readScale'] = properties.readScale,
['properties.maxLogSizeBytes'] = properties.maxLogSizeBytes
- " & ftk_DemoFilter(),
- Source = AzureResourceGraph.Query(query, "Tenant", null, null, [resultTruncated = false]),
+ ",
+ Source = ftk_QueryARG(query),
NullHandling =
- if Table.HasColumns(Source, "Results") and Table.RowCount(Source) = 1 then
+ if Source = null then
#table(
{ "id", "name", "sku.name", "sku.tier", "sku.capacity", "sku.family", "location", "resourceGroup", "properties.status", "properties.requestedBackupStorageRedundancy", "properties.currentBackupStorageRedundancy", "properties.requestedServiceObjectiveName", "properties.currentServiceObjectiveName", "properties.maintenanceConfigurationId", "properties.defaultSecondaryLocation", "properties.isInfraEncryptionEnabled", "properties.earliestRestoreDate", "properties.zoneRedundant", "properties.availabilityZone", "properties.catalogCollation", "properties.creationDate", "properties.collation", "properties.licenseType", "properties.maxSizeBytes", "properties.isLedgerOn", "properties.databaseId", "properties.currentSku", "properties.readScale", "properties.maxLogSizeBytes" },
{}
diff --git a/src/power-bi/kql/Shared.Dataset/definition/tables/VirtualMachines.tmdl b/src/power-bi/kql/Shared.Dataset/definition/tables/VirtualMachines.tmdl
index ad89d28af..542de68b7 100644
--- a/src/power-bi/kql/Shared.Dataset/definition/tables/VirtualMachines.tmdl
+++ b/src/power-bi/kql/Shared.Dataset/definition/tables/VirtualMachines.tmdl
@@ -614,10 +614,10 @@ table VirtualMachines
| extend
['powerState.displayStatus'] = powerState.displayStatus
| mv-expand ['zones']
- " & ftk_DemoFilter(),
- Source = AzureResourceGraph.Query(query, "Tenant", null, null, [resultTruncated = false]),
+ ",
+ Source = ftk_QueryARG(query),
NullHandling =
- if Table.HasColumns(Source, "Results") and Table.RowCount(Source) = 1 then
+ if Source = null then
#table(
{ "id", "name", "location", "resourceGroup", "provisioningState", "timeCreated", "networkProfile", "osProfile", "storageProfile", "hardwareProfile", "vmId", "diagnosticsProfile", "extended", "licenseType", "osProfile.computerName", "osProfile.requireGuestProvisionSignal", "osProfile.allowExtensionOperations", "osProfile.adminUsername", "osProfile.secrets", "osProfile.linuxConfiguration", "osProfile.windowsConfiguration", "networkInterfaces", "networkInterfaces.properties", "networkInterfaces.id", "networkInterfaces.properties.deleteOption", "storageProfile.imageReference", "storageProfile.dataDisks", "storageProfile.osDisk", "storageProfile.imageReference.publisher", "storageProfile.imageReference.sku", "storageProfile.imageReference.version", "storageProfile.imageReference.exactVersion", "storageProfile.imageReference.offer", "storageProfile.dataDisks.name", "storageProfile.dataDisks.createOption", "storageProfile.dataDisks.deleteOption", "storageProfile.dataDisks.managedDisk", "storageProfile.dataDisks.caching", "storageProfile.dataDisks.toBeDetached", "storageProfile.dataDisks.writeAcceleratorEnabled", "storageProfile.dataDisks.lun", "storageProfile.dataDisks.managedDisk.id", "storageProfile.osDisk.name", "storageProfile.osDisk.createOption", "storageProfile.osDisk.osType", "storageProfile.osDisk.deleteOption", "storageProfile.osDisk.managedDisk", "storageProfile.osDisk.caching", "storageProfile.osDisk.managedDisk.id", "hardwareProfile.vmSize", "diagnosticsProfile.bootDiagnostics", "diagnosticsProfile.bootDiagnostics.enabled", "diagnosticsProfile.bootDiagnostics.storageUri", "instanceView", "powerState", "powerState.displayStatus" },
{}
diff --git a/src/power-bi/storage/Shared.Dataset/definition/expressions.tmdl b/src/power-bi/storage/Shared.Dataset/definition/expressions.tmdl
index 69c6f549c..2d34e6063 100644
--- a/src/power-bi/storage/Shared.Dataset/definition/expressions.tmdl
+++ b/src/power-bi/storage/Shared.Dataset/definition/expressions.tmdl
@@ -496,8 +496,47 @@ expression ftk_DemoFilter =
annotation PBI_ResultType = Function
+/// Number of subscriptions to include in each Azure Resource Graph query batch. Decrease if you experience payload limit errors. Default: 100.
+expression ftk_ARGBatchSize = () => 100
+ lineageTag: f7a1b2c3-d4e5-6789-0abc-def123456790
+ queryGroup: Functions
+
+ annotation PBI_NavigationStepName = Navigation
+
+ annotation PBI_ResultType = Function
+
+/// Queries Azure Resource Graph in batches of subscriptions and combines results to avoid the 16 MB payload limit.
+expression ftk_QueryARG =
+ (query as text) =>
+ let
+ batchSize = ftk_ARGBatchSize(),
+ subQuery = "resourcecontainers | where type == 'microsoft.resources/subscriptions' | project subscriptionId" & ftk_DemoFilter(),
+ Subscriptions = AzureResourceGraph.Query(subQuery, "Tenant", null, null, [resultTruncated = false]),
+ SubscriptionIds = Subscriptions[subscriptionId],
+ BatchCount = Number.RoundUp(List.Count(SubscriptionIds) / batchSize),
+ Batches = List.Transform({0..BatchCount-1}, each
+ let
+ batchStart = _ * batchSize,
+ batchIds = List.Range(SubscriptionIds, batchStart, List.Min({batchSize, List.Count(SubscriptionIds) - batchStart})),
+ subFilter = " | where subscriptionId in (" & Text.Combine(List.Transform(batchIds, each "'" & _ & "'"), ",") & ")",
+ fullQuery = query & subFilter,
+ Source = AzureResourceGraph.Query(fullQuery, "Tenant", null, null, [resultTruncated = false])
+ in
+ if Table.HasColumns(Source, "Results") and Table.RowCount(Source) = 1 then null else Source
+ ),
+ Filtered = List.RemoveNulls(Batches),
+ Combined = if List.Count(Filtered) > 0 then Table.Combine(Filtered) else null
+ in
+ Combined
+ lineageTag: a1b2c3d4-e5f6-7890-abcd-ef1234567891
+ queryGroup: Functions
+
+ annotation PBI_NavigationStepName = Navigation
+
+ annotation PBI_ResultType = Function
+
/// Optional. Experimental feature to join the prices with the cost to populate missing list and contracted unit price and calculate missing cost values. This enables calculating total savings. Allowed values = "TRUE", "FALSE".
-///
+///
/// This experimental feature is extremely slow to run and has not been fully tested. We are investigating alternative means to perform this join.
expression 'Deprecated: Perform Extra Query Optimizations' = false meta [IsParameterQuery=true, List={false, true}, DefaultValue=false, Type="Logical", IsParameterQueryRequired=false]
lineageTag: f22de62e-d0a2-4f18-be6a-86172ff55b17
@@ -520,15 +559,16 @@ expression PolicyDefinitions =
let
query = "
policyResources
- | where type =='microsoft.authorization/policydefinitions' |
- extend displayName = properties.displayName,
- description = properties.description,
- version = properties.version
- | project subscriptionId, id, name, displayName, description, version"
- & ftk_DemoFilter(),
- Source = AzureResourceGraph.Query(query, "Tenant", null, null, [resultTruncated = false]),
+ | where type =='microsoft.authorization/policydefinitions'
+ | extend
+ subscriptionId = tostring(split(id, '/')[2]),
+ displayName = properties.displayName,
+ description = properties.description,
+ version = properties.version
+ | project subscriptionId, id, name, displayName, description, version",
+ Source = ftk_QueryARG(query),
NullHandling =
- if Table.HasColumns(Source, "Results") and Table.RowCount(Source) = 1 then
+ if Source = null then
#table(
{ "subscriptionId", "id", "name", "displayName", "description", "version" },
{}
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/AdvisorRecommendations.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/AdvisorRecommendations.tmdl
deleted file mode 100644
index 922e08ebe..000000000
--- a/src/power-bi/storage/Shared.Dataset/definition/tables/AdvisorRecommendations.tmdl
+++ /dev/null
@@ -1,549 +0,0 @@
-table AdvisorRecommendations
- lineageTag: a76a7ba9-b6b5-4140-9739-344b958bfc9f
-
- column id
- dataType: string
- lineageTag: de03600f-0938-479c-9668-1386cd8fd8cc
- summarizeBy: none
- sourceColumn: id
-
- annotation SummarizationSetBy = Automatic
-
- column name
- dataType: string
- lineageTag: b82b2171-5f91-421e-9052-b72ae63ed3c3
- summarizeBy: none
- sourceColumn: name
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.recommendationTypeId'
- dataType: string
- lineageTag: b5215814-f868-4a8c-8c85-719e04a93cdd
- summarizeBy: none
- sourceColumn: properties.recommendationTypeId
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.extendedProperties.ObservationPeriodStartDate'
- dataType: dateTime
- formatString: General Date
- lineageTag: ab4f38d6-4047-479b-9f9b-e410f75ddc7e
- summarizeBy: none
- sourceColumn: properties.extendedProperties.ObservationPeriodStartDate
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.extendedProperties.ObservationPeriodEndDate'
- dataType: dateTime
- formatString: General Date
- lineageTag: 56c63f3b-8ddd-4c48-a1d4-ebd95bb7c077
- summarizeBy: none
- sourceColumn: properties.extendedProperties.ObservationPeriodEndDate
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.extendedProperties.annualSavingsAmount'
- dataType: double
- lineageTag: 19b8e57a-5d4c-47c6-b339-244398d3280f
- summarizeBy: sum
- sourceColumn: properties.extendedProperties.annualSavingsAmount
-
- annotation SummarizationSetBy = Automatic
-
- annotation PBI_FormatHint = {"isGeneralNumber":true}
-
- column 'properties.extendedProperties.HasRecommendation'
- dataType: string
- lineageTag: 43a90524-510a-48a1-a41b-67275ab5a220
- summarizeBy: none
- sourceColumn: properties.extendedProperties.HasRecommendation
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.extendedProperties.savingsCurrency'
- dataType: string
- lineageTag: 17b12b2b-14c2-4a12-90d0-1faa1b3a192b
- summarizeBy: none
- sourceColumn: properties.extendedProperties.savingsCurrency
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.extendedProperties.IsInReplication'
- dataType: string
- lineageTag: dbfe3e6c-c999-447a-bc1b-c7fe0e506013
- summarizeBy: none
- sourceColumn: properties.extendedProperties.IsInReplication
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.extendedProperties.Recommended_DTU'
- dataType: string
- lineageTag: a7158037-adc3-42fb-a6ee-234086f5dc36
- summarizeBy: none
- sourceColumn: properties.extendedProperties.Recommended_DTU
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.extendedProperties.Recommended_SKU'
- dataType: string
- lineageTag: 73678d68-9152-45dc-b63b-c84bec6430c3
- summarizeBy: none
- sourceColumn: properties.extendedProperties.Recommended_SKU
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.extendedProperties.ResourceGroup'
- dataType: string
- lineageTag: b96cc7fb-e6a6-456c-b1a7-62a7f1faf6f2
- summarizeBy: none
- sourceColumn: properties.extendedProperties.ResourceGroup
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.extendedProperties.DatabaseSize'
- dataType: string
- lineageTag: 291bcdda-5321-4bb3-8900-62cb86a30af8
- summarizeBy: none
- sourceColumn: properties.extendedProperties.DatabaseSize
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.extendedProperties.DatabaseName'
- dataType: string
- lineageTag: 282b6040-b89c-4139-95bf-c914e6a07138
- summarizeBy: none
- sourceColumn: properties.extendedProperties.DatabaseName
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.extendedProperties.ServerName'
- dataType: string
- lineageTag: 64d82cc4-f542-4ee4-9cdd-f0ce960d97a4
- summarizeBy: none
- sourceColumn: properties.extendedProperties.ServerName
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.extendedProperties.Region'
- dataType: string
- lineageTag: a804462d-34e5-498d-ae01-0ba78750329e
- summarizeBy: none
- sourceColumn: properties.extendedProperties.Region
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.extendedProperties.lookbackPeriod'
- dataType: string
- lineageTag: e0579f64-a229-40fd-b0d2-6a6c7baf8052
- summarizeBy: none
- sourceColumn: properties.extendedProperties.lookbackPeriod
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.extendedProperties.subId'
- dataType: string
- lineageTag: b2ca600b-c8f6-42db-9edc-97ca64a5429e
- summarizeBy: none
- sourceColumn: properties.extendedProperties.subId
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.extendedProperties.scope'
- dataType: string
- lineageTag: 32e4dd3a-74a6-4e20-9005-55bfbcd3ac7e
- summarizeBy: none
- sourceColumn: properties.extendedProperties.scope
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.extendedProperties.term'
- dataType: string
- lineageTag: 12b6fe8e-9c25-4287-8db1-23279ec5616e
- summarizeBy: none
- sourceColumn: properties.extendedProperties.term
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.extendedProperties.sku'
- dataType: string
- lineageTag: 9a56ac74-a4e4-44b0-b879-9d0d696aa06a
- summarizeBy: none
- sourceColumn: properties.extendedProperties.sku
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.extendedProperties.commitment'
- dataType: string
- lineageTag: c63f1307-bbd6-48c1-807f-9b5dcd0ad9cf
- summarizeBy: none
- sourceColumn: properties.extendedProperties.commitment
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.extendedProperties.currentSku'
- dataType: string
- lineageTag: 9ac388a6-51eb-4bec-aa68-5c13b7fe5c9b
- summarizeBy: none
- sourceColumn: properties.extendedProperties.currentSku
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.extendedProperties.targetSku'
- dataType: string
- lineageTag: 1ebb5230-bc88-4be3-8e7f-7ce06fbecce4
- summarizeBy: none
- sourceColumn: properties.extendedProperties.targetSku
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.extendedProperties.recommendationMessage'
- dataType: string
- lineageTag: e0744324-2c7b-43b4-bc4d-bce14a18a0e2
- summarizeBy: none
- sourceColumn: properties.extendedProperties.recommendationMessage
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.shortDescription.solution'
- dataType: string
- lineageTag: 9c791663-17ff-42a2-9648-ef4b12b2671e
- summarizeBy: none
- sourceColumn: properties.shortDescription.solution
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.shortDescription.problem'
- dataType: string
- lineageTag: 5c657cce-2d94-4eec-b526-7d20c72bec54
- summarizeBy: none
- sourceColumn: properties.shortDescription.problem
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.resourceMetadata.resourceId'
- dataType: string
- lineageTag: 395d38f4-d4f6-4d30-94a2-ec3244abfed2
- summarizeBy: none
- sourceColumn: properties.resourceMetadata.resourceId
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.resourceMetadata.singular'
- dataType: string
- lineageTag: 58f9df6d-d682-4bf8-9273-d141f30c4743
- summarizeBy: none
- sourceColumn: properties.resourceMetadata.singular
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.resourceMetadata.plural'
- dataType: string
- lineageTag: 86f40b1b-56c8-4b29-9ac2-7b2cbb6f9f19
- summarizeBy: none
- sourceColumn: properties.resourceMetadata.plural
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.resourceMetadata.action'
- dataType: string
- lineageTag: 1cdc271b-78aa-45e9-b85c-89684dddf18c
- summarizeBy: none
- sourceColumn: properties.resourceMetadata.action
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.resourceMetadata.source'
- dataType: string
- lineageTag: c83167c4-f804-4568-8894-a9ffd8d0fdd9
- summarizeBy: none
- sourceColumn: properties.resourceMetadata.source
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.suppressionIds'
- dataType: string
- lineageTag: 8761bfa3-8cb3-4d24-984e-c0cb3482a2a0
- summarizeBy: none
- sourceColumn: properties.suppressionIds
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.impactedField'
- dataType: string
- lineageTag: 26285858-61f3-4efd-8201-9f79d3f877cd
- summarizeBy: none
- sourceColumn: properties.impactedField
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.impactedValue'
- dataType: string
- lineageTag: 62951291-b70a-47eb-bbfd-74e781fef07e
- summarizeBy: none
- sourceColumn: properties.impactedValue
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.category'
- dataType: string
- lineageTag: d4071f11-546e-49cc-9131-675482ae0927
- summarizeBy: none
- sourceColumn: properties.category
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.metadata'
- dataType: string
- lineageTag: 9888db80-3867-4fe4-8600-661836e054a1
- summarizeBy: none
- sourceColumn: properties.metadata
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.impact'
- dataType: string
- lineageTag: 62f29742-9472-4678-b789-5da41abf1051
- summarizeBy: none
- sourceColumn: properties.impact
- sortByColumn: SortOrder
-
- changedProperty = SortByColumn
-
- annotation SummarizationSetBy = Automatic
-
- column SortOrder
- dataType: double
- formatString: 0
- lineageTag: 4d8ca85e-f35a-4e71-866b-188c3de4f284
- summarizeBy: sum
- sourceColumn: SortOrder
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.shortDescription'
- dataType: string
- lineageTag: db36be30-e93a-4d83-8723-cfd5fef8ec31
- summarizeBy: none
- sourceColumn: properties.shortDescription
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.resourceMetadata'
- dataType: string
- lineageTag: d1efb6c5-bd4f-40af-a43e-69e7576a48a1
- summarizeBy: none
- sourceColumn: properties.resourceMetadata
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.lastUpdated'
- dataType: dateTime
- formatString: General Date
- lineageTag: 432519ca-6b39-470a-875a-7011290482ba
- summarizeBy: none
- sourceColumn: properties.lastUpdated
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.extendedProperties.savingsAmount'
- dataType: double
- lineageTag: 588d3c29-5bb7-4bb6-a5bd-b35aedd8131a
- summarizeBy: sum
- sourceColumn: properties.extendedProperties.savingsAmount
-
- annotation SummarizationSetBy = Automatic
-
- annotation PBI_FormatHint = {"isGeneralNumber":true}
-
- column type
- dataType: string
- lineageTag: ac61d87d-1570-4b1a-97b1-0178fc944bb3
- summarizeBy: none
- sourceColumn: type
-
- annotation SummarizationSetBy = Automatic
-
- column tenantId
- dataType: string
- lineageTag: 9f303a32-9ab0-4a62-97b5-09ce9630feee
- summarizeBy: none
- sourceColumn: tenantId
-
- annotation SummarizationSetBy = Automatic
-
- column kind
- dataType: string
- lineageTag: a113728e-e322-41d5-9605-c61609c31352
- summarizeBy: none
- sourceColumn: kind
-
- annotation SummarizationSetBy = Automatic
-
- column location
- dataType: string
- lineageTag: 763782ff-4b2b-4c62-88ab-81426f80db79
- summarizeBy: none
- sourceColumn: location
-
- annotation SummarizationSetBy = Automatic
-
- column resourceGroup
- dataType: string
- lineageTag: 9d01f317-2b3c-429a-9edd-d5e000cf7eab
- summarizeBy: none
- sourceColumn: resourceGroup
-
- annotation SummarizationSetBy = Automatic
-
- column subscriptionId
- dataType: string
- lineageTag: 64459c7e-80f2-42d2-b149-27201ab28ecc
- summarizeBy: none
- sourceColumn: subscriptionId
-
- annotation SummarizationSetBy = Automatic
-
- column managedBy
- dataType: string
- lineageTag: 8115cac1-1999-4fd2-acd9-198d1efa40a1
- summarizeBy: none
- sourceColumn: managedBy
-
- annotation SummarizationSetBy = Automatic
-
- column sku
- dataType: string
- lineageTag: c6148b22-09be-4d0d-9ffe-5ecc3a0fdf15
- summarizeBy: none
- sourceColumn: sku
-
- annotation SummarizationSetBy = Automatic
-
- column plan
- dataType: string
- lineageTag: 20739f02-9f27-49a4-b777-72b7a22d11c9
- summarizeBy: none
- sourceColumn: plan
-
- annotation SummarizationSetBy = Automatic
-
- column properties
- dataType: string
- lineageTag: 5a807d2f-0fd7-4cc4-8148-fb54899da4fa
- summarizeBy: none
- sourceColumn: properties
-
- annotation SummarizationSetBy = Automatic
-
- column tags
- dataType: string
- lineageTag: efb6b31c-93d6-4eda-9033-31af080009fe
- summarizeBy: none
- sourceColumn: tags
-
- annotation SummarizationSetBy = Automatic
-
- column identity
- dataType: string
- lineageTag: edf81095-af38-4974-9320-6567dd06ae16
- summarizeBy: none
- sourceColumn: identity
-
- annotation SummarizationSetBy = Automatic
-
- column zones
- dataType: string
- lineageTag: 8338ea34-4f56-4839-a052-d7a72d4ba7b4
- summarizeBy: none
- sourceColumn: zones
-
- annotation SummarizationSetBy = Automatic
-
- column extendedLocation
- dataType: string
- lineageTag: 64c356d0-098f-431c-bf9c-929f991acb02
- summarizeBy: none
- sourceColumn: extendedLocation
-
- annotation SummarizationSetBy = Automatic
-
- partition AdvisorRecommendations = m
- mode: import
- queryGroup: 'Resource Graph'
- source = ```
- let
- Source = AzureResourceGraph.Query("
-
-
- advisorresources
- | where type == 'microsoft.advisor/recommendations'
- | where properties.category == 'Cost'
- | extend
- ['properties.recommendationTypeId'] = properties.recommendationTypeId,
- ['properties.shortDescription'] = properties.shortDescription,
- ['properties.resourceMetadata'] = properties.resourceMetadata,
- ['properties.suppressionIds'] = properties.suppressionIds,
- ['properties.impactedField'] = properties.impactedField,
- ['properties.impactedValue'] = properties.impactedValue,
- ['properties.lastUpdated'] = properties.lastUpdated,
- ['properties.category'] = properties.category,
- ['properties.metadata'] = properties.metadata,
- ['properties.impact'] = properties.impact,
- ['properties.shortDescription.problem'] = properties.shortDescription.problem,
- ['properties.shortDescription.solution'] = properties.shortDescription.solution,
- ['properties.extendedProperties.ObservationPeriodStartDate'] = properties.extendedProperties.ObservationPeriodStartDate,
- ['properties.extendedProperties.ObservationPeriodEndDate'] = properties.extendedProperties.ObservationPeriodEndDate,
- ['properties.extendedProperties.annualSavingsAmount'] = coalesce(properties.extendedProperties.annualSavingsAmount, 0),
- ['properties.extendedProperties.HasRecommendation'] = properties.extendedProperties.HasRecommendation,
- ['properties.extendedProperties.savingsCurrency'] = properties.extendedProperties.savingsCurrency,
- ['properties.extendedProperties.IsInReplication'] = properties.extendedProperties.IsInReplication,
- ['properties.extendedProperties.Recommended_DTU'] = properties.extendedProperties.Recommended_DTU,
- ['properties.extendedProperties.Recommended_SKU'] = properties.extendedProperties.Recommended_SKU,
- ['properties.extendedProperties.ResourceGroup'] = tolower(properties.extendedProperties.ResourceGroup),
- ['properties.extendedProperties.savingsAmount'] = coalesce(properties.extendedProperties.savingsAmount, 0),
- ['properties.extendedProperties.DatabaseSize'] = properties.extendedProperties.DatabaseSize,
- ['properties.extendedProperties.DatabaseName'] = properties.extendedProperties.DatabaseName,
- ['properties.extendedProperties.ServerName'] = properties.extendedProperties.ServerName,
- ['properties.extendedProperties.Region'] = properties.extendedProperties.Region,
- ['properties.extendedProperties.lookbackPeriod'] = properties.extendedProperties.lookbackPeriod,
- ['properties.extendedProperties.subId'] = properties.extendedProperties.subId,
- ['properties.extendedProperties.scope'] = properties.extendedProperties.scope,
- ['properties.extendedProperties.term'] = properties.extendedProperties.term,
- ['properties.extendedProperties.sku'] = properties.extendedProperties.sku,
- ['properties.extendedProperties.commitment'] = properties.extendedProperties.commitment,
- ['properties.extendedProperties.currentSku'] = properties.extendedProperties.currentSku,
- ['properties.extendedProperties.targetSku'] = properties.extendedProperties.targetSku,
- ['properties.extendedProperties.recommendationMessage'] = properties.extendedProperties.recommendationMessage,
- ['properties.resourceMetadata.resourceId'] = tolower(properties.resourceMetadata.resourceId),
- ['properties.resourceMetadata.singular'] = properties.resourceMetadata.singular,
- ['properties.resourceMetadata.plural'] = properties.resourceMetadata.plural,
- ['properties.resourceMetadata.action'] = properties.resourceMetadata.action,
- ['properties.resourceMetadata.source'] = properties.resourceMetadata.source,
- SortOrder = case(properties.impact == 'High', 1, properties.impact == 'Medium', 2, properties.impact == 'Low', 3, 9)
-
-
- " & ftk_DemoFilter(), "Tenant", null, null, [resultTruncated = true]),
- NullHandling =
- if Table.HasColumns(Source, "Results") and Table.RowCount(Source) = 1 then
- #table(
- { "id", "name", "type", "properties.recommendationTypeId", "properties.shortDescription", "properties.resourceMetadata", "properties.suppressionIds", "properties.impactedField", "properties.impactedValue", "properties.lastUpdated", "properties.category", "properties.metadata", "properties.impact", "properties.shortDescription.problem", "properties.shortDescription.solution", "properties.extendedProperties.ObservationPeriodStartDate", "properties.extendedProperties.ObservationPeriodEndDate", "properties.extendedProperties.annualSavingsAmount", "properties.extendedProperties.HasRecommendation", "properties.extendedProperties.savingsCurrency", "properties.extendedProperties.IsInReplication", "properties.extendedProperties.Recommended_DTU", "properties.extendedProperties.Recommended_SKU", "properties.extendedProperties.ResourceGroup", "properties.extendedProperties.savingsAmount", "properties.extendedProperties.DatabaseSize", "properties.extendedProperties.DatabaseName", "properties.extendedProperties.ServerName", "properties.extendedProperties.Region", "properties.extendedProperties.lookbackPeriod", "properties.extendedProperties.subId", "properties.extendedProperties.scope", "properties.extendedProperties.term", "properties.extendedProperties.sku", "properties.extendedProperties.commitment", "properties.extendedProperties.currentSku", "properties.extendedProperties.targetSku", "properties.extendedProperties.recommendationMessage", "properties.resourceMetadata.resourceId", "properties.resourceMetadata.singular", "properties.resourceMetadata.plural", "properties.resourceMetadata.action", "properties.resourceMetadata.source", "SortOrder" },
- {}
- )
- else Source,
- Types = Table.TransformColumnTypes(NullHandling, {
- {"properties.extendedProperties.annualSavingsAmount", type number},
- {"properties.extendedProperties.savingsAmount", type number},
- {"SortOrder", type number},
- {"properties.extendedProperties.ObservationPeriodStartDate", type datetimezone},
- {"properties.extendedProperties.ObservationPeriodEndDate", type datetimezone},
- {"properties.lastUpdated", type datetimezone}
- }, "en-US")
- in
- Types
- ```
-
- annotation PBI_NavigationStepName = Navigation
-
- annotation PBI_ResultType = Table
-
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/AdvisorRecommendations.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/AdvisorRecommendations.tmdl
new file mode 120000
index 000000000..64dcaac16
--- /dev/null
+++ b/src/power-bi/storage/Shared.Dataset/definition/tables/AdvisorRecommendations.tmdl
@@ -0,0 +1 @@
+../../../../kql/Shared.Dataset/definition/tables/AdvisorRecommendations.tmdl
\ No newline at end of file
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/AdvisorReservationRecommendations.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/AdvisorReservationRecommendations.tmdl
deleted file mode 100644
index 2ffb4878e..000000000
--- a/src/power-bi/storage/Shared.Dataset/definition/tables/AdvisorReservationRecommendations.tmdl
+++ /dev/null
@@ -1,547 +0,0 @@
-table AdvisorReservationRecommendations
- lineageTag: e2be3b74-1430-4a74-bf1a-18576064c803
-
- column id
- dataType: string
- lineageTag: e9cd6688-9a32-4da4-86e9-aed15b22652d
- summarizeBy: none
- sourceColumn: id
-
- annotation SummarizationSetBy = Automatic
-
- column name
- dataType: string
- lineageTag: 8eb22dcc-76d0-4491-9aa3-d264bcc05789
- summarizeBy: none
- sourceColumn: name
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.recommendationTypeId'
- dataType: string
- lineageTag: badf977b-e853-4e53-a169-64a2dd84d1dd
- summarizeBy: none
- sourceColumn: properties.recommendationTypeId
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.extendedProperties.annualSavingsAmount'
- dataType: double
- lineageTag: 09d4b890-7c8d-4ee0-943d-4a9212c7091f
- summarizeBy: sum
- sourceColumn: properties.extendedProperties.annualSavingsAmount
-
- annotation SummarizationSetBy = Automatic
-
- annotation PBI_FormatHint = {"isGeneralNumber":true}
-
- column 'properties.extendedProperties.savingsCurrency'
- dataType: string
- lineageTag: 26882091-cceb-4825-8f25-e57c49d2353e
- summarizeBy: none
- sourceColumn: properties.extendedProperties.savingsCurrency
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.extendedProperties.lookbackPeriod'
- dataType: string
- lineageTag: 82a3a6d5-01c1-4db7-be17-572b62ceb699
- summarizeBy: none
- sourceColumn: properties.extendedProperties.lookbackPeriod
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.extendedProperties.savingsAmount'
- dataType: double
- lineageTag: 99312e80-1a6c-4520-a5b0-645f69d8e310
- summarizeBy: sum
- sourceColumn: properties.extendedProperties.savingsAmount
-
- annotation SummarizationSetBy = Automatic
-
- annotation PBI_FormatHint = {"isGeneralNumber":true}
-
- column 'properties.extendedProperties.subId'
- dataType: string
- lineageTag: dbbb8676-ac50-4761-bbd4-3b570710c2f4
- summarizeBy: none
- sourceColumn: properties.extendedProperties.subId
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.extendedProperties.scope'
- dataType: string
- lineageTag: a1352eea-bc3b-468c-a288-178d8cdb770f
- summarizeBy: none
- sourceColumn: properties.extendedProperties.scope
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.extendedProperties.term'
- dataType: string
- lineageTag: 60bc379d-ff92-4d80-89c0-e20addb02ae7
- summarizeBy: none
- sourceColumn: properties.extendedProperties.term
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.extendedProperties.sku'
- dataType: string
- lineageTag: 9754b4be-44c4-46ed-b53a-0cd3c0d3b32c
- summarizeBy: none
- sourceColumn: properties.extendedProperties.sku
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.resourceMetadata.resourceId'
- dataType: string
- lineageTag: c1a5553c-a8e2-44b6-a4e2-ee173b5b88ff
- summarizeBy: none
- sourceColumn: properties.resourceMetadata.resourceId
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.resourceMetadata.singular'
- dataType: string
- lineageTag: aadd862e-b506-4ae6-849a-8a83c0744c65
- summarizeBy: none
- sourceColumn: properties.resourceMetadata.singular
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.resourceMetadata.plural'
- dataType: string
- lineageTag: 3973f04a-8d35-415e-b06e-4ec8dbfe9048
- summarizeBy: none
- sourceColumn: properties.resourceMetadata.plural
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.resourceMetadata.action'
- dataType: string
- lineageTag: 8c8a5ac4-e51d-4fa2-a031-0cb29c29db82
- summarizeBy: none
- sourceColumn: properties.resourceMetadata.action
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.resourceMetadata.source'
- dataType: string
- lineageTag: 4cb277aa-3319-4aaa-8c6a-a49e9a4a11ab
- summarizeBy: none
- sourceColumn: properties.resourceMetadata.source
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.shortDescription.solution'
- dataType: string
- lineageTag: 98412b8a-854a-4292-a30c-8e096ce4c728
- summarizeBy: none
- sourceColumn: properties.shortDescription.solution
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.shortDescription.problem'
- dataType: string
- lineageTag: e31a4cd0-a5f9-4a5f-bea6-ecff0be2ea13
- summarizeBy: none
- sourceColumn: properties.shortDescription.problem
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.suppressionIds'
- dataType: string
- lineageTag: aa582a0d-0c5f-49dd-93f2-3363bb02828c
- summarizeBy: none
- sourceColumn: properties.suppressionIds
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.impactedField'
- dataType: string
- lineageTag: c0947fb9-3d13-4cad-a274-bb58dc488100
- summarizeBy: none
- sourceColumn: properties.impactedField
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.impactedValue'
- dataType: string
- lineageTag: d803c460-7f91-4c6e-9649-a28d90b8f2a2
- summarizeBy: none
- sourceColumn: properties.impactedValue
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.lastUpdated'
- dataType: dateTime
- formatString: General Date
- lineageTag: b93e22ab-02ec-4821-aff7-4a45b86fee21
- summarizeBy: none
- sourceColumn: properties.lastUpdated
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.metadata'
- dataType: string
- lineageTag: 055caf5c-5b7b-428a-b4a1-0b4c68ca55b9
- summarizeBy: none
- sourceColumn: properties.metadata
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.category'
- dataType: string
- lineageTag: 0bdec23f-098b-486d-870d-3df3e3fb737c
- summarizeBy: none
- sourceColumn: properties.category
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.impact'
- dataType: string
- lineageTag: a6596380-928f-4559-a334-26c33b67c4a9
- summarizeBy: none
- sourceColumn: properties.impact
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.shortDescription'
- dataType: string
- lineageTag: 34fae73f-1cea-4fab-8ee4-9c406b4e5de2
- summarizeBy: none
- sourceColumn: properties.shortDescription
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.resourceMetadata'
- dataType: string
- lineageTag: 6399ea0e-c284-4fb8-84e4-a8994d38b8d2
- summarizeBy: none
- sourceColumn: properties.resourceMetadata
-
- annotation SummarizationSetBy = Automatic
-
- column type
- dataType: string
- lineageTag: 16f6fad3-9392-43a0-8414-17d80c82489b
- summarizeBy: none
- sourceColumn: type
-
- annotation SummarizationSetBy = Automatic
-
- column tenantId
- dataType: string
- lineageTag: 944b83f2-1e35-43d1-b712-f8488a690464
- summarizeBy: none
- sourceColumn: tenantId
-
- annotation SummarizationSetBy = Automatic
-
- column kind
- dataType: string
- lineageTag: a16fb1e8-681c-4133-8c2b-ac38888c4f0a
- summarizeBy: none
- sourceColumn: kind
-
- annotation SummarizationSetBy = Automatic
-
- column location
- dataType: string
- lineageTag: 3702fe61-d409-4c8d-8be1-cba17061e33e
- summarizeBy: none
- sourceColumn: location
-
- annotation SummarizationSetBy = Automatic
-
- column resourceGroup
- dataType: string
- lineageTag: bbcbb6da-7975-49eb-8f02-f2d7dcb5dc0f
- summarizeBy: none
- sourceColumn: resourceGroup
-
- annotation SummarizationSetBy = Automatic
-
- column subscriptionId
- dataType: string
- lineageTag: c90deea5-7ac8-438f-a194-7d97640da5f9
- summarizeBy: none
- sourceColumn: subscriptionId
-
- annotation SummarizationSetBy = Automatic
-
- column managedBy
- dataType: string
- lineageTag: 32f1ed8e-b5fc-40f8-a90e-2e1f87171ace
- summarizeBy: none
- sourceColumn: managedBy
-
- annotation SummarizationSetBy = Automatic
-
- column sku
- dataType: string
- lineageTag: 482c2e98-e7f4-40fe-8a05-1fd4a70f6fee
- summarizeBy: none
- sourceColumn: sku
-
- annotation SummarizationSetBy = Automatic
-
- column plan
- dataType: string
- lineageTag: c59c57c5-74ab-41de-af37-a23d1dca2ecc
- summarizeBy: none
- sourceColumn: plan
-
- annotation SummarizationSetBy = Automatic
-
- column properties
- dataType: string
- lineageTag: 8d40212f-93f6-489a-8a48-002238128415
- summarizeBy: none
- sourceColumn: properties
-
- annotation SummarizationSetBy = Automatic
-
- column tags
- dataType: string
- lineageTag: 959f8886-ecee-40bc-b1b7-78d0684f2d66
- summarizeBy: none
- sourceColumn: tags
-
- annotation SummarizationSetBy = Automatic
-
- column identity
- dataType: string
- lineageTag: 2c5dfecb-d165-4f56-8a05-bad2ba1e07cc
- summarizeBy: none
- sourceColumn: identity
-
- annotation SummarizationSetBy = Automatic
-
- column zones
- dataType: string
- lineageTag: 2af41178-da35-4296-bfea-d430c5f24fe2
- summarizeBy: none
- sourceColumn: zones
-
- annotation SummarizationSetBy = Automatic
-
- column extendedLocation
- dataType: string
- lineageTag: 63619dfc-ce80-4af4-b3a1-345ab5604a66
- summarizeBy: none
- sourceColumn: extendedLocation
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.extendedProperties.ObservationPeriodStartDate'
- dataType: dateTime
- formatString: General Date
- lineageTag: 1e286848-dabb-4034-8913-cd9cf2144716
- summarizeBy: none
- sourceColumn: properties.extendedProperties.ObservationPeriodStartDate
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.extendedProperties.ObservationPeriodEndDate'
- dataType: dateTime
- formatString: General Date
- lineageTag: 55c1b862-e2f9-4655-aedc-1e5d5b02e2d4
- summarizeBy: none
- sourceColumn: properties.extendedProperties.ObservationPeriodEndDate
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.extendedProperties.HasRecommendation'
- dataType: string
- lineageTag: b87c10ce-9453-41d4-b56b-680bae8ac4a2
- summarizeBy: none
- sourceColumn: properties.extendedProperties.HasRecommendation
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.extendedProperties.IsInReplication'
- dataType: string
- lineageTag: 7a6be7dd-254a-45a5-8aba-3ca27eca2b5b
- summarizeBy: none
- sourceColumn: properties.extendedProperties.IsInReplication
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.extendedProperties.Recommended_DTU'
- dataType: string
- lineageTag: 48b988f9-4dc0-4f84-86a8-8c3b87940179
- summarizeBy: none
- sourceColumn: properties.extendedProperties.Recommended_DTU
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.extendedProperties.Recommended_SKU'
- dataType: string
- lineageTag: 0a0fdca3-221d-4572-aed6-5c840358cb69
- summarizeBy: none
- sourceColumn: properties.extendedProperties.Recommended_SKU
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.extendedProperties.ResourceGroup'
- dataType: string
- lineageTag: f5ffcebb-d130-457c-a298-6d462eea16bb
- summarizeBy: none
- sourceColumn: properties.extendedProperties.ResourceGroup
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.extendedProperties.DatabaseSize'
- dataType: string
- lineageTag: 42dffd26-268e-49a1-b047-99e8c0f7f104
- summarizeBy: none
- sourceColumn: properties.extendedProperties.DatabaseSize
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.extendedProperties.DatabaseName'
- dataType: string
- lineageTag: f74bb29d-f74d-4c35-bc25-66818909cfcc
- summarizeBy: none
- sourceColumn: properties.extendedProperties.DatabaseName
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.extendedProperties.ServerName'
- dataType: string
- lineageTag: 804d5612-8c2e-4881-a80b-37968100ba21
- summarizeBy: none
- sourceColumn: properties.extendedProperties.ServerName
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.extendedProperties.Region'
- dataType: string
- lineageTag: 68593266-9950-4caf-9522-ccfcbaa5d5e3
- summarizeBy: none
- sourceColumn: properties.extendedProperties.Region
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.extendedProperties.commitment'
- dataType: string
- lineageTag: e0b87d0c-8c42-4354-b85a-5fc93d4af06a
- summarizeBy: none
- sourceColumn: properties.extendedProperties.commitment
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.extendedProperties.currentSku'
- dataType: string
- lineageTag: 11320610-15d3-4db1-89b5-746d92fbf0fa
- summarizeBy: none
- sourceColumn: properties.extendedProperties.currentSku
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.extendedProperties.targetSku'
- dataType: string
- lineageTag: 9a5c5a7c-8a59-4445-8946-d13f64fb3091
- summarizeBy: none
- sourceColumn: properties.extendedProperties.targetSku
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.extendedProperties.recommendationMessage'
- dataType: string
- lineageTag: b2c1b5c3-ae28-4630-8823-d2db3604a1fb
- summarizeBy: none
- sourceColumn: properties.extendedProperties.recommendationMessage
-
- annotation SummarizationSetBy = Automatic
-
- column SortOrder
- dataType: double
- lineageTag: 0abaa4e9-cb2e-49bf-97ab-a0e6f54d3cb2
- summarizeBy: sum
- sourceColumn: SortOrder
-
- annotation SummarizationSetBy = Automatic
-
- annotation PBI_FormatHint = {"isGeneralNumber":true}
-
- partition AdvisorReservationRecommendations = m
- mode: import
- queryGroup: 'Resource Graph'
- source = ```
- let
- Source = AzureResourceGraph.Query("
-
-
- advisorresources
- | where type == 'microsoft.advisor/recommendations'
- | where properties.category == 'Cost'
- | extend
- ['properties.recommendationTypeId'] = properties.recommendationTypeId,
- ['properties.shortDescription'] = properties.shortDescription,
- ['properties.resourceMetadata'] = properties.resourceMetadata,
- ['properties.suppressionIds'] = properties.suppressionIds,
- ['properties.impactedField'] = properties.impactedField,
- ['properties.impactedValue'] = properties.impactedValue,
- ['properties.lastUpdated'] = properties.lastUpdated,
- ['properties.category'] = properties.category,
- ['properties.metadata'] = properties.metadata,
- ['properties.impact'] = properties.impact,
- ['properties.shortDescription.problem'] = properties.shortDescription.problem,
- ['properties.shortDescription.solution'] = properties.shortDescription.solution,
- ['properties.extendedProperties.ObservationPeriodStartDate'] = properties.extendedProperties.ObservationPeriodStartDate,
- ['properties.extendedProperties.ObservationPeriodEndDate'] = properties.extendedProperties.ObservationPeriodEndDate,
- ['properties.extendedProperties.annualSavingsAmount'] = coalesce(properties.extendedProperties.annualSavingsAmount, 0),
- ['properties.extendedProperties.HasRecommendation'] = properties.extendedProperties.HasRecommendation,
- ['properties.extendedProperties.savingsCurrency'] = properties.extendedProperties.savingsCurrency,
- ['properties.extendedProperties.IsInReplication'] = properties.extendedProperties.IsInReplication,
- ['properties.extendedProperties.Recommended_DTU'] = properties.extendedProperties.Recommended_DTU,
- ['properties.extendedProperties.Recommended_SKU'] = properties.extendedProperties.Recommended_SKU,
- ['properties.extendedProperties.ResourceGroup'] = tolower(properties.extendedProperties.ResourceGroup),
- ['properties.extendedProperties.savingsAmount'] = coalesce(properties.extendedProperties.savingsAmount, 0),
- ['properties.extendedProperties.DatabaseSize'] = properties.extendedProperties.DatabaseSize,
- ['properties.extendedProperties.DatabaseName'] = properties.extendedProperties.DatabaseName,
- ['properties.extendedProperties.ServerName'] = properties.extendedProperties.ServerName,
- ['properties.extendedProperties.Region'] = properties.extendedProperties.Region,
- ['properties.extendedProperties.lookbackPeriod'] = properties.extendedProperties.lookbackPeriod,
- ['properties.extendedProperties.subId'] = properties.extendedProperties.subId,
- ['properties.extendedProperties.scope'] = properties.extendedProperties.scope,
- ['properties.extendedProperties.term'] = properties.extendedProperties.term,
- ['properties.extendedProperties.sku'] = properties.extendedProperties.sku,
- ['properties.extendedProperties.commitment'] = properties.extendedProperties.commitment,
- ['properties.extendedProperties.currentSku'] = properties.extendedProperties.currentSku,
- ['properties.extendedProperties.targetSku'] = properties.extendedProperties.targetSku,
- ['properties.extendedProperties.recommendationMessage'] = properties.extendedProperties.recommendationMessage,
- ['properties.resourceMetadata.resourceId'] = tolower(properties.resourceMetadata.resourceId),
- ['properties.resourceMetadata.singular'] = properties.resourceMetadata.singular,
- ['properties.resourceMetadata.plural'] = properties.resourceMetadata.plural,
- ['properties.resourceMetadata.action'] = properties.resourceMetadata.action,
- ['properties.resourceMetadata.source'] = properties.resourceMetadata.source,
- SortOrder = case(properties.impact == 'High', 1, properties.impact == 'Medium', 2, properties.impact == 'Low', 3, 9)
-
-
- " & ftk_DemoFilter(), "Tenant", null, null, [resultTruncated = true]),
- NullHandling =
- if Table.HasColumns(Source, "Results") and Table.RowCount(Source) = 1 then
- #table(
- { "id", "name", "type", "properties.recommendationTypeId", "properties.shortDescription", "properties.resourceMetadata", "properties.suppressionIds", "properties.impactedField", "properties.impactedValue", "properties.lastUpdated", "properties.category", "properties.metadata", "properties.impact", "properties.shortDescription.problem", "properties.shortDescription.solution", "properties.extendedProperties.ObservationPeriodStartDate", "properties.extendedProperties.ObservationPeriodEndDate", "properties.extendedProperties.annualSavingsAmount", "properties.extendedProperties.HasRecommendation", "properties.extendedProperties.savingsCurrency", "properties.extendedProperties.IsInReplication", "properties.extendedProperties.Recommended_DTU", "properties.extendedProperties.Recommended_SKU", "properties.extendedProperties.ResourceGroup", "properties.extendedProperties.savingsAmount", "properties.extendedProperties.DatabaseSize", "properties.extendedProperties.DatabaseName", "properties.extendedProperties.ServerName", "properties.extendedProperties.Region", "properties.extendedProperties.lookbackPeriod", "properties.extendedProperties.subId", "properties.extendedProperties.scope", "properties.extendedProperties.term", "properties.extendedProperties.sku", "properties.extendedProperties.commitment", "properties.extendedProperties.currentSku", "properties.extendedProperties.targetSku", "properties.extendedProperties.recommendationMessage", "properties.resourceMetadata.resourceId", "properties.resourceMetadata.singular", "properties.resourceMetadata.plural", "properties.resourceMetadata.action", "properties.resourceMetadata.source", "SortOrder" },
- {}
- )
- else Source,
- Types = Table.TransformColumnTypes(NullHandling, {
- {"properties.extendedProperties.annualSavingsAmount", type number},
- {"properties.extendedProperties.savingsAmount", type number},
- {"SortOrder", type number},
- {"properties.extendedProperties.ObservationPeriodStartDate", type datetimezone},
- {"properties.extendedProperties.ObservationPeriodEndDate", type datetimezone},
- {"properties.lastUpdated", type datetimezone}
- }, "en-US")
- in
- Types
- ```
-
- annotation PBI_NavigationStepName = Navigation
-
- annotation PBI_ResultType = Table
-
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/AdvisorReservationRecommendations.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/AdvisorReservationRecommendations.tmdl
new file mode 120000
index 000000000..03bc82802
--- /dev/null
+++ b/src/power-bi/storage/Shared.Dataset/definition/tables/AdvisorReservationRecommendations.tmdl
@@ -0,0 +1 @@
+../../../../kql/Shared.Dataset/definition/tables/AdvisorReservationRecommendations.tmdl
\ No newline at end of file
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/Disks.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/Disks.tmdl
deleted file mode 100644
index 34ceb98ac..000000000
--- a/src/power-bi/storage/Shared.Dataset/definition/tables/Disks.tmdl
+++ /dev/null
@@ -1,224 +0,0 @@
-table Disks
- lineageTag: 0008230d-7a07-40e4-ba7f-cef258f5ac62
-
- column subscriptionId
- dataType: string
- lineageTag: 7622c7b1-5d51-4063-97f3-75e8098198d4
- summarizeBy: none
- sourceColumn: subscriptionId
-
- annotation SummarizationSetBy = Automatic
-
- column name
- dataType: string
- lineageTag: d7dc5a6b-6850-421c-90be-26ef85476a28
- summarizeBy: none
- sourceColumn: name
-
- annotation SummarizationSetBy = Automatic
-
- column tenantId
- dataType: string
- lineageTag: 70f65b8a-76e4-4f5f-8b89-28b315f2366a
- summarizeBy: none
- sourceColumn: tenantId
-
- annotation SummarizationSetBy = Automatic
-
- column location
- dataType: string
- lineageTag: bae1fb2b-ef36-4a5c-b266-7ee626ecafc1
- summarizeBy: none
- sourceColumn: location
-
- annotation SummarizationSetBy = Automatic
-
- column managedBy
- dataType: string
- lineageTag: cf9f6e5f-aa49-49d0-a6c0-5a86337daaaf
- summarizeBy: none
- sourceColumn: managedBy
-
- annotation SummarizationSetBy = Automatic
-
- column osType
- dataType: string
- lineageTag: 2813c211-256f-4d18-8bed-13509d542b05
- summarizeBy: none
- sourceColumn: osType
-
- annotation SummarizationSetBy = Automatic
-
- column skuName
- dataType: string
- lineageTag: b7e73136-b3db-4353-9c6d-b589f11dcd80
- summarizeBy: none
- sourceColumn: skuName
-
- annotation SummarizationSetBy = Automatic
-
- column skuTier
- dataType: string
- lineageTag: 56d25952-5baa-43b1-995b-1e4b2de85c12
- summarizeBy: none
- sourceColumn: skuTier
-
- annotation SummarizationSetBy = Automatic
-
- column diskSizeGB
- dataType: double
- formatString: 0
- lineageTag: 3d096969-5e1d-4c86-b27b-4a5052afaade
- summarizeBy: sum
- sourceColumn: diskSizeGB
-
- annotation SummarizationSetBy = Automatic
-
- annotation PBI_FormatHint = {"isDecimal":true}
-
- column diskMBpsReadWrite
- dataType: double
- lineageTag: 553574b1-e3d9-4770-8f7f-c05d6a1763e3
- summarizeBy: sum
- sourceColumn: diskMBpsReadWrite
-
- annotation SummarizationSetBy = Automatic
-
- annotation PBI_FormatHint = {"isGeneralNumber":true}
-
- column diskIOPSReadWrite
- dataType: double
- lineageTag: d614472f-ffe3-45dd-ba19-50ddd2e628e6
- summarizeBy: sum
- sourceColumn: diskIOPSReadWrite
-
- annotation SummarizationSetBy = Automatic
-
- annotation PBI_FormatHint = {"isGeneralNumber":true}
-
- column diskState
- dataType: string
- lineageTag: 0c4f4703-181e-4f33-8b15-f16a72d2278c
- summarizeBy: none
- sourceColumn: diskState
-
- annotation SummarizationSetBy = Automatic
-
- column timeCreated
- dataType: dateTime
- formatString: General Date
- lineageTag: f329e820-03af-4e98-849d-e94e9de82d56
- summarizeBy: none
- sourceColumn: timeCreated
-
- annotation SummarizationSetBy = Automatic
-
- column LastOwnershipUpdateTime
- dataType: dateTime
- formatString: dd/mm/yyyy
- lineageTag: 48d08bc6-f897-48a9-9447-788df9150f94
- summarizeBy: none
- sourceColumn: LastOwnershipUpdateTime
-
- annotation SummarizationSetBy = Automatic
-
- annotation PBI_FormatHint = {"isDateTimeCustom":true}
-
- column diskType
- dataType: string
- lineageTag: cb5aa8fb-6998-4746-b91a-c4241254bf26
- summarizeBy: none
- sourceColumn: diskType
-
- annotation SummarizationSetBy = Automatic
-
- column parentVM
- dataType: string
- lineageTag: c3703ad8-91fb-4863-867e-c77389dd7d35
- summarizeBy: none
- sourceColumn: parentVM
-
- annotation SummarizationSetBy = Automatic
-
- column Redundancy
- dataType: string
- lineageTag: 757f9390-cb96-46cb-8cad-ef02b08ba1ae
- summarizeBy: none
- sourceColumn: Redundancy
-
- annotation SummarizationSetBy = Automatic
-
- column id
- dataType: string
- lineageTag: aced1051-4fe8-4335-8f7d-b1bd4987f29c
- summarizeBy: none
- sourceColumn: id
-
- annotation SummarizationSetBy = Automatic
-
- column resourceGroup
- dataType: string
- lineageTag: 20d3ce4e-e586-49c6-a1c2-ce16d524d12a
- summarizeBy: none
- sourceColumn: resourceGroup
-
- annotation SummarizationSetBy = Automatic
-
- partition Disks = m
- mode: import
- queryGroup: 'Resource Graph'
- source =
- let
- query = "
- resources
- | where type =~ 'microsoft.compute/disks'
- | extend id = tolower(id)
- | extend skuName = sku.name
- | extend skuTier = sku.tier
- | extend timeCreated = properties.timeCreated
- | extend diskSizeGB = properties.diskSizeGB
- | extend diskState = properties.diskState
- | extend LastOwnershipUpdateTime = properties.LastOwnershipUpdateTime
- | extend diskMBpsReadWrite = properties.diskMBpsReadWrite
- | extend diskIOPSReadWrite = properties.diskIOPSReadWrite
- | extend osType = properties.osType
- | extend diskType = iff(isnull(osType), 'Data disk', 'OS disk')
- | parse kind=regex skuName with '_' Redundancy
- | parse kind=regex managedBy with 'virtualMachines/' parentVM
- | project
- subscriptionId,
- resourceGroup,
- id,
- name,
- tenantId,
- location,
- managedBy,
- osType,
- skuName,
- skuTier,
- diskSizeGB,
- diskMBpsReadWrite,
- diskIOPSReadWrite,
- diskState,
- timeCreated,
- LastOwnershipUpdateTime,
- Redundancy,
- parentVM,
- diskType
- " & ftk_DemoFilter(),
- Source = AzureResourceGraph.Query(query, "Tenant", null, null, [resultTruncated = false]),
- NullHandling =
- if Table.HasColumns(Source, "Results") and Table.RowCount(Source) = 1 then
- #table(
- { "id", "name", "subscriptionId", "resourceGroup", "tenantId", "location", "managedBy", "osType", "skuName", "skuTier", "diskSizeGB", "diskMBpsReadWrite", "diskIOPSReadWrite", "diskState", "timeCreated", "LastOwnershipUpdateTime", "Redundancy", "parentVM", "diskType" },
- {}
- )
- else Source,
- Types = Table.TransformColumnTypes(NullHandling,{{"diskSizeGB", type number}, {"diskMBpsReadWrite", type number}, {"diskIOPSReadWrite", type number}, {"timeCreated", type datetimezone}, {"LastOwnershipUpdateTime", type datetimezone}})
- in
- Types
-
- annotation PBI_NavigationStepName = Navigation
-
- annotation PBI_ResultType = Table
-
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/Disks.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/Disks.tmdl
new file mode 120000
index 000000000..e9f596dd5
--- /dev/null
+++ b/src/power-bi/storage/Shared.Dataset/definition/tables/Disks.tmdl
@@ -0,0 +1 @@
+../../../../kql/Shared.Dataset/definition/tables/Disks.tmdl
\ No newline at end of file
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/ManagementGroups.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/ManagementGroups.tmdl
deleted file mode 100644
index 863e8e318..000000000
--- a/src/power-bi/storage/Shared.Dataset/definition/tables/ManagementGroups.tmdl
+++ /dev/null
@@ -1,154 +0,0 @@
-table ManagementGroups
- lineageTag: 0e04ab5f-9838-4180-a7f3-dc1cbcb6f296
-
- column id
- dataType: string
- lineageTag: 38577e5e-de2d-4ca7-a7bf-0bd1d7760f70
- summarizeBy: none
- sourceColumn: id
-
- annotation SummarizationSetBy = Automatic
-
- column name
- dataType: string
- lineageTag: 0fd21169-a00f-4900-9617-2b610fd5aeeb
- summarizeBy: none
- sourceColumn: name
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.displayName'
- dataType: string
- lineageTag: c2a83af4-ecb0-48e2-8c91-c539f010c832
- summarizeBy: none
- sourceColumn: properties.displayName
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.details'
- dataType: string
- lineageTag: 22995768-4815-4e93-8dbd-380eb7d44f43
- summarizeBy: none
- sourceColumn: properties.details
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.details.managementGroupAncestorsChain'
- dataType: string
- lineageTag: d19480fb-6f16-49e7-b2b7-4fad83c35e7d
- summarizeBy: none
- sourceColumn: properties.details.managementGroupAncestorsChain
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.details.updatedTime'
- dataType: string
- lineageTag: 008e6ba3-287b-47b4-a4ab-739a14ac19fa
- summarizeBy: none
- sourceColumn: properties.details.updatedTime
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.details.updatedBy'
- dataType: string
- lineageTag: 7ba4276d-ba03-4243-b330-9b2961829e82
- summarizeBy: none
- sourceColumn: properties.details.updatedBy
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.details.version'
- dataType: string
- lineageTag: cc74e405-4d3e-4c8f-b35f-2dd4d388b1d4
- summarizeBy: none
- sourceColumn: properties.details.version
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.details.parent'
- dataType: string
- lineageTag: 107025bb-de26-4e8b-8c2a-64c244d292d8
- summarizeBy: none
- sourceColumn: properties.details.parent
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.details.parent.displayName'
- dataType: string
- lineageTag: b160c643-8416-4ffd-a945-3c0119eafadb
- summarizeBy: none
- sourceColumn: properties.details.parent.displayName
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.details.parent.name'
- dataType: string
- lineageTag: e5cbe777-4e50-4c62-aec7-67ead1fe0b8d
- summarizeBy: none
- sourceColumn: properties.details.parent.name
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.details.parent.id'
- dataType: string
- lineageTag: 42790a1e-b547-4fdb-808f-8c49218e9530
- summarizeBy: none
- sourceColumn: properties.details.parent.id
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.details.managementGroupAncestorsChain.displayName'
- dataType: string
- lineageTag: 4ca64703-7f49-4170-93f3-16087702156f
- summarizeBy: none
- sourceColumn: properties.details.managementGroupAncestorsChain.displayName
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.details.managementGroupAncestorsChain.name'
- dataType: string
- lineageTag: f5aa191d-ef68-4b44-92f7-63bdca6bc16c
- summarizeBy: none
- sourceColumn: properties.details.managementGroupAncestorsChain.name
-
- annotation SummarizationSetBy = Automatic
-
- partition ManagementGroups = m
- mode: import
- queryGroup: 'Resource Graph'
- source =
- let
- query = "
- resourcecontainers
- | where type == 'microsoft.management/managementgroups'
- | extend
- ['properties.displayName'] = properties.displayName,
- ['properties.details'] = properties.details,
- ['properties.details.managementGroupAncestorsChain'] = properties.details.managementGroupAncestorsChain,
- ['properties.details.updatedTime'] = properties.details.updatedTime,
- ['properties.details.updatedBy'] = properties.details.updatedBy,
- ['properties.details.version'] = properties.details.version,
- ['properties.details.parent'] = properties.details.parent,
- ['properties.details.parent.displayName'] = properties.details.parent.displayName,
- ['properties.details.parent.name'] = properties.details.parent.name,
- ['properties.details.parent.id'] = properties.details.parent.id
- | mv-expand ['properties.details.managementGroupAncestorsChain']
- | extend
- ['properties.details.managementGroupAncestorsChain.displayName'] = properties.details.managementGroupAncestorsChain.displayName,
- ['properties.details.managementGroupAncestorsChain.name'] = properties.details.managementGroupAncestorsChain.name
- " & (if ftk_DemoFilter() = "" then "" else "| where name startswith 'Trey'"),
- Source = AzureResourceGraph.Query(query, "Tenant", null, null, [resultTruncated = false]),
- NullHandling =
- if Table.HasColumns(Source, "Results") and Table.RowCount(Source) = 1 then
- #table(
- { "id", "name", "properties.displayName", "properties.details", "properties.details.managementGroupAncestorsChain", "properties.details.updatedTime", "properties.details.updatedBy", "properties.details.version", "properties.details.parent", "properties.details.parent.displayName", "properties.details.parent.name", "properties.details.parent.id", "properties.details.managementGroupAncestorsChain.displayName", "properties.details.managementGroupAncestorsChain.name" },
- {}
- )
- else Source
- in
- NullHandling
-
- annotation PBI_NavigationStepName = Navigation
-
- annotation PBI_ResultType = Table
-
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/ManagementGroups.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/ManagementGroups.tmdl
new file mode 120000
index 000000000..c71c89f67
--- /dev/null
+++ b/src/power-bi/storage/Shared.Dataset/definition/tables/ManagementGroups.tmdl
@@ -0,0 +1 @@
+../../../../kql/Shared.Dataset/definition/tables/ManagementGroups.tmdl
\ No newline at end of file
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/NetworkInterfaces.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/NetworkInterfaces.tmdl
deleted file mode 100644
index b10885ef7..000000000
--- a/src/power-bi/storage/Shared.Dataset/definition/tables/NetworkInterfaces.tmdl
+++ /dev/null
@@ -1,359 +0,0 @@
-table NetworkInterfaces
- lineageTag: 471a2007-5388-404a-97e6-1b2292878a8c
-
- column id
- dataType: string
- lineageTag: 350304ea-658e-45c9-b91f-9a5c4e9e4e5e
- summarizeBy: none
- sourceColumn: id
-
- annotation SummarizationSetBy = Automatic
-
- column name
- dataType: string
- lineageTag: 4de0f771-a5db-454d-8359-25ac021b7c34
- summarizeBy: none
- sourceColumn: name
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.provisioningState'
- dataType: string
- lineageTag: a914b230-a579-49f5-8d62-30f53d413472
- summarizeBy: none
- sourceColumn: properties.provisioningState
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.resourceGuid'
- dataType: string
- lineageTag: f45d5cde-7c8c-4569-912f-9c5e231564d8
- summarizeBy: none
- sourceColumn: properties.resourceGuid
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.enableAcceleratedNetworking'
- dataType: string
- lineageTag: a1b2c147-76f7-4804-8957-16d7f697ff99
- summarizeBy: none
- sourceColumn: properties.enableAcceleratedNetworking
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.disableTcpStateTracking'
- dataType: string
- lineageTag: b5d561af-b683-4af3-87fc-f7566cc5f8f9
- summarizeBy: none
- sourceColumn: properties.disableTcpStateTracking
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.vnetEncryptionSupported'
- dataType: string
- lineageTag: 415ce3bd-0646-4e4a-b38a-fc9a45800ef9
- summarizeBy: none
- sourceColumn: properties.vnetEncryptionSupported
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.networkSecurityGroup.id'
- dataType: string
- lineageTag: 54e23578-a933-447d-a1db-f96c9089063d
- summarizeBy: none
- sourceColumn: properties.networkSecurityGroup.id
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.ipConfigurations.type'
- dataType: string
- lineageTag: 414395a3-c718-4bc4-ac73-606db3b02953
- summarizeBy: none
- sourceColumn: properties.ipConfigurations.type
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.ipConfigurations.name'
- dataType: string
- lineageTag: 9dce3e2f-9097-4437-a16e-d5f79f3d75a9
- summarizeBy: none
- sourceColumn: properties.ipConfigurations.name
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.ipConfigurations.properties.provisioningState'
- dataType: string
- lineageTag: 59df08a7-16e3-4ae1-9ceb-8b0370af6dbd
- summarizeBy: none
- sourceColumn: properties.ipConfigurations.properties.provisioningState
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.ipConfigurations.properties.privateIPAddressVersion'
- dataType: string
- lineageTag: 73c9a30f-9d7d-40f3-b25c-469ba0479e72
- summarizeBy: none
- sourceColumn: properties.ipConfigurations.properties.privateIPAddressVersion
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.ipConfigurations.properties.privateIPAllocationMethod'
- dataType: string
- lineageTag: b76aad6e-6023-4164-8a57-a70456ed9f03
- summarizeBy: none
- sourceColumn: properties.ipConfigurations.properties.privateIPAllocationMethod
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.ipConfigurations.properties.subnet'
- dataType: string
- lineageTag: 80ef1a4a-cf6e-48fc-afc4-181e61360d1d
- summarizeBy: none
- sourceColumn: properties.ipConfigurations.properties.subnet
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.ipConfigurations.properties.privateIPAddress'
- dataType: string
- lineageTag: 8c504c90-132f-4223-a0ad-a4348a5ee790
- summarizeBy: none
- sourceColumn: properties.ipConfigurations.properties.privateIPAddress
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.ipConfigurations.properties.primary'
- dataType: string
- lineageTag: a9cbfce3-bbdf-4db6-bbb1-d16afbc57117
- summarizeBy: none
- sourceColumn: properties.ipConfigurations.properties.primary
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.ipConfigurations.properties.publicIPAddress.id'
- dataType: string
- lineageTag: 26bdae49-b2c1-4acc-908b-6bc01631c134
- summarizeBy: none
- sourceColumn: properties.ipConfigurations.properties.publicIPAddress.id
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.ipConfigurations.id'
- dataType: string
- lineageTag: 3c77c9cd-7a20-43f1-ad5f-4f57755e0f79
- summarizeBy: none
- sourceColumn: properties.ipConfigurations.id
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.ipConfigurations.etag'
- dataType: string
- lineageTag: 95127943-55d6-4d40-9386-2bde61c45455
- summarizeBy: none
- sourceColumn: properties.ipConfigurations.etag
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.enableIPForwarding'
- dataType: string
- lineageTag: 8c870b92-2431-48ed-a4e3-8adc3977625a
- summarizeBy: none
- sourceColumn: properties.enableIPForwarding
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.tapConfigurations'
- dataType: string
- lineageTag: 23417d1a-820a-4832-94a8-fa7097c30863
- summarizeBy: none
- sourceColumn: properties.tapConfigurations
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.hostedWorkloads'
- dataType: string
- lineageTag: 69ad895c-4bb9-4f98-8da3-6c0b8a00d4f0
- summarizeBy: none
- sourceColumn: properties.hostedWorkloads
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.allowPort25Out'
- dataType: string
- lineageTag: e9b92dd1-0da9-4db1-82db-1437b06af481
- summarizeBy: none
- sourceColumn: properties.allowPort25Out
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.auxiliaryMode'
- dataType: string
- lineageTag: b3a8fb34-de86-48b2-bcc2-4602912fa4ac
- summarizeBy: none
- sourceColumn: properties.auxiliaryMode
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.dnsSettings'
- dataType: string
- lineageTag: 02f4ca50-b2c4-4c58-9349-dbc5f64cff51
- summarizeBy: none
- sourceColumn: properties.dnsSettings
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.auxiliarySku'
- dataType: string
- lineageTag: 2b2a9e20-1b30-47e7-b827-de2d05b60924
- summarizeBy: none
- sourceColumn: properties.auxiliarySku
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.macAddress'
- dataType: string
- lineageTag: ad7b0e74-c32a-46be-9b70-707bfc821aa1
- summarizeBy: none
- sourceColumn: properties.macAddress
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.nicType'
- dataType: string
- lineageTag: b80d3831-5768-43c2-96a8-b9c7e02cb784
- summarizeBy: none
- sourceColumn: properties.nicType
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.primary'
- dataType: string
- lineageTag: 17232334-69c8-41d2-8f26-2c29dbba06a3
- summarizeBy: none
- sourceColumn: properties.primary
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.virtualMachine.id'
- dataType: string
- lineageTag: 04875637-be0f-43c8-8cef-9c1acc492ffc
- summarizeBy: none
- sourceColumn: properties.virtualMachine.id
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.networkSecurityGroup'
- dataType: string
- lineageTag: 8ff1ceae-7275-4140-97ff-2b5966d113ee
- summarizeBy: none
- sourceColumn: properties.networkSecurityGroup
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.ipConfigurations'
- dataType: string
- lineageTag: 5b7294e2-2846-4688-91ba-a7de264bad07
- summarizeBy: none
- sourceColumn: properties.ipConfigurations
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.virtualMachine'
- dataType: string
- lineageTag: 6223842f-24da-46ce-8346-627044237497
- summarizeBy: none
- sourceColumn: properties.virtualMachine
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.ipConfigurations.properties'
- dataType: string
- lineageTag: 961de273-fb7c-4805-8df8-0f6a1ddb345b
- summarizeBy: none
- sourceColumn: properties.ipConfigurations.properties
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.ipConfigurations.properties.publicIPAddress'
- dataType: string
- lineageTag: 0481ca01-dae9-474b-8233-501ab1bfe9ef
- summarizeBy: none
- sourceColumn: properties.ipConfigurations.properties.publicIPAddress
-
- annotation SummarizationSetBy = Automatic
-
- column location
- dataType: string
- lineageTag: 35f54cb8-f055-4a0c-a6d8-cb01f12f208a
- summarizeBy: none
- sourceColumn: location
-
- annotation SummarizationSetBy = Automatic
-
- column resourceGroup
- dataType: string
- lineageTag: a9f30217-df47-45f3-9392-92af1949fae6
- summarizeBy: none
- sourceColumn: resourceGroup
-
- annotation SummarizationSetBy = Automatic
-
- partition NetworkInterfaces = m
- mode: import
- queryGroup: 'Resource Graph'
- source =
- let
- query = "
- Resources
- | where type =~ 'microsoft.network/networkinterfaces'
- | extend
- ['properties.provisioningState'] = properties.provisioningState,
- ['properties.resourceGuid'] = properties.resourceGuid,
- ['properties.enableAcceleratedNetworking'] = properties.enableAcceleratedNetworking,
- ['properties.disableTcpStateTracking'] = properties.disableTcpStateTracking,
- ['properties.vnetEncryptionSupported'] = properties.vnetEncryptionSupported,
- ['properties.networkSecurityGroup'] = properties.networkSecurityGroup,
- ['properties.ipConfigurations'] = properties.ipConfigurations,
- ['properties.enableIPForwarding'] = properties.enableIPForwarding,
- ['properties.tapConfigurations'] = properties.tapConfigurations,
- ['properties.hostedWorkloads'] = properties.hostedWorkloads,
- ['properties.allowPort25Out'] = properties.allowPort25Out,
- ['properties.auxiliaryMode'] = properties.auxiliaryMode,
- ['properties.dnsSettings'] = properties.dnsSettings,
- ['properties.auxiliarySku'] = properties.auxiliarySku,
- ['properties.macAddress'] = properties.macAddress,
- ['properties.nicType'] = properties.nicType,
- ['properties.primary'] = properties.primary,
- ['properties.virtualMachine'] = properties.virtualMachine,
- ['properties.virtualMachine.id'] = properties.virtualMachine.id
- | mv-expand ['properties.ipConfigurations']
- | extend
- ['properties.ipConfigurations.type'] = properties.ipConfigurations.type,
- ['properties.ipConfigurations.name'] = properties.ipConfigurations.name,
- ['properties.ipConfigurations.properties'] = properties.ipConfigurations.properties,
- ['properties.ipConfigurations.id'] = properties.ipConfigurations.id,
- ['properties.ipConfigurations.etag'] = properties.ipConfigurations.etag,
- ['properties.ipConfigurations.properties.provisioningState'] = properties.ipConfigurations.properties.provisioningState,
- ['properties.ipConfigurations.properties.privateIPAddressVersion'] = properties.ipConfigurations.properties.privateIPAddressVersion,
- ['properties.ipConfigurations.properties.privateIPAllocationMethod'] = properties.ipConfigurations.properties.privateIPAllocationMethod,
- ['properties.ipConfigurations.properties.subnet'] = properties.ipConfigurations.properties.subnet,
- ['properties.ipConfigurations.properties.privateIPAddress'] = properties.ipConfigurations.properties.privateIPAddress,
- ['properties.ipConfigurations.properties.primary'] = properties.ipConfigurations.properties.primary,
- ['properties.ipConfigurations.properties.publicIPAddress'] = properties.ipConfigurations.properties.publicIPAddress,
- ['properties.ipConfigurations.properties.publicIPAddress.id'] = properties.ipConfigurations.properties.publicIPAddress.id,
- ['properties.networkSecurityGroup.id'] = properties.networkSecurityGroup.id
- " & ftk_DemoFilter(),
- Source = AzureResourceGraph.Query(query, "Tenant", null, null, [resultTruncated = false]),
- NullHandling =
- if Table.HasColumns(Source, "Results") and Table.RowCount(Source) = 1 then
- #table(
- { "id", "name", "location", "resourceGroup", "properties.provisioningState", "properties.resourceGuid", "properties.enableAcceleratedNetworking", "properties.disableTcpStateTracking", "properties.vnetEncryptionSupported", "properties.networkSecurityGroup", "properties.ipConfigurations", "properties.enableIPForwarding", "properties.tapConfigurations", "properties.hostedWorkloads", "properties.allowPort25Out", "properties.auxiliaryMode", "properties.dnsSettings", "properties.auxiliarySku", "properties.macAddress", "properties.nicType", "properties.primary", "properties.virtualMachine", "properties.virtualMachine.id", "properties.ipConfigurations.type", "properties.ipConfigurations.name", "properties.ipConfigurations.properties", "properties.ipConfigurations.id", "properties.ipConfigurations.etag", "properties.ipConfigurations.properties.provisioningState", "properties.ipConfigurations.properties.privateIPAddressVersion", "properties.ipConfigurations.properties.privateIPAllocationMethod", "properties.ipConfigurations.properties.subnet", "properties.ipConfigurations.properties.privateIPAddress", "properties.ipConfigurations.properties.primary", "properties.ipConfigurations.properties.publicIPAddress", "properties.ipConfigurations.properties.publicIPAddress.id", "properties.networkSecurityGroup.id" },
- {}
- )
- else Source
- in
- NullHandling
-
- annotation PBI_NavigationStepName = Navigation
-
- annotation PBI_ResultType = Table
-
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/NetworkInterfaces.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/NetworkInterfaces.tmdl
new file mode 120000
index 000000000..8607c17a7
--- /dev/null
+++ b/src/power-bi/storage/Shared.Dataset/definition/tables/NetworkInterfaces.tmdl
@@ -0,0 +1 @@
+../../../../kql/Shared.Dataset/definition/tables/NetworkInterfaces.tmdl
\ No newline at end of file
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/NetworkSecurityGroups.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/NetworkSecurityGroups.tmdl
deleted file mode 100644
index 4086e5283..000000000
--- a/src/power-bi/storage/Shared.Dataset/definition/tables/NetworkSecurityGroups.tmdl
+++ /dev/null
@@ -1,249 +0,0 @@
-table NetworkSecurityGroups
- lineageTag: 7d98f967-9180-4a4f-958a-89256520af0f
-
- column id
- dataType: string
- lineageTag: f482c1e4-d36d-47dd-ab46-ab41d9e651ae
- summarizeBy: none
- sourceColumn: id
-
- annotation SummarizationSetBy = Automatic
-
- column name
- dataType: string
- lineageTag: dbe15cec-f5b3-4c38-8688-b1dc486c42d9
- summarizeBy: none
- sourceColumn: name
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.resourceGuid'
- dataType: string
- lineageTag: eff5cb67-bada-4826-adc8-4b2a10f81ddc
- summarizeBy: none
- sourceColumn: properties.resourceGuid
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.securityRules.properties.destinationAddressPrefix'
- dataType: string
- lineageTag: 2f249b57-c790-4687-82a1-d805f75f3f83
- summarizeBy: none
- sourceColumn: properties.securityRules.properties.destinationAddressPrefix
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.securityRules.properties.sourceAddressPrefix'
- dataType: string
- lineageTag: 04bad4dd-667f-4ff3-bde1-ad99b1b40d31
- summarizeBy: none
- sourceColumn: properties.securityRules.properties.sourceAddressPrefix
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.securityRules.properties.destinationPortRange'
- dataType: string
- lineageTag: b2ca87a4-a342-493b-8a4e-8ae9b48755d0
- summarizeBy: none
- sourceColumn: properties.securityRules.properties.destinationPortRange
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.securityRules.properties.sourcePortRange'
- dataType: string
- lineageTag: 77d6b680-9a1e-4e7f-8af8-13278f52c156
- summarizeBy: none
- sourceColumn: properties.securityRules.properties.sourcePortRange
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.securityRules.properties.protocol'
- dataType: string
- lineageTag: 398c4c53-0c7b-4f52-a06a-e798d9df7416
- summarizeBy: none
- sourceColumn: properties.securityRules.properties.protocol
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.securityRules.properties.direction'
- dataType: string
- lineageTag: 399c736a-57aa-4c0e-8892-865e1cef7484
- summarizeBy: none
- sourceColumn: properties.securityRules.properties.direction
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.securityRules.properties.priority'
- dataType: string
- lineageTag: 437e410b-fa04-49ee-b33e-00abf7a5435d
- summarizeBy: none
- sourceColumn: properties.securityRules.properties.priority
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.securityRules.properties.access'
- dataType: string
- lineageTag: 5033a598-4e4b-4394-9085-3affe314aa9a
- summarizeBy: none
- sourceColumn: properties.securityRules.properties.access
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.securityRules.name'
- dataType: string
- lineageTag: 4c100028-a36b-4531-84fc-6b39ea2e005d
- summarizeBy: none
- sourceColumn: properties.securityRules.name
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.securityRules.id'
- dataType: string
- lineageTag: 710fb1a1-0b44-45c5-8e6b-e55ef2788b53
- summarizeBy: none
- sourceColumn: properties.securityRules.id
-
- annotation SummarizationSetBy = Automatic
-
- column isWarning = ```
- IF('NetworkSecurityGroups'[properties.securityRules.properties.access]="Allow",
- SWITCH(
- 'NetworkSecurityGroups'[properties.securityRules.properties.destinationPortRange],
- "80", "True",
- "22", "True",
- "3389", "True",
- "False"
- ), "False"
- )
- ```
- lineageTag: 5fb590a3-057d-487e-af26-3e6686be93fe
- summarizeBy: none
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.securityRules'
- dataType: string
- lineageTag: 49da77d4-1ae6-486d-8e0a-e05c49d44e91
- summarizeBy: none
- sourceColumn: properties.securityRules
-
- annotation SummarizationSetBy = Automatic
-
- column location
- dataType: string
- lineageTag: 0df42dd6-3aa2-44f3-a2ad-b8556165582c
- summarizeBy: none
- sourceColumn: location
-
- annotation SummarizationSetBy = Automatic
-
- column resourceGroup
- dataType: string
- lineageTag: ee71f894-1abf-4b2a-8b79-1e7e73cc0db5
- summarizeBy: none
- sourceColumn: resourceGroup
-
- annotation SummarizationSetBy = Automatic
-
- partition NetworkSecurityGroups = m
- mode: import
- queryGroup: 'Resource Graph'
- source =
- let
- query = "
- resources
- | where type =~ 'microsoft.network/networksecuritygroups'
- | extend
- ['properties.resourceGuid'] = properties.resourceGuid,
- ['properties.securityRules'] = properties.securityRules
- | mv-expand ['properties.securityRules']
- | extend
- ['properties.securityRules.name'] = properties.securityRules.name,
- ['properties.securityRules.id'] = properties.securityRules.id,
- ['properties.securityRules.properties.destinationAddressPrefix'] = properties.securityRules.properties.destinationAddressPrefix,
- ['properties.securityRules.properties.sourceAddressPrefix'] = properties.securityRules.properties.sourceAddressPrefix,
- ['properties.securityRules.properties.destinationPortRange'] = properties.securityRules.properties.destinationPortRange,
- ['properties.securityRules.properties.sourcePortRange'] = properties.securityRules.properties.sourcePortRange,
- ['properties.securityRules.properties.protocol'] = properties.securityRules.properties.protocol,
- ['properties.securityRules.properties.direction'] = properties.securityRules.properties.direction,
- ['properties.securityRules.properties.priority'] = properties.securityRules.properties.priority,
- ['properties.securityRules.properties.access'] = properties.securityRules.properties.access
- " & ftk_DemoFilter(),
- Source = AzureResourceGraph.Query(query, "Tenant", null, null, [resultTruncated = false]),
- NullHandling =
- if Table.HasColumns(Source, "Results") and Table.RowCount(Source) = 1 then
- #table(
- { "id", "name", "location", "resourceGroup", "properties.resourceGuid", "properties.securityRules", "properties.securityRules.name", "properties.securityRules.id", "properties.securityRules.properties.destinationAddressPrefix", "properties.securityRules.properties.sourceAddressPrefix", "properties.securityRules.properties.destinationPortRange", "properties.securityRules.properties.sourcePortRange", "properties.securityRules.properties.protocol", "properties.securityRules.properties.direction", "properties.securityRules.properties.priority", "properties.securityRules.properties.access" },
- {}
- )
- else Source
- in
- NullHandling
-
-
- // Full query
- // resources
- // | where type =~ 'microsoft.network/networksecuritygroups'
- // | extend
- // ['properties.provisioningState'] = properties.provisioningState,
- // ['properties.networkInterfaces'] = properties.networkInterfaces,
- // ['properties.resourceGuid'] = properties.resourceGuid,
- // ['properties.defaultSecurityRules'] = properties.defaultSecurityRules,
- // ['properties.securityRules'] = properties.securityRules
- // | mv-expand ['properties.networkInterfaces']
- // | extend
- // ['properties.networkInterfaces.id'] = properties.networkInterfaces.id
- // | mv-expand ['properties.defaultSecurityRules']
- // | extend
- // ['properties.defaultSecurityRules.type'] = properties.defaultSecurityRules.type,
- // ['properties.defaultSecurityRules.properties'] = properties.defaultSecurityRules.properties,
- // ['properties.defaultSecurityRules.name'] = properties.defaultSecurityRules.name,
- // ['properties.defaultSecurityRules.id'] = properties.defaultSecurityRules.id,
- // ['properties.defaultSecurityRules.etag'] = properties.defaultSecurityRules.etag,
- // ['properties.defaultSecurityRules.properties.provisioningState'] = properties.defaultSecurityRules.properties.provisioningState,
- // ['properties.defaultSecurityRules.properties.destinationAddressPrefixes'] = properties.defaultSecurityRules.properties.destinationAddressPrefixes,
- // ['properties.defaultSecurityRules.properties.destinationAddressPrefix'] = properties.defaultSecurityRules.properties.destinationAddressPrefix,
- // ['properties.defaultSecurityRules.properties.destinationPortRanges'] = properties.defaultSecurityRules.properties.destinationPortRanges,
- // ['properties.defaultSecurityRules.properties.sourceAddressPrefixes'] = properties.defaultSecurityRules.properties.sourceAddressPrefixes,
- // ['properties.defaultSecurityRules.properties.sourceAddressPrefix'] = properties.defaultSecurityRules.properties.sourceAddressPrefix,
- // ['properties.defaultSecurityRules.properties.destinationPortRange'] = properties.defaultSecurityRules.properties.destinationPortRange,
- // ['properties.defaultSecurityRules.properties.sourcePortRanges'] = properties.defaultSecurityRules.properties.sourcePortRanges,
- // ['properties.defaultSecurityRules.properties.sourcePortRange'] = properties.defaultSecurityRules.properties.sourcePortRange,
- // ['properties.defaultSecurityRules.properties.description'] = properties.defaultSecurityRules.properties.description,
- // ['properties.defaultSecurityRules.properties.protocol'] = properties.defaultSecurityRules.properties.protocol,
- // ['properties.defaultSecurityRules.properties.direction'] = properties.defaultSecurityRules.properties.direction,
- // ['properties.defaultSecurityRules.properties.priority'] = properties.defaultSecurityRules.properties.priority,
- // ['properties.defaultSecurityRules.properties.access'] = properties.defaultSecurityRules.properties.access
- // | mv-expand ['properties.defaultSecurityRules.properties.destinationAddressPrefixes']
- // | mv-expand ['properties.defaultSecurityRules.properties.destinationPortRanges']
- // | mv-expand ['properties.defaultSecurityRules.properties.sourceAddressPrefixes']
- // | mv-expand ['properties.defaultSecurityRules.properties.sourcePortRanges']
- // | mv-expand ['properties.securityRules']
- // | extend
- // ['properties.securityRules.type'] = properties.securityRules.type,
- // ['properties.securityRules.properties'] = properties.securityRules.properties,
- // ['properties.securityRules.name'] = properties.securityRules.name,
- // ['properties.securityRules.id'] = properties.securityRules.id,
- // ['properties.securityRules.etag'] = properties.securityRules.etag,
- // ['properties.securityRules.properties.provisioningState'] = properties.securityRules.properties.provisioningState,
- // ['properties.securityRules.properties.destinationAddressPrefixes'] = properties.securityRules.properties.destinationAddressPrefixes,
- // ['properties.securityRules.properties.destinationAddressPrefix'] = properties.securityRules.properties.destinationAddressPrefix,
- // ['properties.securityRules.properties.destinationPortRanges'] = properties.securityRules.properties.destinationPortRanges,
- // ['properties.securityRules.properties.sourceAddressPrefixes'] = properties.securityRules.properties.sourceAddressPrefixes,
- // ['properties.securityRules.properties.sourceAddressPrefix'] = properties.securityRules.properties.sourceAddressPrefix,
- // ['properties.securityRules.properties.destinationPortRange'] = properties.securityRules.properties.destinationPortRange,
- // ['properties.securityRules.properties.sourcePortRanges'] = properties.securityRules.properties.sourcePortRanges,
- // ['properties.securityRules.properties.sourcePortRange'] = properties.securityRules.properties.sourcePortRange,
- // ['properties.securityRules.properties.protocol'] = properties.securityRules.properties.protocol,
- // ['properties.securityRules.properties.direction'] = properties.securityRules.properties.direction,
- // ['properties.securityRules.properties.priority'] = properties.securityRules.properties.priority,
- // ['properties.securityRules.properties.access'] = properties.securityRules.properties.access
- // | mv-expand ['properties.securityRules.properties.destinationAddressPrefixes']
- // | mv-expand ['properties.securityRules.properties.destinationPortRanges']
- // | mv-expand ['properties.securityRules.properties.sourceAddressPrefixes']
- // | mv-expand ['properties.securityRules.properties.sourcePortRanges']
-
- annotation PBI_NavigationStepName = Navigation
-
- annotation PBI_ResultType = Table
-
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/NetworkSecurityGroups.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/NetworkSecurityGroups.tmdl
new file mode 120000
index 000000000..7eb7d8f75
--- /dev/null
+++ b/src/power-bi/storage/Shared.Dataset/definition/tables/NetworkSecurityGroups.tmdl
@@ -0,0 +1 @@
+../../../../kql/Shared.Dataset/definition/tables/NetworkSecurityGroups.tmdl
\ No newline at end of file
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/PolicyAssignments.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/PolicyAssignments.tmdl
deleted file mode 100644
index 23a204f7d..000000000
--- a/src/power-bi/storage/Shared.Dataset/definition/tables/PolicyAssignments.tmdl
+++ /dev/null
@@ -1,306 +0,0 @@
-table PolicyAssignments
- lineageTag: fc42feb2-59a9-44bf-8459-e2c1592a05dd
-
- column id
- dataType: string
- lineageTag: 1d348226-a506-40a1-8192-5ec485e0af9e
- summarizeBy: none
- sourceColumn: id
-
- annotation SummarizationSetBy = Automatic
-
- column name
- dataType: string
- lineageTag: ff261d9a-3eef-498a-8636-ff52bf63770c
- summarizeBy: none
- sourceColumn: name
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.policyDefinitionId'
- dataType: string
- lineageTag: 36991dc9-f91b-42b4-9748-be127108cfde
- summarizeBy: none
- sourceColumn: properties.policyDefinitionId
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.effectiveDefinitionVersion'
- dataType: string
- lineageTag: 16da8ecd-c393-4286-a7cd-1040228789be
- summarizeBy: none
- sourceColumn: properties.effectiveDefinitionVersion
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.latestDefinitionVersion'
- dataType: string
- lineageTag: 3bca024d-238d-4d9b-bbb0-d684521dd31d
- summarizeBy: none
- sourceColumn: properties.latestDefinitionVersion
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.nonComplianceMessages'
- dataType: string
- lineageTag: 57b279a8-b3c2-4044-9e04-de1cc0c6164a
- summarizeBy: none
- sourceColumn: properties.nonComplianceMessages
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.definitionVersion'
- dataType: string
- lineageTag: 9aebe9eb-2371-4b13-9c76-36b3c5c823d6
- summarizeBy: none
- sourceColumn: properties.definitionVersion
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.resourceSelectors'
- dataType: string
- lineageTag: 11813bfd-1f37-488d-9285-1e772849b256
- summarizeBy: none
- sourceColumn: properties.resourceSelectors
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.enforcementMode'
- dataType: string
- lineageTag: d4584d1e-b6da-4040-b6a4-7134c0672510
- summarizeBy: none
- sourceColumn: properties.enforcementMode
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.assignmentType'
- dataType: string
- lineageTag: 6819787b-73a8-4e0e-8070-023568c7b976
- summarizeBy: none
- sourceColumn: properties.assignmentType
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.description'
- dataType: string
- lineageTag: d3ea744d-704e-48ee-9c5a-d8a17344916d
- summarizeBy: none
- sourceColumn: properties.description
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.displayName'
- dataType: string
- lineageTag: 5c957d8e-fd18-4850-960e-be9a8af7bccd
- summarizeBy: none
- sourceColumn: properties.displayName
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.parameters'
- dataType: string
- lineageTag: 1b67137d-df28-4b74-8513-486851b8628f
- summarizeBy: none
- sourceColumn: properties.parameters
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.notScopes'
- dataType: string
- lineageTag: e804ae45-625e-44c0-b9b7-faab55df20fc
- summarizeBy: none
- sourceColumn: properties.notScopes
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.overrides'
- dataType: string
- lineageTag: 1d20ddb9-f2f3-41d2-9449-dfea4797fb7f
- summarizeBy: none
- sourceColumn: properties.overrides
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.metadata.createdOn'
- dataType: string
- lineageTag: c2e66679-d4aa-440f-b152-d5d57460bea8
- summarizeBy: none
- sourceColumn: properties.metadata.createdOn
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.metadata.createdBy'
- dataType: string
- lineageTag: 9b40d28e-65b2-4ae1-92b1-7f60becaf430
- summarizeBy: none
- sourceColumn: properties.metadata.createdBy
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.metadata.assignedBy'
- dataType: string
- lineageTag: 5f9f32b3-e881-4748-814c-30eec5c31a6d
- summarizeBy: none
- sourceColumn: properties.metadata.assignedBy
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.metadata.parameterScopes'
- dataType: string
- lineageTag: cd98c09d-2563-4c18-b3ab-8843c0ec89fa
- summarizeBy: none
- sourceColumn: properties.metadata.parameterScopes
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.metadata.updatedOn'
- dataType: string
- lineageTag: 2a9a3ec7-6033-442b-95dd-ca16a8aa1a58
- summarizeBy: none
- sourceColumn: properties.metadata.updatedOn
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.metadata.updatedBy'
- dataType: string
- lineageTag: eff9fd70-f125-4e24-af7f-00c272ad7bd4
- summarizeBy: none
- sourceColumn: properties.metadata.updatedBy
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.metadata.category'
- dataType: string
- lineageTag: 359d4829-4b57-4c18-867f-175a3b77dfc9
- summarizeBy: none
- sourceColumn: properties.metadata.category
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.metadata.managedByResourceId'
- dataType: string
- lineageTag: c1974d8c-1e1f-429c-802c-ef88431e904a
- summarizeBy: none
- sourceColumn: properties.metadata.managedByResourceId
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.metadata.securityCenter'
- dataType: string
- lineageTag: 314cbab7-3be5-4e85-9d9f-9fe808ccc0be
- summarizeBy: none
- sourceColumn: properties.metadata.securityCenter
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.metadata.excludedOutOfTheBoxStandards'
- dataType: string
- lineageTag: 01fd1c38-2a24-4858-9335-8bd5cfdab130
- summarizeBy: none
- sourceColumn: properties.metadata.excludedOutOfTheBoxStandards
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.scope'
- dataType: string
- lineageTag: 445e8666-eaf2-4846-8f0f-439c5f6bf9da
- summarizeBy: none
- sourceColumn: properties.scope
-
- annotation SummarizationSetBy = Automatic
-
- column 'identity.userAssignedIdentities'
- dataType: string
- lineageTag: 8586946a-0e29-4772-b707-275f248a986b
- summarizeBy: none
- sourceColumn: identity.userAssignedIdentities
-
- annotation SummarizationSetBy = Automatic
-
- column 'identity.principalId'
- dataType: string
- lineageTag: c41ce4d0-bbea-4b58-b2d9-31d310c82775
- summarizeBy: none
- sourceColumn: identity.principalId
-
- annotation SummarizationSetBy = Automatic
-
- column 'identity.tenantId'
- dataType: string
- lineageTag: 3c44bc44-86b1-4fc9-af7b-0d1c0c80a39f
- summarizeBy: none
- sourceColumn: identity.tenantId
-
- annotation SummarizationSetBy = Automatic
-
- column 'identity.type'
- dataType: string
- lineageTag: ab440e5d-da40-4376-8be6-ddae6a99cb27
- summarizeBy: none
- sourceColumn: identity.type
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.metadata'
- dataType: string
- lineageTag: a94cc1c6-bf08-40f6-91b4-5ce811d3b876
- summarizeBy: none
- sourceColumn: properties.metadata
-
- annotation SummarizationSetBy = Automatic
-
- partition PolicyAssignments = m
- mode: import
- queryGroup: 'Resource Graph'
- source =
- let
- query = "
- policyResources
- | where type =~'Microsoft.Authorization/PolicyAssignments'
- | extend
- ['properties.policyDefinitionId'] = properties.policyDefinitionId,
- ['properties.effectiveDefinitionVersion'] = properties.effectiveDefinitionVersion,
- ['properties.latestDefinitionVersion'] = properties.latestDefinitionVersion,
- ['properties.nonComplianceMessages'] = properties.nonComplianceMessages,
- ['properties.definitionVersion'] = properties.definitionVersion,
- ['properties.resourceSelectors'] = properties.resourceSelectors,
- ['properties.enforcementMode'] = properties.enforcementMode,
- ['properties.assignmentType'] = properties.assignmentType,
- ['properties.description'] = properties.description,
- ['properties.displayName'] = properties.displayName,
- ['properties.parameters'] = properties.parameters,
- ['properties.notScopes'] = properties.notScopes,
- ['properties.overrides'] = properties.overrides,
- ['properties.metadata'] = properties.metadata,
- ['properties.scope'] = properties.scope,
- ['properties.metadata.createdOn'] = properties.metadata.createdOn,
- ['properties.metadata.createdBy'] = properties.metadata.createdBy,
- ['properties.metadata.assignedBy'] = properties.metadata.assignedBy,
- ['properties.metadata.parameterScopes'] = properties.metadata.parameterScopes,
- ['properties.metadata.updatedOn'] = properties.metadata.updatedOn,
- ['properties.metadata.updatedBy'] = properties.metadata.updatedBy,
- ['properties.metadata.category'] = properties.metadata.category,
- ['properties.metadata.managedByResourceId'] = properties.metadata.managedByResourceId,
- ['properties.metadata.securityCenter'] = properties.metadata.securityCenter,
- ['properties.metadata.excludedOutOfTheBoxStandards'] = properties.metadata.excludedOutOfTheBoxStandards,
- ['identity.userAssignedIdentities'] = identity.userAssignedIdentities,
- ['identity.principalId'] = identity.principalId,
- ['identity.tenantId'] = identity.tenantId,
- ['identity.type'] = identity.type
- | mv-expand ['properties.notScopes']
- " & ftk_DemoFilter(),
- Source = AzureResourceGraph.Query(query, "Tenant", null, null, [resultTruncated = false]),
- NullHandling =
- if Table.HasColumns(Source, "Results") and Table.RowCount(Source) = 1 then
- #table(
- { "id", "name", "properties.policyDefinitionId", "properties.effectiveDefinitionVersion", "properties.latestDefinitionVersion", "properties.nonComplianceMessages", "properties.definitionVersion", "properties.resourceSelectors", "properties.enforcementMode", "properties.assignmentType", "properties.description", "properties.displayName", "properties.parameters", "properties.notScopes", "properties.overrides", "properties.metadata", "properties.scope", "properties.metadata.createdOn", "properties.metadata.createdBy", "properties.metadata.assignedBy", "properties.metadata.parameterScopes", "properties.metadata.updatedOn", "properties.metadata.updatedBy", "properties.metadata.category", "properties.metadata.managedByResourceId", "properties.metadata.securityCenter", "properties.metadata.excludedOutOfTheBoxStandards", "identity.userAssignedIdentities", "identity.principalId", "identity.tenantId", "identity.type" },
- {}
- )
- else Source
- in
- NullHandling
-
- annotation PBI_NavigationStepName = Navigation
-
- annotation PBI_ResultType = Table
-
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/PolicyAssignments.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/PolicyAssignments.tmdl
new file mode 120000
index 000000000..b745e0ec1
--- /dev/null
+++ b/src/power-bi/storage/Shared.Dataset/definition/tables/PolicyAssignments.tmdl
@@ -0,0 +1 @@
+../../../../kql/Shared.Dataset/definition/tables/PolicyAssignments.tmdl
\ No newline at end of file
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/PolicyStates.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/PolicyStates.tmdl
deleted file mode 100644
index 1ef43f326..000000000
--- a/src/power-bi/storage/Shared.Dataset/definition/tables/PolicyStates.tmdl
+++ /dev/null
@@ -1,276 +0,0 @@
-table PolicyStates
- lineageTag: cf0e7752-0e35-40aa-a509-8a4f90194eee
-
- measure complianceScore = [compliantCount]/[totalResourceCount]
- formatString: 0.00\ %;-0.00\ %;0.00\ %
- lineageTag: 8ef15317-240f-47a3-b0c2-fa0d092eda61
-
- measure compliantCount = [totalResourceCount]-[nonCompliantCount]
- lineageTag: 29316f3a-f1eb-4c74-9f1b-a5b5534a8439
-
- measure nonCompliantCount = CALCULATE(DISTINCTCOUNT(PolicyStates[properties.resourceId]),FILTER(PolicyStates,PolicyStates[properties.complianceState]="NonCompliant"))
- formatString: 0
- lineageTag: c25950a1-8a49-4e9e-9d81-0a5972981c83
-
- measure totalResourceCount = DISTINCTCOUNT(PolicyStates[properties.resourceId])
- formatString: 0
- lineageTag: b2e3060a-ed8b-4a7f-bf4e-171701a5e3d6
-
- column id
- dataType: string
- lineageTag: d4561592-c509-4be1-b385-54bd35c5ec64
- summarizeBy: none
- sourceColumn: id
-
- annotation SummarizationSetBy = Automatic
-
- column name
- dataType: string
- lineageTag: 2df63a8b-89fb-4025-b249-7966450656e0
- summarizeBy: none
- sourceColumn: name
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.policyAssignmentParameters'
- dataType: string
- lineageTag: 783fc75e-393f-420a-b8ee-2646799d9089
- summarizeBy: none
- sourceColumn: properties.policyAssignmentParameters
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.policyDefinitionAction'
- dataType: string
- lineageTag: 58ea97b8-2c5d-43a7-98ea-3e0951ec4dfc
- summarizeBy: none
- sourceColumn: properties.policyDefinitionAction
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.policyAssignmentScope'
- dataType: string
- lineageTag: f665182c-f54e-4c40-977c-561dd6faa46d
- summarizeBy: none
- sourceColumn: properties.policyAssignmentScope
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.policyAssignmentName'
- dataType: string
- lineageTag: 3df25eec-090a-4c1b-a852-69054f56dfdd
- summarizeBy: none
- sourceColumn: properties.policyAssignmentName
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.policyDefinitionName'
- dataType: string
- lineageTag: 67350a21-f5cc-43c1-92ed-064bb00320ac
- summarizeBy: none
- sourceColumn: properties.policyDefinitionName
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.policyDefinitionReferenceId'
- dataType: string
- lineageTag: 3c524d4a-60f0-4a4d-8a5b-1123317b7096
- summarizeBy: none
- sourceColumn: properties.policyDefinitionReferenceId
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.policyDefinitionId'
- dataType: string
- lineageTag: f0d2244b-93f7-481e-9de9-c3dc6d894ea8
- summarizeBy: none
- sourceColumn: properties.policyDefinitionId
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.managementGroupIds'
- dataType: string
- lineageTag: 720d2a55-2591-4d1d-a162-6a2c3b0c1061
- summarizeBy: none
- sourceColumn: properties.managementGroupIds
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.policyAssignmentId'
- dataType: string
- lineageTag: 77528366-57af-4541-b8d9-034cbfdfd50a
- summarizeBy: none
- sourceColumn: properties.policyAssignmentId
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.policySetDefinitionName'
- dataType: string
- lineageTag: ff358f4c-5504-4c56-a883-53d4e636b71e
- summarizeBy: none
- sourceColumn: properties.policySetDefinitionName
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.complianceState'
- dataType: string
- lineageTag: 5ab6c2e6-763a-412b-960f-cfb43ddeb748
- summarizeBy: none
- sourceColumn: properties.complianceState
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.policySetDefinitionId'
- dataType: string
- lineageTag: e8f24c7c-ea8a-46b7-a73d-1fa68f22bc92
- summarizeBy: none
- sourceColumn: properties.policySetDefinitionId
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.subscriptionId'
- dataType: string
- lineageTag: 6ff5f7b7-6409-4422-9836-e62d383cc34a
- summarizeBy: none
- sourceColumn: properties.subscriptionId
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.resourceType'
- dataType: string
- lineageTag: b1d49f84-9b69-4118-9235-cde3c949457c
- summarizeBy: none
- sourceColumn: properties.resourceType
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.stateWeight'
- dataType: string
- lineageTag: 5c6c27a9-5ef9-492a-af89-ec2e7de56e3c
- summarizeBy: none
- sourceColumn: properties.stateWeight
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.resourceGroup'
- dataType: string
- lineageTag: bab7846a-e342-4472-82db-587b700c3e03
- summarizeBy: none
- sourceColumn: properties.resourceGroup
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.resourceId'
- dataType: string
- lineageTag: be95d463-c31e-472e-b7a9-ce79a87886c5
- summarizeBy: none
- sourceColumn: properties.resourceId
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.timestamp'
- dataType: string
- lineageTag: f3d23e6e-ccdb-4149-8f8e-87df9ec51a6c
- summarizeBy: none
- sourceColumn: properties.timestamp
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.isDeleted'
- dataType: string
- lineageTag: 8b13dbc1-fda0-4464-9c8f-543d1fa99f9a
- summarizeBy: none
- sourceColumn: properties.isDeleted
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.resourceLocation'
- dataType: string
- lineageTag: 7face71a-1084-448e-9448-fdbd851a4a73
- summarizeBy: none
- sourceColumn: properties.resourceLocation
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.policySetDefinitionCategory'
- dataType: string
- lineageTag: 2821fa37-31e7-49c4-983d-e097cc4ac6b3
- summarizeBy: none
- sourceColumn: properties.policySetDefinitionCategory
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.policyDefinitionGroupNames'
- dataType: string
- lineageTag: 5b1f343c-d014-4884-976f-078ec25e7432
- summarizeBy: none
- sourceColumn: properties.policyDefinitionGroupNames
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.complianceReasonCode'
- dataType: string
- lineageTag: d7426779-4a22-4013-8dbd-65b45b3fc3d1
- summarizeBy: none
- sourceColumn: properties.complianceReasonCode
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.stateDetails'
- dataType: string
- lineageTag: b29f486c-994e-4218-8b7f-d4b4421a54b8
- summarizeBy: none
- sourceColumn: properties.stateDetails
-
- annotation SummarizationSetBy = Automatic
-
- partition PolicyStates = m
- mode: import
- queryGroup: 'Resource Graph'
- source =
- let
- query = "
- policyResources
- | where type =~'Microsoft.PolicyInsights/PolicyStates'
- | extend
- ['properties.policyAssignmentParameters'] = properties.policyAssignmentParameters,
- ['properties.policyDefinitionAction'] = properties.policyDefinitionAction,
- ['properties.policyAssignmentScope'] = properties.policyAssignmentScope,
- ['properties.policyAssignmentName'] = properties.policyAssignmentName,
- ['properties.policyDefinitionName'] = properties.policyDefinitionName,
- ['properties.policyDefinitionReferenceId'] = properties.policyDefinitionReferenceId,
- ['properties.policyDefinitionId'] = properties.policyDefinitionId,
- ['properties.managementGroupIds'] = properties.managementGroupIds,
- ['properties.policyAssignmentId'] = properties.policyAssignmentId,
- ['properties.policySetDefinitionName'] = properties.policySetDefinitionName,
- ['properties.complianceState'] = properties.complianceState,
- ['properties.policySetDefinitionId'] = properties.policySetDefinitionId,
- ['properties.subscriptionId'] = properties.subscriptionId,
- ['properties.resourceType'] = properties.resourceType,
- ['properties.stateWeight'] = properties.stateWeight,
- ['properties.resourceGroup'] = properties.resourceGroup,
- ['properties.resourceId'] = properties.resourceId,
- ['properties.timestamp'] = properties.timestamp,
- ['properties.isDeleted'] = properties.isDeleted,
- ['properties.resourceLocation'] = properties.resourceLocation,
- ['properties.policySetDefinitionCategory'] = properties.policySetDefinitionCategory,
- ['properties.policyDefinitionGroupNames'] = properties.policyDefinitionGroupNames,
- ['properties.complianceReasonCode'] = properties.complianceReasonCode,
- ['properties.stateDetails'] = properties.stateDetails
- " & ftk_DemoFilter(),
- Source = AzureResourceGraph.Query(query, "Tenant", null, null, [resultTruncated = false]),
- NullHandling =
- if Table.HasColumns(Source, "Results") and Table.RowCount(Source) = 1 then
- #table(
- { "id", "name", "properties.policyAssignmentParameters", "properties.policyDefinitionAction", "properties.policyAssignmentScope", "properties.policyAssignmentName", "properties.policyDefinitionName", "properties.policyDefinitionReferenceId", "properties.policyDefinitionId", "properties.managementGroupIds", "properties.policyAssignmentId", "properties.policySetDefinitionName", "properties.complianceState", "properties.policySetDefinitionId", "properties.subscriptionId", "properties.resourceType", "properties.stateWeight", "properties.resourceGroup", "properties.resourceId", "properties.timestamp", "properties.isDeleted", "properties.resourceLocation", "properties.policySetDefinitionCategory", "properties.policyDefinitionGroupNames", "properties.complianceReasonCode", "properties.stateDetails" },
- {}
- )
- else Source,
- Types = Table.TransformColumns(NullHandling, {{"properties.policyAssignmentScope", each Text.AfterDelimiter(_, "/", {0, RelativePosition.FromEnd}), type text}}, null, MissingField.Ignore)
- in
- Types
-
- annotation PBI_NavigationStepName = Navigation
-
- annotation PBI_ResultType = Table
-
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/PolicyStates.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/PolicyStates.tmdl
new file mode 120000
index 000000000..879e3a9e3
--- /dev/null
+++ b/src/power-bi/storage/Shared.Dataset/definition/tables/PolicyStates.tmdl
@@ -0,0 +1 @@
+../../../../kql/Shared.Dataset/definition/tables/PolicyStates.tmdl
\ No newline at end of file
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/PublicIPAddresses.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/PublicIPAddresses.tmdl
deleted file mode 100644
index ac2dd5755..000000000
--- a/src/power-bi/storage/Shared.Dataset/definition/tables/PublicIPAddresses.tmdl
+++ /dev/null
@@ -1,116 +0,0 @@
-table PublicIPAddresses
- lineageTag: 5c35f59e-97dc-424c-b1ae-0526c2c708ed
-
- column id
- dataType: string
- lineageTag: 25bf5fbf-8f5e-4b15-a187-625c6a612325
- summarizeBy: none
- sourceColumn: id
-
- annotation SummarizationSetBy = Automatic
-
- column name
- dataType: string
- lineageTag: 6004d8c7-c14e-4645-959a-be60b835cff9
- summarizeBy: none
- sourceColumn: name
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.provisioningState'
- dataType: string
- lineageTag: 552b63bf-51c6-487b-94ba-9811897d6668
- summarizeBy: none
- sourceColumn: properties.provisioningState
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.resourceGuid'
- dataType: string
- lineageTag: 9792e908-997a-4ef1-a288-cca086f0a720
- summarizeBy: none
- sourceColumn: properties.resourceGuid
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.idleTimeoutInMinutes'
- dataType: string
- lineageTag: 71fa242f-feef-4749-871e-212257842c7c
- summarizeBy: none
- sourceColumn: properties.idleTimeoutInMinutes
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.publicIPAllocationMethod'
- dataType: string
- lineageTag: 6691799d-57f0-4949-b0cb-a3d392b056c0
- summarizeBy: none
- sourceColumn: properties.publicIPAllocationMethod
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.publicIPAddressVersion'
- dataType: string
- lineageTag: a2509f77-55b5-4da7-bc2b-673da4224c5c
- summarizeBy: none
- sourceColumn: properties.publicIPAddressVersion
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.ipAddress'
- dataType: string
- lineageTag: c4667d70-08f9-4d7c-8401-1bb9674cdc65
- summarizeBy: none
- sourceColumn: properties.ipAddress
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.ipConfiguration'
- dataType: string
- lineageTag: 996ada29-00db-4da9-8c3a-f132a9942293
- summarizeBy: none
- sourceColumn: properties.ipConfiguration
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.ipTags'
- dataType: string
- lineageTag: c6048a40-80ce-40bf-85c2-5020bd678dee
- summarizeBy: none
- sourceColumn: properties.ipTags
-
- annotation SummarizationSetBy = Automatic
-
- partition PublicIPAddresses = m
- mode: import
- queryGroup: 'Resource Graph'
- source =
- let
- query = "
- Resources
- | where type =~ 'microsoft.network/publicipaddresses'
- | extend
- ['properties.provisioningState'] = properties.provisioningState,
- ['properties.resourceGuid'] = properties.resourceGuid,
- ['properties.idleTimeoutInMinutes'] = properties.idleTimeoutInMinutes,
- ['properties.publicIPAllocationMethod'] = properties.publicIPAllocationMethod,
- ['properties.publicIPAddressVersion'] = properties.publicIPAddressVersion,
- ['properties.ipAddress'] = properties.ipAddress,
- ['properties.ipConfiguration'] = properties.ipConfiguration,
- ['properties.ipTags'] = properties.ipTags
- " & ftk_DemoFilter(),
- Source = AzureResourceGraph.Query(query, "Tenant", null, null, [resultTruncated = false]),
- NullHandling =
- if Table.HasColumns(Source, "Results") and Table.RowCount(Source) = 1 then
- #table(
- { "id", "name", "properties.provisioningState", "properties.resourceGuid", "properties.idleTimeoutInMinutes", "properties.publicIPAllocationMethod", "properties.publicIPAddressVersion", "properties.ipAddress", "properties.ipConfiguration", "properties.ipTags" },
- {}
- )
- else Source
- in
- NullHandling
-
- annotation PBI_NavigationStepName = Navigation
-
- annotation PBI_ResultType = Table
-
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/PublicIPAddresses.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/PublicIPAddresses.tmdl
new file mode 120000
index 000000000..8fad22b99
--- /dev/null
+++ b/src/power-bi/storage/Shared.Dataset/definition/tables/PublicIPAddresses.tmdl
@@ -0,0 +1 @@
+../../../../kql/Shared.Dataset/definition/tables/PublicIPAddresses.tmdl
\ No newline at end of file
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/Resources.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/Resources.tmdl
deleted file mode 100644
index a9b90a5df..000000000
--- a/src/power-bi/storage/Shared.Dataset/definition/tables/Resources.tmdl
+++ /dev/null
@@ -1,114 +0,0 @@
-table Resources
- lineageTag: ec447c64-6e55-41d8-a5ea-a43adab5dc79
-
- column id
- dataType: string
- lineageTag: 6c849866-bafa-4cdf-a863-0a5831052c26
- summarizeBy: none
- sourceColumn: id
-
- annotation SummarizationSetBy = Automatic
-
- column name
- dataType: string
- lineageTag: d4a137b0-b83b-4750-8515-efc2bd5aecd0
- summarizeBy: none
- sourceColumn: name
-
- annotation SummarizationSetBy = Automatic
-
- column type
- dataType: string
- lineageTag: 1b2381eb-97e7-4d28-90ab-21ca7571abeb
- summarizeBy: none
- sourceColumn: type
-
- annotation SummarizationSetBy = Automatic
-
- column tenantId
- dataType: string
- lineageTag: 22020c14-f82a-4ce1-91aa-258318ca95d5
- summarizeBy: none
- sourceColumn: tenantId
-
- annotation SummarizationSetBy = Automatic
-
- column location
- dataType: string
- lineageTag: 94a3783c-937e-4fad-a7bd-7dc286027241
- summarizeBy: none
- sourceColumn: location
-
- annotation SummarizationSetBy = Automatic
-
- column resourceGroup
- dataType: string
- lineageTag: bf7f9a12-8b99-43f1-bb81-7df06117afb8
- summarizeBy: none
- sourceColumn: resourceGroup
-
- annotation SummarizationSetBy = Automatic
-
- column subscriptionId
- dataType: string
- lineageTag: 8c7bbeee-c26d-4a1c-9f17-1061d8e43724
- summarizeBy: none
- sourceColumn: subscriptionId
-
- annotation SummarizationSetBy = Automatic
-
- column creationTime
- dataType: string
- lineageTag: 3313d128-8b39-4fe1-ba22-8e9f6dc24f42
- summarizeBy: none
- sourceColumn: creationTime
-
- annotation SummarizationSetBy = Automatic
-
- column x_ResourceGroupId = "/subscriptions/" & Resources[subscriptionId] & "/resourcegroups/" & Resources[resourceGroup]
- lineageTag: dfd516fd-8d25-441f-93a3-190abe05d572
- summarizeBy: none
-
- annotation SummarizationSetBy = Automatic
-
- column timeModified
- dataType: string
- lineageTag: f9a30d28-b76c-4f48-b909-ae980bbfbc27
- summarizeBy: none
- sourceColumn: timeModified
-
- annotation SummarizationSetBy = Automatic
-
- partition Resources = m
- mode: import
- queryGroup: 'Resource Graph'
- source =
- let
- query = "
- resources
- | extend
- id = tolower(id),
- ['creationTime'] = properties.creationTime,
- ['timeModified'] = properties.timeModified
- | project id, name, type, tenantId, location, subscriptionId, resourceGroup, creationTime, timeModified
- " & ftk_DemoFilter(),
- Source = AzureResourceGraph.Query(query, "Tenant", null, null, [resultTruncated = false]),
- NullHandling =
- if Table.HasColumns(Source, "Results") and Table.RowCount(Source) = 1 then
- #table(
- { "id", "name", "type", "tenantId", "location", "subscriptionId", "resourceGroup", "creationTime", "timeModified" },
- {}
- )
- else Source,
-
- // Remove duplicate IDs
- // This step may hide valid rows and show invalid rows due to a bug in Resource Graph. We do not recommend it but are including it in case you want to unblock yourself.
- // If you experience a "duplicate IDs" error for the Resources table, please file a support request against Azure Resource Graph.
- RemoveDuplicates = if #"Remove Duplicate Resource IDs" then Table.Distinct(NullHandling, {"id"}) else NullHandling
- in
- RemoveDuplicates
-
- annotation PBI_NavigationStepName = Navigation
-
- annotation PBI_ResultType = Table
-
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/Resources.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/Resources.tmdl
new file mode 120000
index 000000000..a0cac40ed
--- /dev/null
+++ b/src/power-bi/storage/Shared.Dataset/definition/tables/Resources.tmdl
@@ -0,0 +1 @@
+../../../../kql/Shared.Dataset/definition/tables/Resources.tmdl
\ No newline at end of file
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/SqlDatabases.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/SqlDatabases.tmdl
deleted file mode 100644
index 077a26057..000000000
--- a/src/power-bi/storage/Shared.Dataset/definition/tables/SqlDatabases.tmdl
+++ /dev/null
@@ -1,287 +0,0 @@
-table SqlDatabases
- lineageTag: 28ccb046-cb49-4d65-8bef-6c25b4e6d9bd
-
- column id
- dataType: string
- lineageTag: a62eaf23-4570-4604-84a8-62c1cc93732f
- summarizeBy: none
- sourceColumn: id
-
- annotation SummarizationSetBy = Automatic
-
- column name
- dataType: string
- lineageTag: b343c8ed-f905-49e3-a997-7993656a8edc
- summarizeBy: none
- sourceColumn: name
-
- annotation SummarizationSetBy = Automatic
-
- column 'sku.name'
- dataType: string
- lineageTag: 1be92f30-01fc-4f24-b3f1-7f6321288452
- summarizeBy: none
- sourceColumn: sku.name
-
- annotation SummarizationSetBy = Automatic
-
- column 'sku.tier'
- dataType: string
- lineageTag: 1055f96a-796e-4fdd-92c4-d82dfe695486
- summarizeBy: none
- sourceColumn: sku.tier
-
- annotation SummarizationSetBy = Automatic
-
- column 'sku.capacity'
- dataType: string
- lineageTag: 043c12dd-1962-4a4b-ae15-28f6dcceb173
- summarizeBy: none
- sourceColumn: sku.capacity
-
- annotation SummarizationSetBy = Automatic
-
- column 'sku.family'
- dataType: string
- lineageTag: dc9ae49c-72fb-4f17-8dc5-274874adf4d3
- summarizeBy: none
- sourceColumn: sku.family
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.status'
- dataType: string
- lineageTag: 5acab20a-48e5-40a6-be42-4ce285d6050c
- summarizeBy: none
- sourceColumn: properties.status
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.requestedBackupStorageRedundancy'
- dataType: string
- lineageTag: 06b8e874-abdd-4169-ab5d-9bb0d77133e9
- summarizeBy: none
- sourceColumn: properties.requestedBackupStorageRedundancy
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.currentBackupStorageRedundancy'
- dataType: string
- lineageTag: 9b75a75f-130c-4740-b1c6-5f8b5b2349a0
- summarizeBy: none
- sourceColumn: properties.currentBackupStorageRedundancy
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.requestedServiceObjectiveName'
- dataType: string
- lineageTag: 5e0bca97-e4e6-48dd-b0cf-0aec6b495e54
- summarizeBy: none
- sourceColumn: properties.requestedServiceObjectiveName
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.currentServiceObjectiveName'
- dataType: string
- lineageTag: b9f2c839-cb78-4fbd-a865-0b9bdcea1d93
- summarizeBy: none
- sourceColumn: properties.currentServiceObjectiveName
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.maintenanceConfigurationId'
- dataType: string
- lineageTag: a70c975b-7ee1-4f9d-86ea-0a608ee1ca06
- summarizeBy: none
- sourceColumn: properties.maintenanceConfigurationId
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.defaultSecondaryLocation'
- dataType: string
- lineageTag: 0618b4ff-529a-47ab-b17d-d3cc1b44a365
- summarizeBy: none
- sourceColumn: properties.defaultSecondaryLocation
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.isInfraEncryptionEnabled'
- dataType: string
- lineageTag: 71c1a23e-de24-406d-8f60-2d37a331d8e2
- summarizeBy: none
- sourceColumn: properties.isInfraEncryptionEnabled
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.earliestRestoreDate'
- dataType: string
- lineageTag: 5d9c2600-6d0a-41e5-8674-964c34ee2211
- summarizeBy: none
- sourceColumn: properties.earliestRestoreDate
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.zoneRedundant'
- dataType: string
- lineageTag: 99c1096c-4e12-4f02-b8eb-b56b958ba0c1
- summarizeBy: none
- sourceColumn: properties.zoneRedundant
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.availabilityZone'
- dataType: string
- lineageTag: f94ad863-bf18-46a0-9c48-0f5ca34e3c8a
- summarizeBy: none
- sourceColumn: properties.availabilityZone
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.catalogCollation'
- dataType: string
- lineageTag: 2bd47a2e-a367-4120-a8d9-8538155790fb
- summarizeBy: none
- sourceColumn: properties.catalogCollation
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.creationDate'
- dataType: dateTime
- formatString: General Date
- lineageTag: f5cf5ffd-b2b2-482a-8573-1af7a4cce5b2
- summarizeBy: none
- sourceColumn: properties.creationDate
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.collation'
- dataType: string
- lineageTag: 70eab20f-6666-4657-aca7-eb17823fc698
- summarizeBy: none
- sourceColumn: properties.collation
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.licenseType'
- dataType: string
- lineageTag: 319756bd-fd30-4055-b93c-bd3eef82607c
- summarizeBy: none
- sourceColumn: properties.licenseType
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.maxSizeBytes'
- dataType: string
- lineageTag: ecc2bd34-5a78-4734-a156-296b640b1901
- summarizeBy: none
- sourceColumn: properties.maxSizeBytes
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.isLedgerOn'
- dataType: string
- lineageTag: ae359e3d-1a28-4232-b24c-14e2d3d0d7d1
- summarizeBy: none
- sourceColumn: properties.isLedgerOn
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.databaseId'
- dataType: string
- lineageTag: 300c3dce-a252-4c19-9eb8-f566861f76b0
- summarizeBy: none
- sourceColumn: properties.databaseId
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.currentSku'
- dataType: string
- lineageTag: 13aba0ef-924c-4e25-81b2-5cca3fff3da1
- summarizeBy: none
- sourceColumn: properties.currentSku
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.readScale'
- dataType: string
- lineageTag: 1459556c-62f2-40ff-9518-f258f7a053a8
- summarizeBy: none
- sourceColumn: properties.readScale
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.maxLogSizeBytes'
- dataType: string
- lineageTag: 466ba7c2-ad63-45a4-bde1-8f17ea763bc2
- summarizeBy: none
- sourceColumn: properties.maxLogSizeBytes
-
- annotation SummarizationSetBy = Automatic
-
- column location
- dataType: string
- lineageTag: 36ba9f05-8be1-420f-9b8e-66588e69fb4c
- summarizeBy: none
- sourceColumn: location
-
- annotation SummarizationSetBy = Automatic
-
- column resourceGroup
- dataType: string
- lineageTag: 2c7600e3-4a24-4d08-8829-2e3161a35ce8
- summarizeBy: none
- sourceColumn: resourceGroup
-
- annotation SummarizationSetBy = Automatic
-
- partition SqlDatabases = m
- mode: import
- queryGroup: 'Resource Graph'
- source =
- let
- query = "
- resources
- | where type == 'microsoft.sql/servers/databases'
- | extend
- ['sku.name'] = sku.name,
- ['sku.tier'] = sku.tier,
- ['sku.capacity'] = sku.capacity,
- ['sku.family'] = sku.family,
- ['properties.status'] = properties.status,
- ['properties.requestedBackupStorageRedundancy'] = properties.requestedBackupStorageRedundancy,
- ['properties.currentBackupStorageRedundancy'] = properties.currentBackupStorageRedundancy,
- ['properties.requestedServiceObjectiveName'] = properties.requestedServiceObjectiveName,
- ['properties.currentServiceObjectiveName'] = properties.currentServiceObjectiveName,
- ['properties.maintenanceConfigurationId'] = properties.maintenanceConfigurationId,
- ['properties.defaultSecondaryLocation'] = properties.defaultSecondaryLocation,
- ['properties.isInfraEncryptionEnabled'] = properties.isInfraEncryptionEnabled,
- ['properties.earliestRestoreDate'] = properties.earliestRestoreDate,
- ['properties.zoneRedundant'] = properties.zoneRedundant,
- ['properties.availabilityZone'] = properties.availabilityZone,
- ['properties.catalogCollation'] = properties.catalogCollation,
- ['properties.creationDate'] = properties.creationDate,
- ['properties.collation'] = properties.collation,
- ['properties.licenseType'] = properties.licenseType,
- ['properties.maxSizeBytes'] = properties.maxSizeBytes,
- ['properties.isLedgerOn'] = properties.isLedgerOn,
- ['properties.databaseId'] = properties.databaseId,
- ['properties.currentSku'] = properties.currentSku,
- ['properties.readScale'] = properties.readScale,
- ['properties.maxLogSizeBytes'] = properties.maxLogSizeBytes
- " & ftk_DemoFilter(),
- Source = AzureResourceGraph.Query(query, "Tenant", null, null, [resultTruncated = false]),
- NullHandling =
- if Table.HasColumns(Source, "Results") and Table.RowCount(Source) = 1 then
- #table(
- { "id", "name", "sku.name", "sku.tier", "sku.capacity", "sku.family", "location", "resourceGroup", "properties.status", "properties.requestedBackupStorageRedundancy", "properties.currentBackupStorageRedundancy", "properties.requestedServiceObjectiveName", "properties.currentServiceObjectiveName", "properties.maintenanceConfigurationId", "properties.defaultSecondaryLocation", "properties.isInfraEncryptionEnabled", "properties.earliestRestoreDate", "properties.zoneRedundant", "properties.availabilityZone", "properties.catalogCollation", "properties.creationDate", "properties.collation", "properties.licenseType", "properties.maxSizeBytes", "properties.isLedgerOn", "properties.databaseId", "properties.currentSku", "properties.readScale", "properties.maxLogSizeBytes" },
- {}
- )
- else Source,
- Types = Table.TransformColumnTypes(NullHandling, {{"properties.creationDate", type datetimezone}})
- in
- Types
-
- annotation PBI_NavigationStepName = Navigation
-
- annotation PBI_ResultType = Table
-
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/SqlDatabases.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/SqlDatabases.tmdl
new file mode 120000
index 000000000..076e27526
--- /dev/null
+++ b/src/power-bi/storage/Shared.Dataset/definition/tables/SqlDatabases.tmdl
@@ -0,0 +1 @@
+../../../../kql/Shared.Dataset/definition/tables/SqlDatabases.tmdl
\ No newline at end of file
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/Subscriptions.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/Subscriptions.tmdl
deleted file mode 100644
index 28d8ec2da..000000000
--- a/src/power-bi/storage/Shared.Dataset/definition/tables/Subscriptions.tmdl
+++ /dev/null
@@ -1,175 +0,0 @@
-table Subscriptions
- lineageTag: 07b667e4-2b48-4235-8cfb-5d59858a92fd
-
- column id
- dataType: string
- lineageTag: 793921fd-f3f6-4f61-b14e-8fa9430505b4
- summarizeBy: none
- sourceColumn: id
-
- annotation SummarizationSetBy = Automatic
-
- column name
- dataType: string
- lineageTag: 8505a157-2e52-44c3-aae3-7a17aa29e660
- summarizeBy: none
- sourceColumn: name
-
- annotation SummarizationSetBy = Automatic
-
- column type
- dataType: string
- lineageTag: f4dd6a96-342a-43f3-88a3-e1787d6d67b8
- summarizeBy: none
- sourceColumn: type
-
- annotation SummarizationSetBy = Automatic
-
- column tenantId
- dataType: string
- lineageTag: 3194af1d-8e00-49df-86bb-8b491c39ae3d
- summarizeBy: none
- sourceColumn: tenantId
-
- annotation SummarizationSetBy = Automatic
-
- column kind
- dataType: string
- lineageTag: 540d1adf-2e23-4e17-afca-65de9fe9681b
- summarizeBy: none
- sourceColumn: kind
-
- annotation SummarizationSetBy = Automatic
-
- column location
- dataType: string
- lineageTag: 4ba56665-8cb0-448d-a51a-1d5847d1d651
- summarizeBy: none
- sourceColumn: location
-
- annotation SummarizationSetBy = Automatic
-
- column resourceGroup
- dataType: string
- lineageTag: a1a2d9d2-d9f1-4109-b4c7-2eb2697004e9
- summarizeBy: none
- sourceColumn: resourceGroup
-
- annotation SummarizationSetBy = Automatic
-
- column subscriptionId
- dataType: string
- lineageTag: 3ed589d4-d97f-460c-9f6f-81b131c8b8b2
- summarizeBy: none
- sourceColumn: subscriptionId
-
- annotation SummarizationSetBy = Automatic
-
- column managedBy
- dataType: string
- lineageTag: 5be96267-523e-4c25-823c-ed29e37bd321
- summarizeBy: none
- sourceColumn: managedBy
-
- annotation SummarizationSetBy = Automatic
-
- column sku
- dataType: string
- lineageTag: 21317308-a1e5-495b-9e1c-d0e60fa9e45e
- summarizeBy: none
- sourceColumn: sku
-
- annotation SummarizationSetBy = Automatic
-
- column plan
- dataType: string
- lineageTag: 71a123ff-da4e-40a8-9e8a-51cf3e0cd91b
- summarizeBy: none
- sourceColumn: plan
-
- annotation SummarizationSetBy = Automatic
-
- column tags
- dataType: string
- lineageTag: ff48b324-4a1c-488d-97d3-f9f59e0b7f3c
- summarizeBy: none
- sourceColumn: tags
-
- annotation SummarizationSetBy = Automatic
-
- column identity
- dataType: string
- lineageTag: c13df37c-910c-432c-a474-b7d68dbc1ddb
- summarizeBy: none
- sourceColumn: identity
-
- annotation SummarizationSetBy = Automatic
-
- column zones
- dataType: string
- lineageTag: 39936a9e-4e8c-4e26-9688-6a23cbe4804d
- summarizeBy: none
- sourceColumn: zones
-
- annotation SummarizationSetBy = Automatic
-
- column extendedLocation
- dataType: string
- lineageTag: a6bc54f9-1649-4b14-b916-70b557245ac4
- summarizeBy: none
- sourceColumn: extendedLocation
-
- annotation SummarizationSetBy = Automatic
-
- column properties
- dataType: string
- lineageTag: 6a2cd7e5-ed25-4b1c-b06f-29a947c9b8d6
- summarizeBy: none
- sourceColumn: properties
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.managementGroupAncestorsChain'
- dataType: string
- lineageTag: fbb4c9cd-dcfc-4b61-8bc7-42b8dfd82e50
- summarizeBy: none
- sourceColumn: properties.managementGroupAncestorsChain
-
- annotation SummarizationSetBy = Automatic
-
- column 'properties.state'
- dataType: string
- lineageTag: c37d69f0-5039-4418-94b9-44fcd6690201
- summarizeBy: none
- sourceColumn: properties.state
-
- annotation SummarizationSetBy = Automatic
-
- partition Subscriptions = m
- mode: import
- queryGroup: 'Resource Graph'
- source = ```
- let
- query = "
- resourcecontainers
- | where type == 'microsoft.resources/subscriptions'
- | extend
- ['properties.managementGroupAncestorsChain'] = properties.managementGroupAncestorsChain,
- ['properties.state'] = properties.state
- " & ftk_DemoFilter(),
- Source = AzureResourceGraph.Query(query, "Tenant", null, null, [resultTruncated = false]),
- NullHandling =
- if Table.HasColumns(Source, "Results") and Table.RowCount(Source) = 1 then
- #table(
- { "id", "name", "type", "subscriptionId", "tenantId", "properties.managementGroupAncestorsChain", "properties.state" },
- {}
- )
- else Source
- in
- NullHandling
- ```
-
- annotation PBI_NavigationStepName = Navigation
-
- annotation PBI_ResultType = Table
-
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/Subscriptions.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/Subscriptions.tmdl
new file mode 120000
index 000000000..71dd57f47
--- /dev/null
+++ b/src/power-bi/storage/Shared.Dataset/definition/tables/Subscriptions.tmdl
@@ -0,0 +1 @@
+../../../../kql/Shared.Dataset/definition/tables/Subscriptions.tmdl
\ No newline at end of file
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/VirtualMachines.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/VirtualMachines.tmdl
deleted file mode 100644
index 47851cbbc..000000000
--- a/src/power-bi/storage/Shared.Dataset/definition/tables/VirtualMachines.tmdl
+++ /dev/null
@@ -1,536 +0,0 @@
-table VirtualMachines
- lineageTag: bc3b3e64-3016-4758-897f-eeae6043bd77
-
- column id
- dataType: string
- lineageTag: aabba0f4-f3dd-44b1-8976-664cfcb25bbd
- summarizeBy: none
- sourceColumn: id
-
- annotation SummarizationSetBy = Automatic
-
- column name
- dataType: string
- lineageTag: 8dd0096e-87b5-452b-bf31-cdd348a545ec
- summarizeBy: none
- sourceColumn: name
-
- annotation SummarizationSetBy = Automatic
-
- column provisioningState
- dataType: string
- lineageTag: f8c7e75f-672b-438c-bf36-d638b2f32fa7
- summarizeBy: none
- sourceColumn: provisioningState
-
- annotation SummarizationSetBy = Automatic
-
- column timeCreated
- dataType: string
- lineageTag: 17f797bb-49c7-4cb4-9be4-2e043232a35d
- summarizeBy: none
- sourceColumn: timeCreated
-
- annotation SummarizationSetBy = Automatic
-
- column 'networkInterfaces.properties.deleteOption'
- dataType: string
- lineageTag: 554004cc-811f-4dde-862a-dac3930dfe6d
- summarizeBy: none
- sourceColumn: networkInterfaces.properties.deleteOption
-
- annotation SummarizationSetBy = Automatic
-
- column 'networkInterfaces.id'
- dataType: string
- lineageTag: 939a3bed-0418-4daa-a584-2e8e22707d36
- summarizeBy: none
- sourceColumn: networkInterfaces.id
-
- annotation SummarizationSetBy = Automatic
-
- column 'osProfile.computerName'
- dataType: string
- lineageTag: 991a5af1-9bcc-45b1-a61f-c96679b5299c
- summarizeBy: none
- sourceColumn: osProfile.computerName
-
- annotation SummarizationSetBy = Automatic
-
- column 'osProfile.requireGuestProvisionSignal'
- dataType: string
- lineageTag: 2c1729b5-b12d-44d5-9a8a-770ecef7e443
- summarizeBy: none
- sourceColumn: osProfile.requireGuestProvisionSignal
-
- annotation SummarizationSetBy = Automatic
-
- column 'osProfile.allowExtensionOperations'
- dataType: string
- lineageTag: 909cdeef-5a65-4fec-ac70-b611dd8694a3
- summarizeBy: none
- sourceColumn: osProfile.allowExtensionOperations
-
- annotation SummarizationSetBy = Automatic
-
- column 'osProfile.adminUsername'
- dataType: string
- lineageTag: ca20db16-1cec-4d87-8116-fd33c1c52ab6
- summarizeBy: none
- sourceColumn: osProfile.adminUsername
-
- annotation SummarizationSetBy = Automatic
-
- column 'osProfile.secrets'
- dataType: string
- lineageTag: f61d4998-0550-4787-96dc-b862adec39ad
- summarizeBy: none
- sourceColumn: osProfile.secrets
-
- annotation SummarizationSetBy = Automatic
-
- column 'osProfile.linuxConfiguration'
- dataType: string
- lineageTag: 9f5d66ab-2c26-4788-acb0-4fb1124af210
- summarizeBy: none
- sourceColumn: osProfile.linuxConfiguration
-
- annotation SummarizationSetBy = Automatic
-
- column 'osProfile.windowsConfiguration'
- dataType: string
- lineageTag: 9939f09a-936e-455b-9ffd-81fef08964b0
- summarizeBy: none
- sourceColumn: osProfile.windowsConfiguration
-
- annotation SummarizationSetBy = Automatic
-
- column 'storageProfile.imageReference.publisher'
- dataType: string
- lineageTag: 81517633-977d-44f0-988b-b0d929045952
- summarizeBy: none
- sourceColumn: storageProfile.imageReference.publisher
-
- annotation SummarizationSetBy = Automatic
-
- column 'storageProfile.imageReference.sku'
- dataType: string
- lineageTag: aeb7e0ca-2b7b-4b87-acf7-c62c9393e177
- summarizeBy: none
- sourceColumn: storageProfile.imageReference.sku
-
- annotation SummarizationSetBy = Automatic
-
- column 'storageProfile.imageReference.version'
- dataType: string
- lineageTag: 3a9f2c79-ae20-49af-932b-d8d4245c5d32
- summarizeBy: none
- sourceColumn: storageProfile.imageReference.version
-
- annotation SummarizationSetBy = Automatic
-
- column 'storageProfile.imageReference.exactVersion'
- dataType: string
- lineageTag: 9b0a4e2f-a55e-4e7b-8143-6a7019f53b6a
- summarizeBy: none
- sourceColumn: storageProfile.imageReference.exactVersion
-
- annotation SummarizationSetBy = Automatic
-
- column 'storageProfile.imageReference.offer'
- dataType: string
- lineageTag: 157f58e3-6ce8-4397-b0db-578cc680828f
- summarizeBy: none
- sourceColumn: storageProfile.imageReference.offer
-
- annotation SummarizationSetBy = Automatic
-
- column 'storageProfile.dataDisks.name'
- dataType: string
- lineageTag: 727d23eb-c156-4a16-a732-58e17c7f65ec
- summarizeBy: none
- sourceColumn: storageProfile.dataDisks.name
-
- annotation SummarizationSetBy = Automatic
-
- column 'storageProfile.dataDisks.createOption'
- dataType: string
- lineageTag: 56a3f6cc-9aae-4967-937e-2cf37b34a3ec
- summarizeBy: none
- sourceColumn: storageProfile.dataDisks.createOption
-
- annotation SummarizationSetBy = Automatic
-
- column 'storageProfile.dataDisks.deleteOption'
- dataType: string
- lineageTag: ee0d1c42-8700-4004-acbd-270256062de9
- summarizeBy: none
- sourceColumn: storageProfile.dataDisks.deleteOption
-
- annotation SummarizationSetBy = Automatic
-
- column 'storageProfile.dataDisks.managedDisk.id'
- dataType: string
- lineageTag: d3b45be8-8d78-4075-8a06-313042ad6f88
- summarizeBy: none
- sourceColumn: storageProfile.dataDisks.managedDisk.id
-
- annotation SummarizationSetBy = Automatic
-
- column 'storageProfile.dataDisks.caching'
- dataType: string
- lineageTag: c1d37b38-b93c-46bd-8408-6b61fb407dc7
- summarizeBy: none
- sourceColumn: storageProfile.dataDisks.caching
-
- annotation SummarizationSetBy = Automatic
-
- column 'storageProfile.dataDisks.toBeDetached'
- dataType: string
- lineageTag: e933b3f8-fd92-4b5a-9813-18a4cd0218eb
- summarizeBy: none
- sourceColumn: storageProfile.dataDisks.toBeDetached
-
- annotation SummarizationSetBy = Automatic
-
- column 'storageProfile.dataDisks.writeAcceleratorEnabled'
- dataType: string
- lineageTag: c7979256-5152-4cee-9be5-11b2408253a6
- summarizeBy: none
- sourceColumn: storageProfile.dataDisks.writeAcceleratorEnabled
-
- annotation SummarizationSetBy = Automatic
-
- column 'storageProfile.dataDisks.lun'
- dataType: string
- lineageTag: 23627fcb-60b2-45f6-a257-1207e544cc63
- summarizeBy: none
- sourceColumn: storageProfile.dataDisks.lun
-
- annotation SummarizationSetBy = Automatic
-
- column 'storageProfile.osDisk.name'
- dataType: string
- lineageTag: bc9c01d8-8cf3-4bca-aba4-de325bf9fb35
- summarizeBy: none
- sourceColumn: storageProfile.osDisk.name
-
- annotation SummarizationSetBy = Automatic
-
- column 'storageProfile.osDisk.createOption'
- dataType: string
- lineageTag: 19288f47-9a67-48ff-ae49-a60fc4d22e3d
- summarizeBy: none
- sourceColumn: storageProfile.osDisk.createOption
-
- annotation SummarizationSetBy = Automatic
-
- column 'storageProfile.osDisk.osType'
- dataType: string
- lineageTag: 52dbf86f-4936-4258-8d30-30fd7e2280ae
- summarizeBy: none
- sourceColumn: storageProfile.osDisk.osType
-
- annotation SummarizationSetBy = Automatic
-
- column 'storageProfile.osDisk.deleteOption'
- dataType: string
- lineageTag: 8033fb68-7806-4d13-ae45-6d84ef8f5c9a
- summarizeBy: none
- sourceColumn: storageProfile.osDisk.deleteOption
-
- annotation SummarizationSetBy = Automatic
-
- column 'storageProfile.osDisk.managedDisk.id'
- dataType: string
- lineageTag: eef9ea0b-b112-4577-a964-935f247ef493
- summarizeBy: none
- sourceColumn: storageProfile.osDisk.managedDisk.id
-
- annotation SummarizationSetBy = Automatic
-
- column 'storageProfile.osDisk.caching'
- dataType: string
- lineageTag: 5301af8a-1f76-4c1d-9122-69dcf00b7594
- summarizeBy: none
- sourceColumn: storageProfile.osDisk.caching
-
- annotation SummarizationSetBy = Automatic
-
- column 'hardwareProfile.vmSize'
- dataType: string
- lineageTag: 7c391f84-138d-42dc-b710-96526d722d74
- summarizeBy: none
- sourceColumn: hardwareProfile.vmSize
-
- annotation SummarizationSetBy = Automatic
-
- column vmId
- dataType: string
- lineageTag: 0c594826-f13f-4054-adbe-1eb9c8e0aebb
- summarizeBy: none
- sourceColumn: vmId
-
- annotation SummarizationSetBy = Automatic
-
- column 'diagnosticsProfile.bootDiagnostics.enabled'
- dataType: string
- lineageTag: d5dcd997-9933-4afa-86c4-d2d4fe865970
- summarizeBy: none
- sourceColumn: diagnosticsProfile.bootDiagnostics.enabled
-
- annotation SummarizationSetBy = Automatic
-
- column 'diagnosticsProfile.bootDiagnostics.storageUri'
- dataType: string
- lineageTag: 0d8d0d6a-763f-4cd9-bf2b-625d32f8dc4d
- summarizeBy: none
- sourceColumn: diagnosticsProfile.bootDiagnostics.storageUri
-
- annotation SummarizationSetBy = Automatic
-
- column 'powerState.displayStatus'
- dataType: string
- lineageTag: 1138b30d-fa61-49f8-badc-879c58ca77c2
- summarizeBy: none
- sourceColumn: powerState.displayStatus
-
- annotation SummarizationSetBy = Automatic
-
- column licenseType
- dataType: string
- lineageTag: 15e7fcf4-e6b1-4187-b9f4-2a4841f82aff
- summarizeBy: none
- sourceColumn: licenseType
-
- annotation SummarizationSetBy = Automatic
-
- column networkProfile
- dataType: string
- lineageTag: 1d17fabc-ac29-4729-bec9-7dd7d2563157
- summarizeBy: none
- sourceColumn: networkProfile
-
- annotation SummarizationSetBy = Automatic
-
- column osProfile
- dataType: string
- lineageTag: 9f3d6f62-d5b4-4ba6-861e-21b60f25b808
- summarizeBy: none
- sourceColumn: osProfile
-
- annotation SummarizationSetBy = Automatic
-
- column storageProfile
- dataType: string
- lineageTag: abf3f952-863f-4d23-af62-a2ea31887c3a
- summarizeBy: none
- sourceColumn: storageProfile
-
- annotation SummarizationSetBy = Automatic
-
- column hardwareProfile
- dataType: string
- lineageTag: 18998ba6-333c-4462-bd93-d54814e2361d
- summarizeBy: none
- sourceColumn: hardwareProfile
-
- annotation SummarizationSetBy = Automatic
-
- column diagnosticsProfile
- dataType: string
- lineageTag: 002811fd-e4da-412c-aec8-789c872382f5
- summarizeBy: none
- sourceColumn: diagnosticsProfile
-
- annotation SummarizationSetBy = Automatic
-
- column extended
- dataType: string
- lineageTag: 695947e2-c1e6-440a-9379-d4ace0486833
- summarizeBy: none
- sourceColumn: extended
-
- annotation SummarizationSetBy = Automatic
-
- column networkInterfaces
- dataType: string
- lineageTag: 60df4e28-c5a2-4be4-a666-5f6399869a0d
- summarizeBy: none
- sourceColumn: networkInterfaces
-
- annotation SummarizationSetBy = Automatic
-
- column 'networkInterfaces.properties'
- dataType: string
- lineageTag: b85e2971-0782-48ce-8641-f8e720fef81a
- summarizeBy: none
- sourceColumn: networkInterfaces.properties
-
- annotation SummarizationSetBy = Automatic
-
- column 'storageProfile.imageReference'
- dataType: string
- lineageTag: fce31b16-8d80-4267-86f7-458827788e2d
- summarizeBy: none
- sourceColumn: storageProfile.imageReference
-
- annotation SummarizationSetBy = Automatic
-
- column 'storageProfile.dataDisks'
- dataType: string
- lineageTag: bb2a82e8-695a-47a9-bcbb-611e134356ed
- summarizeBy: none
- sourceColumn: storageProfile.dataDisks
-
- annotation SummarizationSetBy = Automatic
-
- column 'storageProfile.osDisk'
- dataType: string
- lineageTag: 8fdcc755-3ffb-48b1-bf3f-e46db8f67774
- summarizeBy: none
- sourceColumn: storageProfile.osDisk
-
- annotation SummarizationSetBy = Automatic
-
- column 'storageProfile.dataDisks.managedDisk'
- dataType: string
- lineageTag: 56634ea0-bbc4-4587-854c-ba252faa1ae8
- summarizeBy: none
- sourceColumn: storageProfile.dataDisks.managedDisk
-
- annotation SummarizationSetBy = Automatic
-
- column 'storageProfile.osDisk.managedDisk'
- dataType: string
- lineageTag: a3f5aff1-c5e8-4957-bb33-84f23977d4a2
- summarizeBy: none
- sourceColumn: storageProfile.osDisk.managedDisk
-
- annotation SummarizationSetBy = Automatic
-
- column 'diagnosticsProfile.bootDiagnostics'
- dataType: string
- lineageTag: 3ef88619-6923-44d5-a101-36274a025e49
- summarizeBy: none
- sourceColumn: diagnosticsProfile.bootDiagnostics
-
- annotation SummarizationSetBy = Automatic
-
- column instanceView
- dataType: string
- lineageTag: af5bca80-4901-41c9-ab40-3fc346f0912f
- summarizeBy: none
- sourceColumn: instanceView
-
- annotation SummarizationSetBy = Automatic
-
- column powerState
- dataType: string
- lineageTag: 2debf081-3956-4289-a117-8b7af6888ac1
- summarizeBy: none
- sourceColumn: powerState
-
- annotation SummarizationSetBy = Automatic
-
- column location
- dataType: string
- lineageTag: 3d3b7faf-7dbb-4cb2-b29a-4bb60cfb8c9c
- summarizeBy: none
- sourceColumn: location
-
- annotation SummarizationSetBy = Automatic
-
- column resourceGroup
- dataType: string
- lineageTag: 71c32f19-f5ec-4c9c-a2e3-3f7c20d7f9e8
- summarizeBy: none
- sourceColumn: resourceGroup
-
- annotation SummarizationSetBy = Automatic
-
- partition VirtualMachines = m
- mode: import
- queryGroup: 'Resource Graph'
- source =
- let
- query = "
- Resources
- | where type =~ 'Microsoft.Compute/virtualMachines'
- | extend
- provisioningState = properties.provisioningState,
- timeCreated = properties.timeCreated,
- networkProfile = properties.networkProfile,
- osProfile = properties.osProfile,
- storageProfile = properties.storageProfile,
- hardwareProfile = properties.hardwareProfile,
- vmId = properties.vmId,
- diagnosticsProfile = properties.diagnosticsProfile,
- extended = properties.extended,
- licenseType = properties.licenseType
- | extend
- ['osProfile.computerName'] = osProfile.computerName,
- ['osProfile.requireGuestProvisionSignal'] = osProfile.requireGuestProvisionSignal,
- ['osProfile.allowExtensionOperations'] = osProfile.allowExtensionOperations,
- ['osProfile.adminUsername'] = osProfile.adminUsername,
- ['osProfile.secrets'] = osProfile.secrets,
- ['osProfile.linuxConfiguration'] = osProfile.linuxConfiguration,
- ['osProfile.windowsConfiguration'] = osProfile.windowsConfiguration,
- networkInterfaces = networkProfile.networkInterfaces
- | mv-expand ['networkInterfaces']
- | extend
- ['networkInterfaces.properties'] = networkInterfaces.properties,
- ['networkInterfaces.id'] = networkInterfaces.id,
- ['networkInterfaces.properties.deleteOption'] = networkInterfaces.properties.deleteOption,
- ['storageProfile.imageReference'] = storageProfile.imageReference,
- ['storageProfile.dataDisks'] = storageProfile.dataDisks,
- ['storageProfile.osDisk'] = storageProfile.osDisk,
- ['storageProfile.imageReference.publisher'] = storageProfile.imageReference.publisher,
- ['storageProfile.imageReference.sku'] = storageProfile.imageReference.sku,
- ['storageProfile.imageReference.version'] = storageProfile.imageReference.version,
- ['storageProfile.imageReference.exactVersion'] = storageProfile.imageReference.exactVersion,
- ['storageProfile.imageReference.offer'] = storageProfile.imageReference.offer
- | mv-expand ['storageProfile.dataDisks']
- | extend
- ['storageProfile.dataDisks.name'] = storageProfile.dataDisks.name,
- ['storageProfile.dataDisks.createOption'] = storageProfile.dataDisks.createOption,
- ['storageProfile.dataDisks.deleteOption'] = storageProfile.dataDisks.deleteOption,
- ['storageProfile.dataDisks.managedDisk'] = storageProfile.dataDisks.managedDisk,
- ['storageProfile.dataDisks.caching'] = storageProfile.dataDisks.caching,
- ['storageProfile.dataDisks.toBeDetached'] = storageProfile.dataDisks.toBeDetached,
- ['storageProfile.dataDisks.writeAcceleratorEnabled'] = storageProfile.dataDisks.writeAcceleratorEnabled,
- ['storageProfile.dataDisks.lun'] = storageProfile.dataDisks.lun,
- ['storageProfile.dataDisks.managedDisk.id'] = storageProfile.dataDisks.managedDisk.id,
- ['storageProfile.osDisk.name'] = storageProfile.osDisk.name,
- ['storageProfile.osDisk.createOption'] = storageProfile.osDisk.createOption,
- ['storageProfile.osDisk.osType'] = storageProfile.osDisk.osType,
- ['storageProfile.osDisk.deleteOption'] = storageProfile.osDisk.deleteOption,
- ['storageProfile.osDisk.managedDisk'] = storageProfile.osDisk.managedDisk,
- ['storageProfile.osDisk.caching'] = storageProfile.osDisk.caching,
- ['storageProfile.osDisk.managedDisk.id'] = storageProfile.osDisk.managedDisk.id,
- ['hardwareProfile.vmSize'] = hardwareProfile.vmSize,
- ['diagnosticsProfile.bootDiagnostics'] = diagnosticsProfile.bootDiagnostics,
- ['diagnosticsProfile.bootDiagnostics.enabled'] = diagnosticsProfile.bootDiagnostics.enabled,
- ['diagnosticsProfile.bootDiagnostics.storageUri'] = diagnosticsProfile.bootDiagnostics.storageUri
- | extend
- instanceView = extended.instanceView,
- powerState = extended.instanceView.powerState
- | extend
- ['powerState.displayStatus'] = powerState.displayStatus
- | mv-expand ['zones']
- " & ftk_DemoFilter(),
- Source = AzureResourceGraph.Query(query, "Tenant", null, null, [resultTruncated = false]),
- NullHandling =
- if Table.HasColumns(Source, "Results") and Table.RowCount(Source) = 1 then
- #table(
- { "id", "name", "location", "resourceGroup", "provisioningState", "timeCreated", "networkProfile", "osProfile", "storageProfile", "hardwareProfile", "vmId", "diagnosticsProfile", "extended", "licenseType", "osProfile.computerName", "osProfile.requireGuestProvisionSignal", "osProfile.allowExtensionOperations", "osProfile.adminUsername", "osProfile.secrets", "osProfile.linuxConfiguration", "osProfile.windowsConfiguration", "networkInterfaces", "networkInterfaces.properties", "networkInterfaces.id", "networkInterfaces.properties.deleteOption", "storageProfile.imageReference", "storageProfile.dataDisks", "storageProfile.osDisk", "storageProfile.imageReference.publisher", "storageProfile.imageReference.sku", "storageProfile.imageReference.version", "storageProfile.imageReference.exactVersion", "storageProfile.imageReference.offer", "storageProfile.dataDisks.name", "storageProfile.dataDisks.createOption", "storageProfile.dataDisks.deleteOption", "storageProfile.dataDisks.managedDisk", "storageProfile.dataDisks.caching", "storageProfile.dataDisks.toBeDetached", "storageProfile.dataDisks.writeAcceleratorEnabled", "storageProfile.dataDisks.lun", "storageProfile.dataDisks.managedDisk.id", "storageProfile.osDisk.name", "storageProfile.osDisk.createOption", "storageProfile.osDisk.osType", "storageProfile.osDisk.deleteOption", "storageProfile.osDisk.managedDisk", "storageProfile.osDisk.caching", "storageProfile.osDisk.managedDisk.id", "hardwareProfile.vmSize", "diagnosticsProfile.bootDiagnostics", "diagnosticsProfile.bootDiagnostics.enabled", "diagnosticsProfile.bootDiagnostics.storageUri", "instanceView", "powerState", "powerState.displayStatus" },
- {}
- )
- else Source
- in
- NullHandling
-
- annotation PBI_NavigationStepName = Navigation
-
- annotation PBI_ResultType = Table
-
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/VirtualMachines.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/VirtualMachines.tmdl
new file mode 120000
index 000000000..2590be6d5
--- /dev/null
+++ b/src/power-bi/storage/Shared.Dataset/definition/tables/VirtualMachines.tmdl
@@ -0,0 +1 @@
+../../../../kql/Shared.Dataset/definition/tables/VirtualMachines.tmdl
\ No newline at end of file
From 3e5237489b3c205f72a46c8d78864f1a80ca075f Mon Sep 17 00:00:00 2001
From: Michael Flanakin
Date: Wed, 11 Mar 2026 08:33:57 -0700
Subject: [PATCH 07/15] Add custom batch sizes per resource type
---
src/power-bi/kql/Shared.Dataset/definition/expressions.tmdl | 6 +++---
.../definition/tables/AdvisorRecommendations.tmdl | 2 +-
.../tables/AdvisorReservationRecommendations.tmdl | 2 +-
.../kql/Shared.Dataset/definition/tables/Disks.tmdl | 2 +-
.../Shared.Dataset/definition/tables/NetworkInterfaces.tmdl | 2 +-
.../definition/tables/NetworkSecurityGroups.tmdl | 2 +-
.../Shared.Dataset/definition/tables/PolicyAssignments.tmdl | 2 +-
.../kql/Shared.Dataset/definition/tables/PolicyStates.tmdl | 2 +-
.../Shared.Dataset/definition/tables/PublicIPAddresses.tmdl | 2 +-
.../kql/Shared.Dataset/definition/tables/SqlDatabases.tmdl | 2 +-
.../Shared.Dataset/definition/tables/VirtualMachines.tmdl | 2 +-
.../storage/Shared.Dataset/definition/expressions.tmdl | 6 +++---
12 files changed, 16 insertions(+), 16 deletions(-)
diff --git a/src/power-bi/kql/Shared.Dataset/definition/expressions.tmdl b/src/power-bi/kql/Shared.Dataset/definition/expressions.tmdl
index fe37318b6..8901b80f8 100644
--- a/src/power-bi/kql/Shared.Dataset/definition/expressions.tmdl
+++ b/src/power-bi/kql/Shared.Dataset/definition/expressions.tmdl
@@ -100,9 +100,9 @@ expression ftk_ARGBatchSize = () => 100
/// Queries Azure Resource Graph in batches of subscriptions and combines results to avoid the 16 MB payload limit.
expression ftk_QueryARG =
- (query as text) =>
+ (query as text, optional batchMultiplier as number) =>
let
- batchSize = ftk_ARGBatchSize(),
+ batchSize = ftk_ARGBatchSize() * (if batchMultiplier <> null then batchMultiplier else 1),
subQuery = "resourcecontainers | where type == 'microsoft.resources/subscriptions' | project subscriptionId" & ftk_DemoFilter(),
Subscriptions = AzureResourceGraph.Query(subQuery, "Tenant", null, null, [resultTruncated = false]),
SubscriptionIds = Subscriptions[subscriptionId],
@@ -159,7 +159,7 @@ expression PolicyDefinitions =
description = properties.description,
version = properties.version
| project subscriptionId, id, name, displayName, description, version",
- Source = ftk_QueryARG(query),
+ Source = ftk_QueryARG(query, 5),
NullHandling =
if Source = null then
#table(
diff --git a/src/power-bi/kql/Shared.Dataset/definition/tables/AdvisorRecommendations.tmdl b/src/power-bi/kql/Shared.Dataset/definition/tables/AdvisorRecommendations.tmdl
index ab1989086..17706c3d6 100644
--- a/src/power-bi/kql/Shared.Dataset/definition/tables/AdvisorRecommendations.tmdl
+++ b/src/power-bi/kql/Shared.Dataset/definition/tables/AdvisorRecommendations.tmdl
@@ -522,7 +522,7 @@ table AdvisorRecommendations
['properties.resourceMetadata.source'] = properties.resourceMetadata.source,
SortOrder = case(properties.impact == 'High', 1, properties.impact == 'Medium', 2, properties.impact == 'Low', 3, 9)
",
- Source = ftk_QueryARG(query),
+ Source = ftk_QueryARG(query, 5),
NullHandling =
if Source = null then
#table(
diff --git a/src/power-bi/kql/Shared.Dataset/definition/tables/AdvisorReservationRecommendations.tmdl b/src/power-bi/kql/Shared.Dataset/definition/tables/AdvisorReservationRecommendations.tmdl
index 79507d34a..af41378d3 100644
--- a/src/power-bi/kql/Shared.Dataset/definition/tables/AdvisorReservationRecommendations.tmdl
+++ b/src/power-bi/kql/Shared.Dataset/definition/tables/AdvisorReservationRecommendations.tmdl
@@ -492,7 +492,7 @@ table AdvisorReservationRecommendations
SortOrder = case(properties.impact == 'High', 1, properties.impact == 'Medium', 2, properties.impact == 'Low', 3, 9)
| order by SortOrder asc
",
- Source = ftk_QueryARG(query),
+ Source = ftk_QueryARG(query, 5),
NullHandling =
if Source = null then
#table(
diff --git a/src/power-bi/kql/Shared.Dataset/definition/tables/Disks.tmdl b/src/power-bi/kql/Shared.Dataset/definition/tables/Disks.tmdl
index 45f772f61..f4ac4134a 100644
--- a/src/power-bi/kql/Shared.Dataset/definition/tables/Disks.tmdl
+++ b/src/power-bi/kql/Shared.Dataset/definition/tables/Disks.tmdl
@@ -204,7 +204,7 @@ table Disks
parentVM,
diskType
",
- Source = ftk_QueryARG(query),
+ Source = ftk_QueryARG(query, 2),
NullHandling =
if Source = null then
#table(
diff --git a/src/power-bi/kql/Shared.Dataset/definition/tables/NetworkInterfaces.tmdl b/src/power-bi/kql/Shared.Dataset/definition/tables/NetworkInterfaces.tmdl
index 8a1588fae..3e5770345 100644
--- a/src/power-bi/kql/Shared.Dataset/definition/tables/NetworkInterfaces.tmdl
+++ b/src/power-bi/kql/Shared.Dataset/definition/tables/NetworkInterfaces.tmdl
@@ -438,7 +438,7 @@ table NetworkInterfaces
['properties.ipConfigurations.properties.publicIPAddress.id'] = properties.ipConfigurations.properties.publicIPAddress.id,
['properties.networkSecurityGroup.id'] = properties.networkSecurityGroup.id
",
- Source = ftk_QueryARG(query),
+ Source = ftk_QueryARG(query, 2),
NullHandling =
if Source = null then
#table(
diff --git a/src/power-bi/kql/Shared.Dataset/definition/tables/NetworkSecurityGroups.tmdl b/src/power-bi/kql/Shared.Dataset/definition/tables/NetworkSecurityGroups.tmdl
index 98e115ddf..82509f220 100644
--- a/src/power-bi/kql/Shared.Dataset/definition/tables/NetworkSecurityGroups.tmdl
+++ b/src/power-bi/kql/Shared.Dataset/definition/tables/NetworkSecurityGroups.tmdl
@@ -265,7 +265,7 @@ table NetworkSecurityGroups
['properties.securityRules.properties.priority'] = properties.securityRules.properties.priority,
['properties.securityRules.properties.access'] = properties.securityRules.properties.access
",
- Source = ftk_QueryARG(query),
+ Source = ftk_QueryARG(query, 20),
NullHandling =
if Source = null then
#table(
diff --git a/src/power-bi/kql/Shared.Dataset/definition/tables/PolicyAssignments.tmdl b/src/power-bi/kql/Shared.Dataset/definition/tables/PolicyAssignments.tmdl
index 2f03b8824..9723ccfab 100644
--- a/src/power-bi/kql/Shared.Dataset/definition/tables/PolicyAssignments.tmdl
+++ b/src/power-bi/kql/Shared.Dataset/definition/tables/PolicyAssignments.tmdl
@@ -402,7 +402,7 @@ table PolicyAssignments
['identity.type'] = identity.type
| mv-expand ['properties.notScopes']
",
- Source = ftk_QueryARG(query),
+ Source = ftk_QueryARG(query, 2),
NullHandling =
if Source = null then
#table(
diff --git a/src/power-bi/kql/Shared.Dataset/definition/tables/PolicyStates.tmdl b/src/power-bi/kql/Shared.Dataset/definition/tables/PolicyStates.tmdl
index 081d2a644..13fa7c4c0 100644
--- a/src/power-bi/kql/Shared.Dataset/definition/tables/PolicyStates.tmdl
+++ b/src/power-bi/kql/Shared.Dataset/definition/tables/PolicyStates.tmdl
@@ -371,7 +371,7 @@ table PolicyStates
['properties.complianceReasonCode'] = properties.complianceReasonCode,
['properties.stateDetails'] = properties.stateDetails
",
- Source = ftk_QueryARG(query),
+ Source = ftk_QueryARG(query, 2),
NullHandling =
if Source = null then
#table(
diff --git a/src/power-bi/kql/Shared.Dataset/definition/tables/PublicIPAddresses.tmdl b/src/power-bi/kql/Shared.Dataset/definition/tables/PublicIPAddresses.tmdl
index 7775c5fd4..86bcd5aa8 100644
--- a/src/power-bi/kql/Shared.Dataset/definition/tables/PublicIPAddresses.tmdl
+++ b/src/power-bi/kql/Shared.Dataset/definition/tables/PublicIPAddresses.tmdl
@@ -211,7 +211,7 @@ table PublicIPAddresses
['properties.ipConfiguration'] = properties.ipConfiguration,
['properties.ipTags'] = properties.ipTags
",
- Source = ftk_QueryARG(query),
+ Source = ftk_QueryARG(query, 5),
NullHandling =
if Source = null then
#table(
diff --git a/src/power-bi/kql/Shared.Dataset/definition/tables/SqlDatabases.tmdl b/src/power-bi/kql/Shared.Dataset/definition/tables/SqlDatabases.tmdl
index 020eceaaf..5e2a64251 100644
--- a/src/power-bi/kql/Shared.Dataset/definition/tables/SqlDatabases.tmdl
+++ b/src/power-bi/kql/Shared.Dataset/definition/tables/SqlDatabases.tmdl
@@ -365,7 +365,7 @@ table SqlDatabases
['properties.readScale'] = properties.readScale,
['properties.maxLogSizeBytes'] = properties.maxLogSizeBytes
",
- Source = ftk_QueryARG(query),
+ Source = ftk_QueryARG(query, 5),
NullHandling =
if Source = null then
#table(
diff --git a/src/power-bi/kql/Shared.Dataset/definition/tables/VirtualMachines.tmdl b/src/power-bi/kql/Shared.Dataset/definition/tables/VirtualMachines.tmdl
index 542de68b7..2088d6a9d 100644
--- a/src/power-bi/kql/Shared.Dataset/definition/tables/VirtualMachines.tmdl
+++ b/src/power-bi/kql/Shared.Dataset/definition/tables/VirtualMachines.tmdl
@@ -615,7 +615,7 @@ table VirtualMachines
['powerState.displayStatus'] = powerState.displayStatus
| mv-expand ['zones']
",
- Source = ftk_QueryARG(query),
+ Source = ftk_QueryARG(query, 5),
NullHandling =
if Source = null then
#table(
diff --git a/src/power-bi/storage/Shared.Dataset/definition/expressions.tmdl b/src/power-bi/storage/Shared.Dataset/definition/expressions.tmdl
index 2d34e6063..1b5000e61 100644
--- a/src/power-bi/storage/Shared.Dataset/definition/expressions.tmdl
+++ b/src/power-bi/storage/Shared.Dataset/definition/expressions.tmdl
@@ -507,9 +507,9 @@ expression ftk_ARGBatchSize = () => 100
/// Queries Azure Resource Graph in batches of subscriptions and combines results to avoid the 16 MB payload limit.
expression ftk_QueryARG =
- (query as text) =>
+ (query as text, optional batchMultiplier as number) =>
let
- batchSize = ftk_ARGBatchSize(),
+ batchSize = ftk_ARGBatchSize() * (if batchMultiplier <> null then batchMultiplier else 1),
subQuery = "resourcecontainers | where type == 'microsoft.resources/subscriptions' | project subscriptionId" & ftk_DemoFilter(),
Subscriptions = AzureResourceGraph.Query(subQuery, "Tenant", null, null, [resultTruncated = false]),
SubscriptionIds = Subscriptions[subscriptionId],
@@ -566,7 +566,7 @@ expression PolicyDefinitions =
description = properties.description,
version = properties.version
| project subscriptionId, id, name, displayName, description, version",
- Source = ftk_QueryARG(query),
+ Source = ftk_QueryARG(query, 5),
NullHandling =
if Source = null then
#table(
From 4c64af7a3e3a4069df90017dac8a34dedaadf817 Mon Sep 17 00:00:00 2001
From: MSBrett
Date: Thu, 30 Jul 2026 08:00:24 -0700
Subject: [PATCH 08/15] Harden ftk_QueryARG against invalid batch size and ARG
query failures; restore RI-specific filter in
AdvisorReservationRecommendations
- Clamp batchSize to the documented default (100) when ftk_ARGBatchSize() returns null, non-numeric, non-integer, or a value less than 1 (avoids divide-by-zero and type errors)
- Wrap the subscription-list ARG query in try/otherwise so transient failures, permission errors, or an unexpected result shape degrade to an empty batch list instead of throwing
- Restore the reserved-instance-specific filter on properties.shortDescription.solution that was dropped when the query was refactored from bracket to dot notation, so AdvisorReservationRecommendations no longer duplicates all of AdvisorRecommendations
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
---
.../kql/Shared.Dataset/definition/expressions.tmdl | 7 ++++---
.../tables/AdvisorReservationRecommendations.tmdl | 1 +
.../storage/Shared.Dataset/definition/expressions.tmdl | 7 ++++---
3 files changed, 9 insertions(+), 6 deletions(-)
diff --git a/src/power-bi/kql/Shared.Dataset/definition/expressions.tmdl b/src/power-bi/kql/Shared.Dataset/definition/expressions.tmdl
index 8901b80f8..65e12dba2 100644
--- a/src/power-bi/kql/Shared.Dataset/definition/expressions.tmdl
+++ b/src/power-bi/kql/Shared.Dataset/definition/expressions.tmdl
@@ -102,10 +102,11 @@ expression ftk_ARGBatchSize = () => 100
expression ftk_QueryARG =
(query as text, optional batchMultiplier as number) =>
let
- batchSize = ftk_ARGBatchSize() * (if batchMultiplier <> null then batchMultiplier else 1),
+ requestedBatchSize = try ftk_ARGBatchSize() * (if batchMultiplier <> null then batchMultiplier else 1) otherwise null,
+ batchSize = if requestedBatchSize = null or not Value.Is(requestedBatchSize, type number) or requestedBatchSize < 1 then 100 else Number.RoundDown(requestedBatchSize),
subQuery = "resourcecontainers | where type == 'microsoft.resources/subscriptions' | project subscriptionId" & ftk_DemoFilter(),
- Subscriptions = AzureResourceGraph.Query(subQuery, "Tenant", null, null, [resultTruncated = false]),
- SubscriptionIds = Subscriptions[subscriptionId],
+ Subscriptions = try AzureResourceGraph.Query(subQuery, "Tenant", null, null, [resultTruncated = false]) otherwise null,
+ SubscriptionIds = if Subscriptions = null or not Value.Is(Subscriptions, type table) or Table.RowCount(Subscriptions) = 0 or not Table.HasColumns(Subscriptions, "subscriptionId") then {} else Subscriptions[subscriptionId],
BatchCount = Number.RoundUp(List.Count(SubscriptionIds) / batchSize),
Batches = List.Transform({0..BatchCount-1}, each
let
diff --git a/src/power-bi/kql/Shared.Dataset/definition/tables/AdvisorReservationRecommendations.tmdl b/src/power-bi/kql/Shared.Dataset/definition/tables/AdvisorReservationRecommendations.tmdl
index af41378d3..2196f6b77 100644
--- a/src/power-bi/kql/Shared.Dataset/definition/tables/AdvisorReservationRecommendations.tmdl
+++ b/src/power-bi/kql/Shared.Dataset/definition/tables/AdvisorReservationRecommendations.tmdl
@@ -439,6 +439,7 @@ table AdvisorReservationRecommendations
advisorresources
| where type == 'microsoft.advisor/recommendations'
| where properties.category == 'Cost'
+ | where properties.shortDescription.solution == 'Consider virtual machine reserved instance to save over your on-demand costs'
| extend
['properties.recommendationTypeId'] = properties.recommendationTypeId,
['properties.shortDescription'] = properties.shortDescription,
diff --git a/src/power-bi/storage/Shared.Dataset/definition/expressions.tmdl b/src/power-bi/storage/Shared.Dataset/definition/expressions.tmdl
index 1b5000e61..261702d0f 100644
--- a/src/power-bi/storage/Shared.Dataset/definition/expressions.tmdl
+++ b/src/power-bi/storage/Shared.Dataset/definition/expressions.tmdl
@@ -509,10 +509,11 @@ expression ftk_ARGBatchSize = () => 100
expression ftk_QueryARG =
(query as text, optional batchMultiplier as number) =>
let
- batchSize = ftk_ARGBatchSize() * (if batchMultiplier <> null then batchMultiplier else 1),
+ requestedBatchSize = try ftk_ARGBatchSize() * (if batchMultiplier <> null then batchMultiplier else 1) otherwise null,
+ batchSize = if requestedBatchSize = null or not Value.Is(requestedBatchSize, type number) or requestedBatchSize < 1 then 100 else Number.RoundDown(requestedBatchSize),
subQuery = "resourcecontainers | where type == 'microsoft.resources/subscriptions' | project subscriptionId" & ftk_DemoFilter(),
- Subscriptions = AzureResourceGraph.Query(subQuery, "Tenant", null, null, [resultTruncated = false]),
- SubscriptionIds = Subscriptions[subscriptionId],
+ Subscriptions = try AzureResourceGraph.Query(subQuery, "Tenant", null, null, [resultTruncated = false]) otherwise null,
+ SubscriptionIds = if Subscriptions = null or not Value.Is(Subscriptions, type table) or Table.RowCount(Subscriptions) = 0 or not Table.HasColumns(Subscriptions, "subscriptionId") then {} else Subscriptions[subscriptionId],
BatchCount = Number.RoundUp(List.Count(SubscriptionIds) / batchSize),
Batches = List.Transform({0..BatchCount-1}, each
let
From 7a703973e20c36ab43701fcd94e765022d7fa578 Mon Sep 17 00:00:00 2001
From: MSBrett
Date: Thu, 30 Jul 2026 08:00:46 -0700
Subject: [PATCH 09/15] Fix changelog.md staging gap from merge resolution
The v15 Power BI reports changelog entry and ms.date bump were edited
after staging during merge conflict resolution and got left out of the
merge commit.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
---
docs-mslearn/toolkit/changelog.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/docs-mslearn/toolkit/changelog.md b/docs-mslearn/toolkit/changelog.md
index 0903680ad..554a8ecd2 100644
--- a/docs-mslearn/toolkit/changelog.md
+++ b/docs-mslearn/toolkit/changelog.md
@@ -3,7 +3,7 @@ title: FinOps toolkit changelog
description: Review the latest features and enhancements in the FinOps toolkit, including updates to FinOps hubs, Power BI reports, and more.
author: MSBrett
ms.author: brettwil
-ms.date: 07/29/2026
+ms.date: 07/30/2026
ms.topic: reference
ms.service: finops
ms.subservice: finops-toolkit
@@ -63,6 +63,7 @@ _Released June 2026_
- **Fixed**
- Fixed Power BI storage report refresh errors caused by ISO 8601 duration `x_SkuTerm` values (like `P3Y`) and empty strings in cost exports ([#2174](https://github.com/microsoft/finops-toolkit/issues/2174)).
+ - Paginate Azure Resource Graph queries by subscription to mitigate [payload size limit](help/errors.md#response-payload-size-is-and-has-exceeded-the-limit) errors in the [Governance](power-bi/governance.md) and [Workload optimization](power-bi/workload-optimization.md) reports ([#1768](https://github.com/microsoft/finops-toolkit/issues/1768)).
### [Data dictionary](help/data-dictionary.md) updates
From f72dc50889c07ae4314dbc6345df768db987411c Mon Sep 17 00:00:00 2001
From: MSBrett
Date: Thu, 30 Jul 2026 10:49:40 -0700
Subject: [PATCH 10/15] Fix subscriptionId derivation for
non-subscription-scoped policy resources
Copilot's automated review flagged that tostring(split(id, '/')[2])
produces misleading values (e.g. Microsoft.Authorization,
Microsoft.PolicyInsights) instead of null/empty for tenant- or
management-group-scoped policy definitions, assignments, and states.
This subscriptionId derivation was added by this PR to support ARG
subscription batching. Guard the split so non-subscription-scoped IDs
now yield an empty value instead of a bogus one, in both kql and
storage copies of expressions.tmdl and in PolicyAssignments.tmdl /
PolicyStates.tmdl (storage copies are symlinks to the kql originals).
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
---
src/power-bi/kql/Shared.Dataset/definition/expressions.tmdl | 2 +-
.../kql/Shared.Dataset/definition/tables/PolicyAssignments.tmdl | 2 +-
.../kql/Shared.Dataset/definition/tables/PolicyStates.tmdl | 2 +-
src/power-bi/storage/Shared.Dataset/definition/expressions.tmdl | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/power-bi/kql/Shared.Dataset/definition/expressions.tmdl b/src/power-bi/kql/Shared.Dataset/definition/expressions.tmdl
index 65e12dba2..dd00222d3 100644
--- a/src/power-bi/kql/Shared.Dataset/definition/expressions.tmdl
+++ b/src/power-bi/kql/Shared.Dataset/definition/expressions.tmdl
@@ -155,7 +155,7 @@ expression PolicyDefinitions =
policyResources
| where type =='microsoft.authorization/policydefinitions'
| extend
- subscriptionId = tostring(split(id, '/')[2]),
+ subscriptionId = iff(tolower(tostring(split(id, '/')[1])) == 'subscriptions', tostring(split(id, '/')[2]), ''),
displayName = properties.displayName,
description = properties.description,
version = properties.version
diff --git a/src/power-bi/kql/Shared.Dataset/definition/tables/PolicyAssignments.tmdl b/src/power-bi/kql/Shared.Dataset/definition/tables/PolicyAssignments.tmdl
index 9723ccfab..b19ef9c25 100644
--- a/src/power-bi/kql/Shared.Dataset/definition/tables/PolicyAssignments.tmdl
+++ b/src/power-bi/kql/Shared.Dataset/definition/tables/PolicyAssignments.tmdl
@@ -369,7 +369,7 @@ table PolicyAssignments
query = "
policyResources
| where type =~'Microsoft.Authorization/PolicyAssignments'
- | extend subscriptionId = tostring(split(id, '/')[2])
+ | extend subscriptionId = iff(tolower(tostring(split(id, '/')[1])) == 'subscriptions', tostring(split(id, '/')[2]), '')
| extend
['properties.policyDefinitionId'] = properties.policyDefinitionId,
['properties.effectiveDefinitionVersion'] = properties.effectiveDefinitionVersion,
diff --git a/src/power-bi/kql/Shared.Dataset/definition/tables/PolicyStates.tmdl b/src/power-bi/kql/Shared.Dataset/definition/tables/PolicyStates.tmdl
index 13fa7c4c0..bc6eaabd1 100644
--- a/src/power-bi/kql/Shared.Dataset/definition/tables/PolicyStates.tmdl
+++ b/src/power-bi/kql/Shared.Dataset/definition/tables/PolicyStates.tmdl
@@ -344,7 +344,7 @@ table PolicyStates
query = "
policyResources
| where type =~'Microsoft.PolicyInsights/PolicyStates'
- | extend subscriptionId = tostring(split(id, '/')[2])
+ | extend subscriptionId = iff(tolower(tostring(split(id, '/')[1])) == 'subscriptions', tostring(split(id, '/')[2]), '')
| extend
['properties.policyAssignmentParameters'] = properties.policyAssignmentParameters,
['properties.policyDefinitionAction'] = properties.policyDefinitionAction,
diff --git a/src/power-bi/storage/Shared.Dataset/definition/expressions.tmdl b/src/power-bi/storage/Shared.Dataset/definition/expressions.tmdl
index 261702d0f..e663407f8 100644
--- a/src/power-bi/storage/Shared.Dataset/definition/expressions.tmdl
+++ b/src/power-bi/storage/Shared.Dataset/definition/expressions.tmdl
@@ -562,7 +562,7 @@ expression PolicyDefinitions =
policyResources
| where type =='microsoft.authorization/policydefinitions'
| extend
- subscriptionId = tostring(split(id, '/')[2]),
+ subscriptionId = iff(tolower(tostring(split(id, '/')[1])) == 'subscriptions', tostring(split(id, '/')[2]), ''),
displayName = properties.displayName,
description = properties.description,
version = properties.version
From cdd13b2c92247cf2e1ea6c407995705c73e03988 Mon Sep 17 00:00:00 2001
From: MSBrett
Date: Thu, 30 Jul 2026 10:57:29 -0700
Subject: [PATCH 11/15] Fix ARG batching: include tenant/MG-scoped policy rows,
fix NSG batch size
- ftk_QueryARG: add optional includeUnscoped param that unions in one
unbatched Azure Resource Graph query for rows whose derived
subscriptionId is blank (tenant- and management-group-scoped policy
resources), since the per-batch "subscriptionId in (...)" filter can
never match them and they were being silently dropped from every
batch.
- PolicyDefinitions (kql + storage), PolicyAssignments, PolicyStates:
opt into includeUnscoped so built-in policy definitions and
management-group-scoped assignments/states are no longer missing
from the Governance report.
- NetworkSecurityGroups: remove the 20x batch multiplier (2000
subs/batch). It was the largest multiplier of any table despite this
table's mv-expand of security rules being the highest per-row payload
expansion in the dataset and the original motivating case for ARG
batching (changelog #1540). Falls back to the 100-subs/batch default.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
---
.../kql/Shared.Dataset/definition/expressions.tmdl | 9 ++++++---
.../definition/tables/NetworkSecurityGroups.tmdl | 2 +-
.../definition/tables/PolicyAssignments.tmdl | 2 +-
.../Shared.Dataset/definition/tables/PolicyStates.tmdl | 2 +-
.../storage/Shared.Dataset/definition/expressions.tmdl | 9 ++++++---
5 files changed, 15 insertions(+), 9 deletions(-)
diff --git a/src/power-bi/kql/Shared.Dataset/definition/expressions.tmdl b/src/power-bi/kql/Shared.Dataset/definition/expressions.tmdl
index dd00222d3..659b6ceea 100644
--- a/src/power-bi/kql/Shared.Dataset/definition/expressions.tmdl
+++ b/src/power-bi/kql/Shared.Dataset/definition/expressions.tmdl
@@ -100,7 +100,7 @@ expression ftk_ARGBatchSize = () => 100
/// Queries Azure Resource Graph in batches of subscriptions and combines results to avoid the 16 MB payload limit.
expression ftk_QueryARG =
- (query as text, optional batchMultiplier as number) =>
+ (query as text, optional batchMultiplier as number, optional includeUnscoped as logical) =>
let
requestedBatchSize = try ftk_ARGBatchSize() * (if batchMultiplier <> null then batchMultiplier else 1) otherwise null,
batchSize = if requestedBatchSize = null or not Value.Is(requestedBatchSize, type number) or requestedBatchSize < 1 then 100 else Number.RoundDown(requestedBatchSize),
@@ -118,7 +118,10 @@ expression ftk_QueryARG =
in
if Table.HasColumns(Source, "Results") and Table.RowCount(Source) = 1 then null else Source
),
- Filtered = List.RemoveNulls(Batches),
+ // some callers (for example tenant/management-group-scoped policy resources) can have a blank subscriptionId that never matches any subscription batch filter above; fetch those rows once, unbatched, when requested
+ UnscopedSource = if includeUnscoped = true then AzureResourceGraph.Query(query & " | where isempty(subscriptionId)", "Tenant", null, null, [resultTruncated = false]) else null,
+ UnscopedFiltered = if UnscopedSource <> null and not (Table.HasColumns(UnscopedSource, "Results") and Table.RowCount(UnscopedSource) = 1) then UnscopedSource else null,
+ Filtered = List.RemoveNulls(Batches & {UnscopedFiltered}),
Combined = if List.Count(Filtered) > 0 then Table.Combine(Filtered) else null
in
Combined
@@ -160,7 +163,7 @@ expression PolicyDefinitions =
description = properties.description,
version = properties.version
| project subscriptionId, id, name, displayName, description, version",
- Source = ftk_QueryARG(query, 5),
+ Source = ftk_QueryARG(query, 5, true),
NullHandling =
if Source = null then
#table(
diff --git a/src/power-bi/kql/Shared.Dataset/definition/tables/NetworkSecurityGroups.tmdl b/src/power-bi/kql/Shared.Dataset/definition/tables/NetworkSecurityGroups.tmdl
index 82509f220..98e115ddf 100644
--- a/src/power-bi/kql/Shared.Dataset/definition/tables/NetworkSecurityGroups.tmdl
+++ b/src/power-bi/kql/Shared.Dataset/definition/tables/NetworkSecurityGroups.tmdl
@@ -265,7 +265,7 @@ table NetworkSecurityGroups
['properties.securityRules.properties.priority'] = properties.securityRules.properties.priority,
['properties.securityRules.properties.access'] = properties.securityRules.properties.access
",
- Source = ftk_QueryARG(query, 20),
+ Source = ftk_QueryARG(query),
NullHandling =
if Source = null then
#table(
diff --git a/src/power-bi/kql/Shared.Dataset/definition/tables/PolicyAssignments.tmdl b/src/power-bi/kql/Shared.Dataset/definition/tables/PolicyAssignments.tmdl
index b19ef9c25..04b50544e 100644
--- a/src/power-bi/kql/Shared.Dataset/definition/tables/PolicyAssignments.tmdl
+++ b/src/power-bi/kql/Shared.Dataset/definition/tables/PolicyAssignments.tmdl
@@ -402,7 +402,7 @@ table PolicyAssignments
['identity.type'] = identity.type
| mv-expand ['properties.notScopes']
",
- Source = ftk_QueryARG(query, 2),
+ Source = ftk_QueryARG(query, 2, true),
NullHandling =
if Source = null then
#table(
diff --git a/src/power-bi/kql/Shared.Dataset/definition/tables/PolicyStates.tmdl b/src/power-bi/kql/Shared.Dataset/definition/tables/PolicyStates.tmdl
index bc6eaabd1..1a040b34e 100644
--- a/src/power-bi/kql/Shared.Dataset/definition/tables/PolicyStates.tmdl
+++ b/src/power-bi/kql/Shared.Dataset/definition/tables/PolicyStates.tmdl
@@ -371,7 +371,7 @@ table PolicyStates
['properties.complianceReasonCode'] = properties.complianceReasonCode,
['properties.stateDetails'] = properties.stateDetails
",
- Source = ftk_QueryARG(query, 2),
+ Source = ftk_QueryARG(query, 2, true),
NullHandling =
if Source = null then
#table(
diff --git a/src/power-bi/storage/Shared.Dataset/definition/expressions.tmdl b/src/power-bi/storage/Shared.Dataset/definition/expressions.tmdl
index e663407f8..9bd65c83c 100644
--- a/src/power-bi/storage/Shared.Dataset/definition/expressions.tmdl
+++ b/src/power-bi/storage/Shared.Dataset/definition/expressions.tmdl
@@ -507,7 +507,7 @@ expression ftk_ARGBatchSize = () => 100
/// Queries Azure Resource Graph in batches of subscriptions and combines results to avoid the 16 MB payload limit.
expression ftk_QueryARG =
- (query as text, optional batchMultiplier as number) =>
+ (query as text, optional batchMultiplier as number, optional includeUnscoped as logical) =>
let
requestedBatchSize = try ftk_ARGBatchSize() * (if batchMultiplier <> null then batchMultiplier else 1) otherwise null,
batchSize = if requestedBatchSize = null or not Value.Is(requestedBatchSize, type number) or requestedBatchSize < 1 then 100 else Number.RoundDown(requestedBatchSize),
@@ -525,7 +525,10 @@ expression ftk_QueryARG =
in
if Table.HasColumns(Source, "Results") and Table.RowCount(Source) = 1 then null else Source
),
- Filtered = List.RemoveNulls(Batches),
+ // some callers (for example tenant/management-group-scoped policy resources) can have a blank subscriptionId that never matches any subscription batch filter above; fetch those rows once, unbatched, when requested
+ UnscopedSource = if includeUnscoped = true then AzureResourceGraph.Query(query & " | where isempty(subscriptionId)", "Tenant", null, null, [resultTruncated = false]) else null,
+ UnscopedFiltered = if UnscopedSource <> null and not (Table.HasColumns(UnscopedSource, "Results") and Table.RowCount(UnscopedSource) = 1) then UnscopedSource else null,
+ Filtered = List.RemoveNulls(Batches & {UnscopedFiltered}),
Combined = if List.Count(Filtered) > 0 then Table.Combine(Filtered) else null
in
Combined
@@ -567,7 +570,7 @@ expression PolicyDefinitions =
description = properties.description,
version = properties.version
| project subscriptionId, id, name, displayName, description, version",
- Source = ftk_QueryARG(query, 5),
+ Source = ftk_QueryARG(query, 5, true),
NullHandling =
if Source = null then
#table(
From cd573462c8244161322bf01fdddae2022528200c Mon Sep 17 00:00:00 2001
From: MSBrett
Date: Thu, 30 Jul 2026 14:36:16 -0700
Subject: [PATCH 12/15] Fix ARG batching review findings: broken symlinks,
missing allowlist entries, batch size inversion, and Advisor sort/type
regressions
- Revert 13 storage/*.tmdl symlinks to real duplicated files; git checks
out symlinks as literal path-text on Windows without core.symlinks=true,
which corrupted local builds and Power BI Desktop sessions for most
Windows contributors.
- Add ftk_QueryARG and ftk_ARGBatchSize to the Governance and
WorkloadOptimization Expressions allowlists in Build-PowerBI.ps1; both
were being stripped from the shipped .pbit even though ~10 tables call
ftk_QueryARG, which would break refresh in the built report.
- Reduce batchMultiplier on VirtualMachines (3 mv-expand blocks, widest
row) from 5 to none, and on AdvisorRecommendations,
AdvisorReservationRecommendations, and SqlDatabases from 5 to 2, so
batch size roughly tracks per-row payload weight instead of being
inverted (heaviest tables previously got the largest batches).
- Restore the lookbackPeriod Int64.Type transform in
AdvisorReservationRecommendations that this PR had dropped.
- Re-sort AdvisorRecommendations/AdvisorReservationRecommendations by
SortOrder after Table.Combine, since combining per-batch results only
preserves sort order within each batch, not globally.
- Wrap ftk_QueryARG's UnscopedSource query in try...otherwise so a
transient ARG failure on the optional unscoped-rows query degrades to
batched-only results instead of failing the whole table.
- Extract defaultBatchSize as a named constant and add a comment
explaining the in-query subscription filter vs request-level scope
tradeoff.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
---
.../definition/expressions.tmdl | 6 +-
.../tables/AdvisorRecommendations.tmdl | 8 +-
.../AdvisorReservationRecommendations.tmdl | 8 +-
.../definition/tables/SqlDatabases.tmdl | 2 +-
.../definition/tables/VirtualMachines.tmdl | 2 +-
.../definition/expressions.tmdl | 6 +-
.../tables/AdvisorRecommendations.tmdl | 551 ++++++++++++++-
.../AdvisorReservationRecommendations.tmdl | 523 ++++++++++++++-
.../definition/tables/Disks.tmdl | 223 +++++-
.../definition/tables/ManagementGroups.tmdl | 267 +++++++-
.../definition/tables/NetworkInterfaces.tmdl | 456 ++++++++++++-
.../tables/NetworkSecurityGroups.tmdl | 346 +++++++++-
.../definition/tables/PolicyAssignments.tmdl | 420 +++++++++++-
.../definition/tables/PolicyStates.tmdl | 390 ++++++++++-
.../definition/tables/PublicIPAddresses.tmdl | 229 ++++++-
.../definition/tables/Resources.tmdl | 115 +++-
.../definition/tables/SqlDatabases.tmdl | 384 ++++++++++-
.../definition/tables/Subscriptions.tmdl | 176 ++++-
.../definition/tables/VirtualMachines.tmdl | 633 +++++++++++++++++-
src/scripts/Build-PowerBI.ps1 | 4 +-
20 files changed, 4722 insertions(+), 27 deletions(-)
mode change 120000 => 100644 src/power-bi/storage/Shared.Dataset/definition/tables/AdvisorRecommendations.tmdl
mode change 120000 => 100644 src/power-bi/storage/Shared.Dataset/definition/tables/AdvisorReservationRecommendations.tmdl
mode change 120000 => 100644 src/power-bi/storage/Shared.Dataset/definition/tables/Disks.tmdl
mode change 120000 => 100644 src/power-bi/storage/Shared.Dataset/definition/tables/ManagementGroups.tmdl
mode change 120000 => 100644 src/power-bi/storage/Shared.Dataset/definition/tables/NetworkInterfaces.tmdl
mode change 120000 => 100644 src/power-bi/storage/Shared.Dataset/definition/tables/NetworkSecurityGroups.tmdl
mode change 120000 => 100644 src/power-bi/storage/Shared.Dataset/definition/tables/PolicyAssignments.tmdl
mode change 120000 => 100644 src/power-bi/storage/Shared.Dataset/definition/tables/PolicyStates.tmdl
mode change 120000 => 100644 src/power-bi/storage/Shared.Dataset/definition/tables/PublicIPAddresses.tmdl
mode change 120000 => 100644 src/power-bi/storage/Shared.Dataset/definition/tables/Resources.tmdl
mode change 120000 => 100644 src/power-bi/storage/Shared.Dataset/definition/tables/SqlDatabases.tmdl
mode change 120000 => 100644 src/power-bi/storage/Shared.Dataset/definition/tables/Subscriptions.tmdl
mode change 120000 => 100644 src/power-bi/storage/Shared.Dataset/definition/tables/VirtualMachines.tmdl
diff --git a/src/power-bi/kql/Shared.Dataset/definition/expressions.tmdl b/src/power-bi/kql/Shared.Dataset/definition/expressions.tmdl
index 659b6ceea..d892cef1d 100644
--- a/src/power-bi/kql/Shared.Dataset/definition/expressions.tmdl
+++ b/src/power-bi/kql/Shared.Dataset/definition/expressions.tmdl
@@ -102,8 +102,9 @@ expression ftk_ARGBatchSize = () => 100
expression ftk_QueryARG =
(query as text, optional batchMultiplier as number, optional includeUnscoped as logical) =>
let
+ defaultBatchSize = 100,
requestedBatchSize = try ftk_ARGBatchSize() * (if batchMultiplier <> null then batchMultiplier else 1) otherwise null,
- batchSize = if requestedBatchSize = null or not Value.Is(requestedBatchSize, type number) or requestedBatchSize < 1 then 100 else Number.RoundDown(requestedBatchSize),
+ batchSize = if requestedBatchSize = null or not Value.Is(requestedBatchSize, type number) or requestedBatchSize < 1 then defaultBatchSize else Number.RoundDown(requestedBatchSize),
subQuery = "resourcecontainers | where type == 'microsoft.resources/subscriptions' | project subscriptionId" & ftk_DemoFilter(),
Subscriptions = try AzureResourceGraph.Query(subQuery, "Tenant", null, null, [resultTruncated = false]) otherwise null,
SubscriptionIds = if Subscriptions = null or not Value.Is(Subscriptions, type table) or Table.RowCount(Subscriptions) = 0 or not Table.HasColumns(Subscriptions, "subscriptionId") then {} else Subscriptions[subscriptionId],
@@ -112,6 +113,7 @@ expression ftk_QueryARG =
let
batchStart = _ * batchSize,
batchIds = List.Range(SubscriptionIds, batchStart, List.Min({batchSize, List.Count(SubscriptionIds) - batchStart})),
+ // filter within the ARG query itself (rather than the request-level "subscriptions" scope parameter) so batching logic stays entirely in M and behaves the same for every caller regardless of query shape
subFilter = " | where subscriptionId in (" & Text.Combine(List.Transform(batchIds, each "'" & _ & "'"), ",") & ")",
fullQuery = query & subFilter,
Source = AzureResourceGraph.Query(fullQuery, "Tenant", null, null, [resultTruncated = false])
@@ -119,7 +121,7 @@ expression ftk_QueryARG =
if Table.HasColumns(Source, "Results") and Table.RowCount(Source) = 1 then null else Source
),
// some callers (for example tenant/management-group-scoped policy resources) can have a blank subscriptionId that never matches any subscription batch filter above; fetch those rows once, unbatched, when requested
- UnscopedSource = if includeUnscoped = true then AzureResourceGraph.Query(query & " | where isempty(subscriptionId)", "Tenant", null, null, [resultTruncated = false]) else null,
+ UnscopedSource = if includeUnscoped = true then (try AzureResourceGraph.Query(query & " | where isempty(subscriptionId)", "Tenant", null, null, [resultTruncated = false]) otherwise null) else null,
UnscopedFiltered = if UnscopedSource <> null and not (Table.HasColumns(UnscopedSource, "Results") and Table.RowCount(UnscopedSource) = 1) then UnscopedSource else null,
Filtered = List.RemoveNulls(Batches & {UnscopedFiltered}),
Combined = if List.Count(Filtered) > 0 then Table.Combine(Filtered) else null
diff --git a/src/power-bi/kql/Shared.Dataset/definition/tables/AdvisorRecommendations.tmdl b/src/power-bi/kql/Shared.Dataset/definition/tables/AdvisorRecommendations.tmdl
index 17706c3d6..3a138bf3e 100644
--- a/src/power-bi/kql/Shared.Dataset/definition/tables/AdvisorRecommendations.tmdl
+++ b/src/power-bi/kql/Shared.Dataset/definition/tables/AdvisorRecommendations.tmdl
@@ -522,7 +522,7 @@ table AdvisorRecommendations
['properties.resourceMetadata.source'] = properties.resourceMetadata.source,
SortOrder = case(properties.impact == 'High', 1, properties.impact == 'Medium', 2, properties.impact == 'Low', 3, 9)
",
- Source = ftk_QueryARG(query, 5),
+ Source = ftk_QueryARG(query, 2),
NullHandling =
if Source = null then
#table(
@@ -537,9 +537,11 @@ table AdvisorRecommendations
{"properties.extendedProperties.ObservationPeriodStartDate", type datetimezone},
{"properties.extendedProperties.ObservationPeriodEndDate", type datetimezone},
{"properties.lastUpdated", type datetimezone}
- }, "en-US")
+ }, "en-US"),
+ // Table.Combine concatenates per-batch results, so re-sort here to restore the global SortOrder ordering that the per-batch KQL "order by" only guarantees within each batch
+ Sorted = Table.Sort(Types, {{"SortOrder", Order.Ascending}})
in
- Types
+ Sorted
```
annotation PBI_NavigationStepName = Navigation
diff --git a/src/power-bi/kql/Shared.Dataset/definition/tables/AdvisorReservationRecommendations.tmdl b/src/power-bi/kql/Shared.Dataset/definition/tables/AdvisorReservationRecommendations.tmdl
index 2196f6b77..3b9a01a0b 100644
--- a/src/power-bi/kql/Shared.Dataset/definition/tables/AdvisorReservationRecommendations.tmdl
+++ b/src/power-bi/kql/Shared.Dataset/definition/tables/AdvisorReservationRecommendations.tmdl
@@ -493,7 +493,7 @@ table AdvisorReservationRecommendations
SortOrder = case(properties.impact == 'High', 1, properties.impact == 'Medium', 2, properties.impact == 'Low', 3, 9)
| order by SortOrder asc
",
- Source = ftk_QueryARG(query, 5),
+ Source = ftk_QueryARG(query, 2),
NullHandling =
if Source = null then
#table(
@@ -511,9 +511,11 @@ table AdvisorReservationRecommendations
{"properties.extendedProperties.ObservationPeriodStartDate", type datetimezone},
{"properties.extendedProperties.ObservationPeriodEndDate", type datetimezone},
{"properties.lastUpdated", type datetimezone}
- }, "en-US")
+ }, "en-US"),
+ // Table.Combine concatenates per-batch results, so re-sort here to restore the global SortOrder ordering that the per-batch KQL "order by" only guarantees within each batch
+ Sorted = Table.Sort(Types, {{"SortOrder", Order.Ascending}})
in
- Types
+ Sorted
annotation PBI_NavigationStepName = Navigation
diff --git a/src/power-bi/kql/Shared.Dataset/definition/tables/SqlDatabases.tmdl b/src/power-bi/kql/Shared.Dataset/definition/tables/SqlDatabases.tmdl
index 5e2a64251..77722b8ba 100644
--- a/src/power-bi/kql/Shared.Dataset/definition/tables/SqlDatabases.tmdl
+++ b/src/power-bi/kql/Shared.Dataset/definition/tables/SqlDatabases.tmdl
@@ -365,7 +365,7 @@ table SqlDatabases
['properties.readScale'] = properties.readScale,
['properties.maxLogSizeBytes'] = properties.maxLogSizeBytes
",
- Source = ftk_QueryARG(query, 5),
+ Source = ftk_QueryARG(query, 2),
NullHandling =
if Source = null then
#table(
diff --git a/src/power-bi/kql/Shared.Dataset/definition/tables/VirtualMachines.tmdl b/src/power-bi/kql/Shared.Dataset/definition/tables/VirtualMachines.tmdl
index 2088d6a9d..542de68b7 100644
--- a/src/power-bi/kql/Shared.Dataset/definition/tables/VirtualMachines.tmdl
+++ b/src/power-bi/kql/Shared.Dataset/definition/tables/VirtualMachines.tmdl
@@ -615,7 +615,7 @@ table VirtualMachines
['powerState.displayStatus'] = powerState.displayStatus
| mv-expand ['zones']
",
- Source = ftk_QueryARG(query, 5),
+ Source = ftk_QueryARG(query),
NullHandling =
if Source = null then
#table(
diff --git a/src/power-bi/storage/Shared.Dataset/definition/expressions.tmdl b/src/power-bi/storage/Shared.Dataset/definition/expressions.tmdl
index 9bd65c83c..4da04b9e1 100644
--- a/src/power-bi/storage/Shared.Dataset/definition/expressions.tmdl
+++ b/src/power-bi/storage/Shared.Dataset/definition/expressions.tmdl
@@ -509,8 +509,9 @@ expression ftk_ARGBatchSize = () => 100
expression ftk_QueryARG =
(query as text, optional batchMultiplier as number, optional includeUnscoped as logical) =>
let
+ defaultBatchSize = 100,
requestedBatchSize = try ftk_ARGBatchSize() * (if batchMultiplier <> null then batchMultiplier else 1) otherwise null,
- batchSize = if requestedBatchSize = null or not Value.Is(requestedBatchSize, type number) or requestedBatchSize < 1 then 100 else Number.RoundDown(requestedBatchSize),
+ batchSize = if requestedBatchSize = null or not Value.Is(requestedBatchSize, type number) or requestedBatchSize < 1 then defaultBatchSize else Number.RoundDown(requestedBatchSize),
subQuery = "resourcecontainers | where type == 'microsoft.resources/subscriptions' | project subscriptionId" & ftk_DemoFilter(),
Subscriptions = try AzureResourceGraph.Query(subQuery, "Tenant", null, null, [resultTruncated = false]) otherwise null,
SubscriptionIds = if Subscriptions = null or not Value.Is(Subscriptions, type table) or Table.RowCount(Subscriptions) = 0 or not Table.HasColumns(Subscriptions, "subscriptionId") then {} else Subscriptions[subscriptionId],
@@ -519,6 +520,7 @@ expression ftk_QueryARG =
let
batchStart = _ * batchSize,
batchIds = List.Range(SubscriptionIds, batchStart, List.Min({batchSize, List.Count(SubscriptionIds) - batchStart})),
+ // filter within the ARG query itself (rather than the request-level "subscriptions" scope parameter) so batching logic stays entirely in M and behaves the same for every caller regardless of query shape
subFilter = " | where subscriptionId in (" & Text.Combine(List.Transform(batchIds, each "'" & _ & "'"), ",") & ")",
fullQuery = query & subFilter,
Source = AzureResourceGraph.Query(fullQuery, "Tenant", null, null, [resultTruncated = false])
@@ -526,7 +528,7 @@ expression ftk_QueryARG =
if Table.HasColumns(Source, "Results") and Table.RowCount(Source) = 1 then null else Source
),
// some callers (for example tenant/management-group-scoped policy resources) can have a blank subscriptionId that never matches any subscription batch filter above; fetch those rows once, unbatched, when requested
- UnscopedSource = if includeUnscoped = true then AzureResourceGraph.Query(query & " | where isempty(subscriptionId)", "Tenant", null, null, [resultTruncated = false]) else null,
+ UnscopedSource = if includeUnscoped = true then (try AzureResourceGraph.Query(query & " | where isempty(subscriptionId)", "Tenant", null, null, [resultTruncated = false]) otherwise null) else null,
UnscopedFiltered = if UnscopedSource <> null and not (Table.HasColumns(UnscopedSource, "Results") and Table.RowCount(UnscopedSource) = 1) then UnscopedSource else null,
Filtered = List.RemoveNulls(Batches & {UnscopedFiltered}),
Combined = if List.Count(Filtered) > 0 then Table.Combine(Filtered) else null
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/AdvisorRecommendations.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/AdvisorRecommendations.tmdl
deleted file mode 120000
index 64dcaac16..000000000
--- a/src/power-bi/storage/Shared.Dataset/definition/tables/AdvisorRecommendations.tmdl
+++ /dev/null
@@ -1 +0,0 @@
-../../../../kql/Shared.Dataset/definition/tables/AdvisorRecommendations.tmdl
\ No newline at end of file
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/AdvisorRecommendations.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/AdvisorRecommendations.tmdl
new file mode 100644
index 000000000..3a138bf3e
--- /dev/null
+++ b/src/power-bi/storage/Shared.Dataset/definition/tables/AdvisorRecommendations.tmdl
@@ -0,0 +1,550 @@
+table AdvisorRecommendations
+ lineageTag: a76a7ba9-b6b5-4140-9739-344b958bfc9f
+
+ column id
+ dataType: string
+ lineageTag: de03600f-0938-479c-9668-1386cd8fd8cc
+ summarizeBy: none
+ sourceColumn: id
+
+ annotation SummarizationSetBy = Automatic
+
+ column name
+ dataType: string
+ lineageTag: b82b2171-5f91-421e-9052-b72ae63ed3c3
+ summarizeBy: none
+ sourceColumn: name
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.recommendationTypeId'
+ dataType: string
+ lineageTag: b5215814-f868-4a8c-8c85-719e04a93cdd
+ summarizeBy: none
+ sourceColumn: properties.recommendationTypeId
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.ObservationPeriodStartDate'
+ dataType: dateTime
+ formatString: General Date
+ lineageTag: ab4f38d6-4047-479b-9f9b-e410f75ddc7e
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.ObservationPeriodStartDate
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.ObservationPeriodEndDate'
+ dataType: dateTime
+ formatString: General Date
+ lineageTag: 56c63f3b-8ddd-4c48-a1d4-ebd95bb7c077
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.ObservationPeriodEndDate
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.annualSavingsAmount'
+ dataType: double
+ lineageTag: 19b8e57a-5d4c-47c6-b339-244398d3280f
+ summarizeBy: sum
+ sourceColumn: properties.extendedProperties.annualSavingsAmount
+
+ annotation SummarizationSetBy = Automatic
+
+ annotation PBI_FormatHint = {"isGeneralNumber":true}
+
+ column 'properties.extendedProperties.HasRecommendation'
+ dataType: string
+ lineageTag: 43a90524-510a-48a1-a41b-67275ab5a220
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.HasRecommendation
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.savingsCurrency'
+ dataType: string
+ lineageTag: 17b12b2b-14c2-4a12-90d0-1faa1b3a192b
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.savingsCurrency
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.IsInReplication'
+ dataType: string
+ lineageTag: dbfe3e6c-c999-447a-bc1b-c7fe0e506013
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.IsInReplication
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.Recommended_DTU'
+ dataType: string
+ lineageTag: a7158037-adc3-42fb-a6ee-234086f5dc36
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.Recommended_DTU
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.Recommended_SKU'
+ dataType: string
+ lineageTag: 73678d68-9152-45dc-b63b-c84bec6430c3
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.Recommended_SKU
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.ResourceGroup'
+ dataType: string
+ lineageTag: b96cc7fb-e6a6-456c-b1a7-62a7f1faf6f2
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.ResourceGroup
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.savingsAmount'
+ dataType: double
+ lineageTag: fe066f63-af23-441a-b614-df90e7b459c2
+ summarizeBy: sum
+ sourceColumn: properties.extendedProperties.savingsAmount
+
+ annotation SummarizationSetBy = Automatic
+
+ annotation PBI_FormatHint = {"isGeneralNumber":true}
+
+ column 'properties.extendedProperties.DatabaseSize'
+ dataType: string
+ lineageTag: 291bcdda-5321-4bb3-8900-62cb86a30af8
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.DatabaseSize
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.DatabaseName'
+ dataType: string
+ lineageTag: 282b6040-b89c-4139-95bf-c914e6a07138
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.DatabaseName
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.ServerName'
+ dataType: string
+ lineageTag: 64d82cc4-f542-4ee4-9cdd-f0ce960d97a4
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.ServerName
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.Region'
+ dataType: string
+ lineageTag: a804462d-34e5-498d-ae01-0ba78750329e
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.Region
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.lookbackPeriod'
+ dataType: string
+ lineageTag: e0579f64-a229-40fd-b0d2-6a6c7baf8052
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.lookbackPeriod
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.subId'
+ dataType: string
+ lineageTag: b2ca600b-c8f6-42db-9edc-97ca64a5429e
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.subId
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.scope'
+ dataType: string
+ lineageTag: 32e4dd3a-74a6-4e20-9005-55bfbcd3ac7e
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.scope
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.term'
+ dataType: string
+ lineageTag: 12b6fe8e-9c25-4287-8db1-23279ec5616e
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.term
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.sku'
+ dataType: string
+ lineageTag: 9a56ac74-a4e4-44b0-b879-9d0d696aa06a
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.sku
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.commitment'
+ dataType: string
+ lineageTag: c63f1307-bbd6-48c1-807f-9b5dcd0ad9cf
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.commitment
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.currentSku'
+ dataType: string
+ lineageTag: 9ac388a6-51eb-4bec-aa68-5c13b7fe5c9b
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.currentSku
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.targetSku'
+ dataType: string
+ lineageTag: 1ebb5230-bc88-4be3-8e7f-7ce06fbecce4
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.targetSku
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.recommendationMessage'
+ dataType: string
+ lineageTag: e0744324-2c7b-43b4-bc4d-bce14a18a0e2
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.recommendationMessage
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.shortDescription.solution'
+ dataType: string
+ lineageTag: 9c791663-17ff-42a2-9648-ef4b12b2671e
+ summarizeBy: none
+ sourceColumn: properties.shortDescription.solution
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.shortDescription.problem'
+ dataType: string
+ lineageTag: 5c657cce-2d94-4eec-b526-7d20c72bec54
+ summarizeBy: none
+ sourceColumn: properties.shortDescription.problem
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.resourceMetadata.resourceId'
+ dataType: string
+ lineageTag: 395d38f4-d4f6-4d30-94a2-ec3244abfed2
+ summarizeBy: none
+ sourceColumn: properties.resourceMetadata.resourceId
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.resourceMetadata.singular'
+ dataType: string
+ lineageTag: 58f9df6d-d682-4bf8-9273-d141f30c4743
+ summarizeBy: none
+ sourceColumn: properties.resourceMetadata.singular
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.resourceMetadata.plural'
+ dataType: string
+ lineageTag: 86f40b1b-56c8-4b29-9ac2-7b2cbb6f9f19
+ summarizeBy: none
+ sourceColumn: properties.resourceMetadata.plural
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.resourceMetadata.action'
+ dataType: string
+ lineageTag: 1cdc271b-78aa-45e9-b85c-89684dddf18c
+ summarizeBy: none
+ sourceColumn: properties.resourceMetadata.action
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.resourceMetadata.source'
+ dataType: string
+ lineageTag: c83167c4-f804-4568-8894-a9ffd8d0fdd9
+ summarizeBy: none
+ sourceColumn: properties.resourceMetadata.source
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.suppressionIds'
+ dataType: string
+ lineageTag: 8761bfa3-8cb3-4d24-984e-c0cb3482a2a0
+ summarizeBy: none
+ sourceColumn: properties.suppressionIds
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.impactedField'
+ dataType: string
+ lineageTag: 26285858-61f3-4efd-8201-9f79d3f877cd
+ summarizeBy: none
+ sourceColumn: properties.impactedField
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.impactedValue'
+ dataType: string
+ lineageTag: 62951291-b70a-47eb-bbfd-74e781fef07e
+ summarizeBy: none
+ sourceColumn: properties.impactedValue
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.lastUpdated'
+ dataType: dateTime
+ formatString: Mmm d h:nn AM/PM
+ lineageTag: d3bf7cce-83bc-4589-a2da-ece0e146e1d3
+ summarizeBy: none
+ sourceColumn: properties.lastUpdated
+
+ annotation SummarizationSetBy = Automatic
+
+ annotation PBI_FormatHint = {"isCustom":true}
+
+ column 'properties.category'
+ dataType: string
+ lineageTag: d4071f11-546e-49cc-9131-675482ae0927
+ summarizeBy: none
+ sourceColumn: properties.category
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.metadata'
+ dataType: string
+ lineageTag: 9888db80-3867-4fe4-8600-661836e054a1
+ summarizeBy: none
+ sourceColumn: properties.metadata
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.impact'
+ dataType: string
+ lineageTag: 62f29742-9472-4678-b789-5da41abf1051
+ summarizeBy: none
+ sourceColumn: properties.impact
+ sortByColumn: SortOrder
+
+ changedProperty = SortByColumn
+
+ annotation SummarizationSetBy = Automatic
+
+ column SortOrder
+ dataType: double
+ formatString: 0
+ lineageTag: 4d8ca85e-f35a-4e71-866b-188c3de4f284
+ summarizeBy: sum
+ sourceColumn: SortOrder
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.shortDescription'
+ dataType: string
+ lineageTag: db36be30-e93a-4d83-8723-cfd5fef8ec31
+ summarizeBy: none
+ sourceColumn: properties.shortDescription
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.resourceMetadata'
+ dataType: string
+ lineageTag: d1efb6c5-bd4f-40af-a43e-69e7576a48a1
+ summarizeBy: none
+ sourceColumn: properties.resourceMetadata
+
+ annotation SummarizationSetBy = Automatic
+
+ column type
+ dataType: string
+ lineageTag: 6813f654-5807-4a26-b6bf-e31b3977973b
+ summarizeBy: none
+ sourceColumn: type
+
+ annotation SummarizationSetBy = Automatic
+
+ column tenantId
+ dataType: string
+ lineageTag: 36908dc0-7497-4120-97a2-e6a4b4bfb9f2
+ summarizeBy: none
+ sourceColumn: tenantId
+
+ annotation SummarizationSetBy = Automatic
+
+ column kind
+ dataType: string
+ lineageTag: 739bec08-ec0a-499e-9918-fd0f1964ee4a
+ summarizeBy: none
+ sourceColumn: kind
+
+ annotation SummarizationSetBy = Automatic
+
+ column location
+ dataType: string
+ lineageTag: 0175f893-f6cc-4204-bba9-cf95a23fce9c
+ summarizeBy: none
+ sourceColumn: location
+
+ annotation SummarizationSetBy = Automatic
+
+ column resourceGroup
+ dataType: string
+ lineageTag: 2d586d61-76f4-4b13-8a85-ee65c0b58ba5
+ summarizeBy: none
+ sourceColumn: resourceGroup
+
+ annotation SummarizationSetBy = Automatic
+
+ column subscriptionId
+ dataType: string
+ lineageTag: eb535a29-a6bf-47f4-86b9-9e6fa7355300
+ summarizeBy: none
+ sourceColumn: subscriptionId
+
+ annotation SummarizationSetBy = Automatic
+
+ column managedBy
+ dataType: string
+ lineageTag: 8236cdb5-25a3-4129-be24-09a6c7c4a8d1
+ summarizeBy: none
+ sourceColumn: managedBy
+
+ annotation SummarizationSetBy = Automatic
+
+ column sku
+ dataType: string
+ lineageTag: 210e2ef6-f18e-47a4-a91f-e9cd57aab99f
+ summarizeBy: none
+ sourceColumn: sku
+
+ annotation SummarizationSetBy = Automatic
+
+ column plan
+ dataType: string
+ lineageTag: 0d1b5da0-fc60-422f-b3ce-dea583eed0b2
+ summarizeBy: none
+ sourceColumn: plan
+
+ annotation SummarizationSetBy = Automatic
+
+ column properties
+ dataType: string
+ lineageTag: 9dd67b79-1ce0-45b0-89b6-9d30aec09db3
+ summarizeBy: none
+ sourceColumn: properties
+
+ annotation SummarizationSetBy = Automatic
+
+ column tags
+ dataType: string
+ lineageTag: d1007741-8139-4599-80dc-8d1ab3dd4026
+ summarizeBy: none
+ sourceColumn: tags
+
+ annotation SummarizationSetBy = Automatic
+
+ column identity
+ dataType: string
+ lineageTag: 6ca4aa2c-1c77-4e55-9bd2-c65007a92631
+ summarizeBy: none
+ sourceColumn: identity
+
+ annotation SummarizationSetBy = Automatic
+
+ column zones
+ dataType: string
+ lineageTag: 49a9a75a-1589-4e24-a622-31603e416086
+ summarizeBy: none
+ sourceColumn: zones
+
+ annotation SummarizationSetBy = Automatic
+
+ column extendedLocation
+ dataType: string
+ lineageTag: 65908216-087d-4693-88b1-bcafb39cf8c8
+ summarizeBy: none
+ sourceColumn: extendedLocation
+
+ annotation SummarizationSetBy = Automatic
+
+ partition AdvisorRecommendations = m
+ mode: import
+ queryGroup: 'Resource Graph'
+ source = ```
+ let
+ query = "
+ advisorresources
+ | where type == 'microsoft.advisor/recommendations'
+ | where properties.category == 'Cost'
+ | extend
+ ['properties.recommendationTypeId'] = properties.recommendationTypeId,
+ ['properties.shortDescription'] = properties.shortDescription,
+ ['properties.resourceMetadata'] = properties.resourceMetadata,
+ ['properties.suppressionIds'] = properties.suppressionIds,
+ ['properties.impactedField'] = properties.impactedField,
+ ['properties.impactedValue'] = properties.impactedValue,
+ ['properties.lastUpdated'] = properties.lastUpdated,
+ ['properties.category'] = properties.category,
+ ['properties.metadata'] = properties.metadata,
+ ['properties.impact'] = properties.impact,
+ ['properties.shortDescription.problem'] = properties.shortDescription.problem,
+ ['properties.shortDescription.solution'] = properties.shortDescription.solution,
+ ['properties.extendedProperties.ObservationPeriodStartDate'] = properties.extendedProperties.ObservationPeriodStartDate,
+ ['properties.extendedProperties.ObservationPeriodEndDate'] = properties.extendedProperties.ObservationPeriodEndDate,
+ ['properties.extendedProperties.annualSavingsAmount'] = coalesce(properties.extendedProperties.annualSavingsAmount, 0),
+ ['properties.extendedProperties.HasRecommendation'] = properties.extendedProperties.HasRecommendation,
+ ['properties.extendedProperties.savingsCurrency'] = properties.extendedProperties.savingsCurrency,
+ ['properties.extendedProperties.IsInReplication'] = properties.extendedProperties.IsInReplication,
+ ['properties.extendedProperties.Recommended_DTU'] = properties.extendedProperties.Recommended_DTU,
+ ['properties.extendedProperties.Recommended_SKU'] = properties.extendedProperties.Recommended_SKU,
+ ['properties.extendedProperties.ResourceGroup'] = tolower(properties.extendedProperties.ResourceGroup),
+ ['properties.extendedProperties.savingsAmount'] = coalesce(properties.extendedProperties.savingsAmount, 0),
+ ['properties.extendedProperties.DatabaseSize'] = properties.extendedProperties.DatabaseSize,
+ ['properties.extendedProperties.DatabaseName'] = properties.extendedProperties.DatabaseName,
+ ['properties.extendedProperties.ServerName'] = properties.extendedProperties.ServerName,
+ ['properties.extendedProperties.Region'] = properties.extendedProperties.Region,
+ ['properties.extendedProperties.lookbackPeriod'] = properties.extendedProperties.lookbackPeriod,
+ ['properties.extendedProperties.subId'] = properties.extendedProperties.subId,
+ ['properties.extendedProperties.scope'] = properties.extendedProperties.scope,
+ ['properties.extendedProperties.term'] = properties.extendedProperties.term,
+ ['properties.extendedProperties.sku'] = properties.extendedProperties.sku,
+ ['properties.extendedProperties.commitment'] = properties.extendedProperties.commitment,
+ ['properties.extendedProperties.currentSku'] = properties.extendedProperties.currentSku,
+ ['properties.extendedProperties.targetSku'] = properties.extendedProperties.targetSku,
+ ['properties.extendedProperties.recommendationMessage'] = properties.extendedProperties.recommendationMessage,
+ ['properties.resourceMetadata.resourceId'] = tolower(properties.resourceMetadata.resourceId),
+ ['properties.resourceMetadata.singular'] = properties.resourceMetadata.singular,
+ ['properties.resourceMetadata.plural'] = properties.resourceMetadata.plural,
+ ['properties.resourceMetadata.action'] = properties.resourceMetadata.action,
+ ['properties.resourceMetadata.source'] = properties.resourceMetadata.source,
+ SortOrder = case(properties.impact == 'High', 1, properties.impact == 'Medium', 2, properties.impact == 'Low', 3, 9)
+ ",
+ Source = ftk_QueryARG(query, 2),
+ NullHandling =
+ if Source = null then
+ #table(
+ { "id", "name", "type", "properties.recommendationTypeId", "properties.shortDescription", "properties.resourceMetadata", "properties.suppressionIds", "properties.impactedField", "properties.impactedValue", "properties.lastUpdated", "properties.category", "properties.metadata", "properties.impact", "properties.shortDescription.problem", "properties.shortDescription.solution", "properties.extendedProperties.ObservationPeriodStartDate", "properties.extendedProperties.ObservationPeriodEndDate", "properties.extendedProperties.annualSavingsAmount", "properties.extendedProperties.HasRecommendation", "properties.extendedProperties.savingsCurrency", "properties.extendedProperties.IsInReplication", "properties.extendedProperties.Recommended_DTU", "properties.extendedProperties.Recommended_SKU", "properties.extendedProperties.ResourceGroup", "properties.extendedProperties.savingsAmount", "properties.extendedProperties.DatabaseSize", "properties.extendedProperties.DatabaseName", "properties.extendedProperties.ServerName", "properties.extendedProperties.Region", "properties.extendedProperties.lookbackPeriod", "properties.extendedProperties.subId", "properties.extendedProperties.scope", "properties.extendedProperties.term", "properties.extendedProperties.sku", "properties.extendedProperties.commitment", "properties.extendedProperties.currentSku", "properties.extendedProperties.targetSku", "properties.extendedProperties.recommendationMessage", "properties.resourceMetadata.resourceId", "properties.resourceMetadata.singular", "properties.resourceMetadata.plural", "properties.resourceMetadata.action", "properties.resourceMetadata.source", "SortOrder" },
+ {}
+ )
+ else Source,
+ Types = Table.TransformColumnTypes(NullHandling, {
+ {"properties.extendedProperties.annualSavingsAmount", type number},
+ {"properties.extendedProperties.savingsAmount", type number},
+ {"SortOrder", type number},
+ {"properties.extendedProperties.ObservationPeriodStartDate", type datetimezone},
+ {"properties.extendedProperties.ObservationPeriodEndDate", type datetimezone},
+ {"properties.lastUpdated", type datetimezone}
+ }, "en-US"),
+ // Table.Combine concatenates per-batch results, so re-sort here to restore the global SortOrder ordering that the per-batch KQL "order by" only guarantees within each batch
+ Sorted = Table.Sort(Types, {{"SortOrder", Order.Ascending}})
+ in
+ Sorted
+ ```
+
+ annotation PBI_NavigationStepName = Navigation
+
+ annotation PBI_ResultType = Table
+
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/AdvisorReservationRecommendations.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/AdvisorReservationRecommendations.tmdl
deleted file mode 120000
index 03bc82802..000000000
--- a/src/power-bi/storage/Shared.Dataset/definition/tables/AdvisorReservationRecommendations.tmdl
+++ /dev/null
@@ -1 +0,0 @@
-../../../../kql/Shared.Dataset/definition/tables/AdvisorReservationRecommendations.tmdl
\ No newline at end of file
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/AdvisorReservationRecommendations.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/AdvisorReservationRecommendations.tmdl
new file mode 100644
index 000000000..3b9a01a0b
--- /dev/null
+++ b/src/power-bi/storage/Shared.Dataset/definition/tables/AdvisorReservationRecommendations.tmdl
@@ -0,0 +1,522 @@
+table AdvisorReservationRecommendations
+ lineageTag: e2be3b74-1430-4a74-bf1a-18576064c803
+
+ column id
+ dataType: string
+ lineageTag: e9cd6688-9a32-4da4-86e9-aed15b22652d
+ summarizeBy: none
+ sourceColumn: id
+
+ annotation SummarizationSetBy = Automatic
+
+ column name
+ dataType: string
+ lineageTag: 8eb22dcc-76d0-4491-9aa3-d264bcc05789
+ summarizeBy: none
+ sourceColumn: name
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.recommendationTypeId'
+ dataType: string
+ lineageTag: badf977b-e853-4e53-a169-64a2dd84d1dd
+ summarizeBy: none
+ sourceColumn: properties.recommendationTypeId
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.reservedResourceType'
+ dataType: string
+ lineageTag: 865a01a5-6c7e-4669-9b20-19133445405f
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.reservedResourceType
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.annualSavingsAmount'
+ dataType: double
+ lineageTag: 09d4b890-7c8d-4ee0-943d-4a9212c7091f
+ summarizeBy: sum
+ sourceColumn: properties.extendedProperties.annualSavingsAmount
+
+ annotation SummarizationSetBy = Automatic
+
+ annotation PBI_FormatHint = {"isGeneralNumber":true}
+
+ column 'properties.extendedProperties.targetResourceCount'
+ dataType: int64
+ formatString: 0
+ lineageTag: f2f67512-e38d-410d-a77a-1a530a905a36
+ summarizeBy: sum
+ sourceColumn: properties.extendedProperties.targetResourceCount
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.savingsCurrency'
+ dataType: string
+ lineageTag: 26882091-cceb-4825-8f25-e57c49d2353e
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.savingsCurrency
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.lookbackPeriod'
+ dataType: int64
+ formatString: 0
+ lineageTag: 82a3a6d5-01c1-4db7-be17-572b62ceb699
+ summarizeBy: sum
+ sourceColumn: properties.extendedProperties.lookbackPeriod
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.savingsAmount'
+ dataType: double
+ lineageTag: 99312e80-1a6c-4520-a5b0-645f69d8e310
+ summarizeBy: sum
+ sourceColumn: properties.extendedProperties.savingsAmount
+
+ annotation SummarizationSetBy = Automatic
+
+ annotation PBI_FormatHint = {"isGeneralNumber":true}
+
+ column 'properties.extendedProperties.displaySKU'
+ dataType: string
+ lineageTag: 20289648-2bc4-4c25-b1b0-826abefd04cb
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.displaySKU
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.displayQty'
+ dataType: int64
+ formatString: 0
+ lineageTag: 886d306c-f180-4676-8cd0-5ec56d7feb04
+ summarizeBy: sum
+ sourceColumn: properties.extendedProperties.displayQty
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.location'
+ dataType: string
+ lineageTag: 42e5826c-0b31-4819-b7e0-319ecea32fea
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.location
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.region'
+ dataType: string
+ lineageTag: c6c5edcb-3e8f-464c-86a0-bb54b943e817
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.region
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.vmSize'
+ dataType: string
+ lineageTag: 8fed315f-01e6-4b99-8881-931664de1eae
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.vmSize
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.subId'
+ dataType: string
+ lineageTag: dbbb8676-ac50-4761-bbd4-3b570710c2f4
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.subId
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.scope'
+ dataType: string
+ lineageTag: a1352eea-bc3b-468c-a288-178d8cdb770f
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.scope
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.term'
+ dataType: string
+ lineageTag: 60bc379d-ff92-4d80-89c0-e20addb02ae7
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.term
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.sku'
+ dataType: string
+ lineageTag: 9754b4be-44c4-46ed-b53a-0cd3c0d3b32c
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.sku
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.qty'
+ dataType: int64
+ formatString: 0
+ lineageTag: b5c62ce1-3aa8-4e8f-bf60-91b160868d92
+ summarizeBy: sum
+ sourceColumn: properties.extendedProperties.qty
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.resourceMetadata.resourceId'
+ dataType: string
+ lineageTag: c1a5553c-a8e2-44b6-a4e2-ee173b5b88ff
+ summarizeBy: none
+ sourceColumn: properties.resourceMetadata.resourceId
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.resourceMetadata.singular'
+ dataType: string
+ lineageTag: aadd862e-b506-4ae6-849a-8a83c0744c65
+ summarizeBy: none
+ sourceColumn: properties.resourceMetadata.singular
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.resourceMetadata.plural'
+ dataType: string
+ lineageTag: 3973f04a-8d35-415e-b06e-4ec8dbfe9048
+ summarizeBy: none
+ sourceColumn: properties.resourceMetadata.plural
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.resourceMetadata.action'
+ dataType: string
+ lineageTag: 8c8a5ac4-e51d-4fa2-a031-0cb29c29db82
+ summarizeBy: none
+ sourceColumn: properties.resourceMetadata.action
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.resourceMetadata.source'
+ dataType: string
+ lineageTag: 4cb277aa-3319-4aaa-8c6a-a49e9a4a11ab
+ summarizeBy: none
+ sourceColumn: properties.resourceMetadata.source
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.shortDescription.solution'
+ dataType: string
+ lineageTag: 98412b8a-854a-4292-a30c-8e096ce4c728
+ summarizeBy: none
+ sourceColumn: properties.shortDescription.solution
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.shortDescription.problem'
+ dataType: string
+ lineageTag: e31a4cd0-a5f9-4a5f-bea6-ecff0be2ea13
+ summarizeBy: none
+ sourceColumn: properties.shortDescription.problem
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.suppressionIds'
+ dataType: string
+ lineageTag: aa582a0d-0c5f-49dd-93f2-3363bb02828c
+ summarizeBy: none
+ sourceColumn: properties.suppressionIds
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.impactedField'
+ dataType: string
+ lineageTag: c0947fb9-3d13-4cad-a274-bb58dc488100
+ summarizeBy: none
+ sourceColumn: properties.impactedField
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.impactedValue'
+ dataType: string
+ lineageTag: d803c460-7f91-4c6e-9649-a28d90b8f2a2
+ summarizeBy: none
+ sourceColumn: properties.impactedValue
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.lastUpdated'
+ dataType: dateTime
+ formatString: General Date
+ lineageTag: b93e22ab-02ec-4821-aff7-4a45b86fee21
+ summarizeBy: none
+ sourceColumn: properties.lastUpdated
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.metadata'
+ dataType: string
+ lineageTag: 055caf5c-5b7b-428a-b4a1-0b4c68ca55b9
+ summarizeBy: none
+ sourceColumn: properties.metadata
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.category'
+ dataType: string
+ lineageTag: 0bdec23f-098b-486d-870d-3df3e3fb737c
+ summarizeBy: none
+ sourceColumn: properties.category
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.impact'
+ dataType: string
+ lineageTag: a6596380-928f-4559-a334-26c33b67c4a9
+ summarizeBy: none
+ sourceColumn: properties.impact
+
+ annotation SummarizationSetBy = Automatic
+
+ column recommendedActions
+ dataType: string
+ lineageTag: e7e9e023-cf8c-4c71-b652-4481af19b173
+ summarizeBy: none
+ sourceColumn: recommendedActions
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.shortDescription'
+ dataType: string
+ lineageTag: 5ed5ac30-eac0-4e94-8539-9092867e2a8e
+ summarizeBy: none
+ sourceColumn: properties.shortDescription
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.resourceMetadata'
+ dataType: string
+ lineageTag: 42f6c299-bcec-47a5-ad78-cb16c57a372f
+ summarizeBy: none
+ sourceColumn: properties.resourceMetadata
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.ObservationPeriodStartDate'
+ dataType: dateTime
+ formatString: General Date
+ lineageTag: 1e286848-dabb-4034-8913-cd9cf2144716
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.ObservationPeriodStartDate
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.ObservationPeriodEndDate'
+ dataType: dateTime
+ formatString: General Date
+ lineageTag: 55c1b862-e2f9-4655-aedc-1e5d5b02e2d4
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.ObservationPeriodEndDate
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.HasRecommendation'
+ dataType: string
+ lineageTag: b87c10ce-9453-41d4-b56b-680bae8ac4a2
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.HasRecommendation
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.IsInReplication'
+ dataType: string
+ lineageTag: 7a6be7dd-254a-45a5-8aba-3ca27eca2b5b
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.IsInReplication
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.Recommended_DTU'
+ dataType: string
+ lineageTag: 48b988f9-4dc0-4f84-86a8-8c3b87940179
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.Recommended_DTU
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.Recommended_SKU'
+ dataType: string
+ lineageTag: 0a0fdca3-221d-4572-aed6-5c840358cb69
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.Recommended_SKU
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.ResourceGroup'
+ dataType: string
+ lineageTag: f5ffcebb-d130-457c-a298-6d462eea16bb
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.ResourceGroup
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.DatabaseSize'
+ dataType: string
+ lineageTag: 42dffd26-268e-49a1-b047-99e8c0f7f104
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.DatabaseSize
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.DatabaseName'
+ dataType: string
+ lineageTag: f74bb29d-f74d-4c35-bc25-66818909cfcc
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.DatabaseName
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.ServerName'
+ dataType: string
+ lineageTag: 804d5612-8c2e-4881-a80b-37968100ba21
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.ServerName
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.Region'
+ dataType: string
+ lineageTag: 68593266-9950-4caf-9522-ccfcbaa5d5e3
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.Region
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.commitment'
+ dataType: string
+ lineageTag: e0b87d0c-8c42-4354-b85a-5fc93d4af06a
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.commitment
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.currentSku'
+ dataType: string
+ lineageTag: 11320610-15d3-4db1-89b5-746d92fbf0fa
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.currentSku
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.targetSku'
+ dataType: string
+ lineageTag: 9a5c5a7c-8a59-4445-8946-d13f64fb3091
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.targetSku
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.extendedProperties.recommendationMessage'
+ dataType: string
+ lineageTag: b2c1b5c3-ae28-4630-8823-d2db3604a1fb
+ summarizeBy: none
+ sourceColumn: properties.extendedProperties.recommendationMessage
+
+ annotation SummarizationSetBy = Automatic
+
+ column SortOrder
+ dataType: double
+ lineageTag: 0abaa4e9-cb2e-49bf-97ab-a0e6f54d3cb2
+ summarizeBy: sum
+ sourceColumn: SortOrder
+
+ annotation SummarizationSetBy = Automatic
+
+ annotation PBI_FormatHint = {"isGeneralNumber":true}
+
+ partition AdvisorReservationRecommendations = m
+ mode: import
+ queryGroup: 'Resource Graph'
+ source =
+ let
+ query = "
+ advisorresources
+ | where type == 'microsoft.advisor/recommendations'
+ | where properties.category == 'Cost'
+ | where properties.shortDescription.solution == 'Consider virtual machine reserved instance to save over your on-demand costs'
+ | extend
+ ['properties.recommendationTypeId'] = properties.recommendationTypeId,
+ ['properties.shortDescription'] = properties.shortDescription,
+ ['properties.resourceMetadata'] = properties.resourceMetadata,
+ ['properties.suppressionIds'] = properties.suppressionIds,
+ ['properties.impactedField'] = properties.impactedField,
+ ['properties.impactedValue'] = properties.impactedValue,
+ ['properties.lastUpdated'] = todatetime(properties.lastUpdated),
+ ['properties.category'] = properties.category,
+ ['properties.metadata'] = properties.metadata,
+ ['properties.impact'] = properties.impact,
+ ['properties.shortDescription.problem'] = properties.shortDescription.problem,
+ ['properties.shortDescription.solution'] = properties.shortDescription.solution,
+ ['properties.extendedProperties.ObservationPeriodStartDate'] = properties.extendedProperties.ObservationPeriodStartDate,
+ ['properties.extendedProperties.ObservationPeriodEndDate'] = properties.extendedProperties.ObservationPeriodEndDate,
+ ['properties.extendedProperties.reservedResourceType'] = properties.extendedProperties.reservedResourceType,
+ ['properties.extendedProperties.annualSavingsAmount'] = coalesce(properties.extendedProperties.annualSavingsAmount, 0),
+ ['properties.extendedProperties.targetResourceCount'] = toint(properties.extendedProperties.targetResourceCount),
+ ['properties.extendedProperties.HasRecommendation'] = properties.extendedProperties.HasRecommendation,
+ ['properties.extendedProperties.savingsCurrency'] = properties.extendedProperties.savingsCurrency,
+ ['properties.extendedProperties.IsInReplication'] = properties.extendedProperties.IsInReplication,
+ ['properties.extendedProperties.Recommended_DTU'] = properties.extendedProperties.Recommended_DTU,
+ ['properties.extendedProperties.Recommended_SKU'] = properties.extendedProperties.Recommended_SKU,
+ ['properties.extendedProperties.ResourceGroup'] = tolower(properties.extendedProperties.ResourceGroup),
+ ['properties.extendedProperties.lookbackPeriod'] = properties.extendedProperties.lookbackPeriod,
+ ['properties.extendedProperties.savingsAmount'] = coalesce(properties.extendedProperties.savingsAmount, 0),
+ ['properties.extendedProperties.DatabaseSize'] = properties.extendedProperties.DatabaseSize,
+ ['properties.extendedProperties.DatabaseName'] = properties.extendedProperties.DatabaseName,
+ ['properties.extendedProperties.ServerName'] = properties.extendedProperties.ServerName,
+ ['properties.extendedProperties.Region'] = properties.extendedProperties.Region,
+ ['properties.extendedProperties.displaySKU'] = properties.extendedProperties.displaySKU,
+ ['properties.extendedProperties.displayQty'] = toint(properties.extendedProperties.displayQty),
+ ['properties.extendedProperties.location'] = properties.extendedProperties.location,
+ ['properties.extendedProperties.region'] = properties.extendedProperties.region,
+ ['properties.extendedProperties.vmSize'] = properties.extendedProperties.vmSize,
+ ['properties.extendedProperties.subId'] = properties.extendedProperties.subId,
+ ['properties.extendedProperties.scope'] = properties.extendedProperties.scope,
+ ['properties.extendedProperties.term'] = properties.extendedProperties.term,
+ ['properties.extendedProperties.sku'] = properties.extendedProperties.sku,
+ ['properties.extendedProperties.qty'] = toint(properties.extendedProperties.qty),
+ ['properties.extendedProperties.commitment'] = properties.extendedProperties.commitment,
+ ['properties.extendedProperties.currentSku'] = properties.extendedProperties.currentSku,
+ ['properties.extendedProperties.targetSku'] = properties.extendedProperties.targetSku,
+ ['properties.extendedProperties.recommendationMessage'] = properties.extendedProperties.recommendationMessage,
+ ['properties.resourceMetadata.resourceId'] = tolower(properties.resourceMetadata.resourceId),
+ ['properties.resourceMetadata.singular'] = properties.resourceMetadata.singular,
+ ['properties.resourceMetadata.plural'] = properties.resourceMetadata.plural,
+ ['properties.resourceMetadata.action'] = properties.resourceMetadata.action,
+ ['properties.resourceMetadata.source'] = properties.resourceMetadata.source,
+ recommendedActions = iff(isnotempty(properties.extendedProperties.displaySKU), strcat(properties.extendedProperties.displaySKU, ' virtual machines in ', properties.extendedProperties.location), tostring(properties.shortDescription.solution)),
+ SortOrder = case(properties.impact == 'High', 1, properties.impact == 'Medium', 2, properties.impact == 'Low', 3, 9)
+ | order by SortOrder asc
+ ",
+ Source = ftk_QueryARG(query, 2),
+ NullHandling =
+ if Source = null then
+ #table(
+ { "id", "name", "properties.recommendationTypeId", "properties.shortDescription", "properties.resourceMetadata", "properties.suppressionIds", "properties.impactedField", "properties.impactedValue", "properties.lastUpdated", "properties.category", "properties.metadata", "properties.impact", "properties.shortDescription.problem", "properties.shortDescription.solution", "properties.extendedProperties.ObservationPeriodStartDate", "properties.extendedProperties.ObservationPeriodEndDate", "properties.extendedProperties.reservedResourceType", "properties.extendedProperties.annualSavingsAmount", "properties.extendedProperties.targetResourceCount", "properties.extendedProperties.HasRecommendation", "properties.extendedProperties.savingsCurrency", "properties.extendedProperties.IsInReplication", "properties.extendedProperties.Recommended_DTU", "properties.extendedProperties.Recommended_SKU", "properties.extendedProperties.ResourceGroup", "properties.extendedProperties.lookbackPeriod", "properties.extendedProperties.savingsAmount", "properties.extendedProperties.DatabaseSize", "properties.extendedProperties.DatabaseName", "properties.extendedProperties.ServerName", "properties.extendedProperties.Region", "properties.extendedProperties.displaySKU", "properties.extendedProperties.displayQty", "properties.extendedProperties.location", "properties.extendedProperties.region", "properties.extendedProperties.vmSize", "properties.extendedProperties.subId", "properties.extendedProperties.scope", "properties.extendedProperties.term", "properties.extendedProperties.sku", "properties.extendedProperties.qty", "properties.extendedProperties.commitment", "properties.extendedProperties.currentSku", "properties.extendedProperties.targetSku", "properties.extendedProperties.recommendationMessage", "properties.resourceMetadata.resourceId", "properties.resourceMetadata.singular", "properties.resourceMetadata.plural", "properties.resourceMetadata.action", "properties.resourceMetadata.source", "recommendedActions", "SortOrder" },
+ {}
+ )
+ else Source,
+ Types = Table.TransformColumnTypes(NullHandling, {
+ {"properties.extendedProperties.annualSavingsAmount", type number},
+ {"properties.extendedProperties.savingsAmount", type number},
+ {"properties.extendedProperties.qty", Int64.Type},
+ {"properties.extendedProperties.displayQty", Int64.Type},
+ {"properties.extendedProperties.targetResourceCount", Int64.Type},
+ {"SortOrder", type number},
+ {"properties.extendedProperties.ObservationPeriodStartDate", type datetimezone},
+ {"properties.extendedProperties.ObservationPeriodEndDate", type datetimezone},
+ {"properties.lastUpdated", type datetimezone}
+ }, "en-US"),
+ // Table.Combine concatenates per-batch results, so re-sort here to restore the global SortOrder ordering that the per-batch KQL "order by" only guarantees within each batch
+ Sorted = Table.Sort(Types, {{"SortOrder", Order.Ascending}})
+ in
+ Sorted
+
+ annotation PBI_NavigationStepName = Navigation
+
+ annotation PBI_ResultType = Table
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/Disks.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/Disks.tmdl
deleted file mode 120000
index e9f596dd5..000000000
--- a/src/power-bi/storage/Shared.Dataset/definition/tables/Disks.tmdl
+++ /dev/null
@@ -1 +0,0 @@
-../../../../kql/Shared.Dataset/definition/tables/Disks.tmdl
\ No newline at end of file
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/Disks.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/Disks.tmdl
new file mode 100644
index 000000000..f4ac4134a
--- /dev/null
+++ b/src/power-bi/storage/Shared.Dataset/definition/tables/Disks.tmdl
@@ -0,0 +1,222 @@
+table Disks
+ lineageTag: ca0025b1-6be2-4a29-af32-30ef5f20fe5f
+
+ column id
+ dataType: string
+ lineageTag: deeae826-f875-4504-8131-757498d8759a
+ summarizeBy: none
+ sourceColumn: id
+
+ annotation SummarizationSetBy = Automatic
+
+ column name
+ dataType: string
+ lineageTag: a5fefea2-4fe5-484f-aed7-3d13f6323531
+ summarizeBy: none
+ sourceColumn: name
+
+ annotation SummarizationSetBy = Automatic
+
+ column tenantId
+ dataType: string
+ lineageTag: 956716b4-925c-4fd7-966e-a3e3d8a8a4ce
+ summarizeBy: none
+ sourceColumn: tenantId
+
+ annotation SummarizationSetBy = Automatic
+
+ column location
+ dataType: string
+ lineageTag: e2c9aac1-398d-407d-b62f-43596f401420
+ summarizeBy: none
+ sourceColumn: location
+
+ annotation SummarizationSetBy = Automatic
+
+ column resourceGroup
+ dataType: string
+ lineageTag: d2ec8b97-974d-4273-ab54-a99d67396140
+ summarizeBy: none
+ sourceColumn: resourceGroup
+
+ annotation SummarizationSetBy = Automatic
+
+ column subscriptionId
+ dataType: string
+ lineageTag: bddb0cc5-51dd-4fd2-9bcf-16f5e4f9f18a
+ summarizeBy: none
+ sourceColumn: subscriptionId
+
+ annotation SummarizationSetBy = Automatic
+
+ column managedBy
+ dataType: string
+ lineageTag: c25abab2-269e-4428-9632-f00ff63cf033
+ summarizeBy: none
+ sourceColumn: managedBy
+
+ annotation SummarizationSetBy = Automatic
+
+ column diskType
+ dataType: string
+ lineageTag: efab8b0e-646d-4b4a-93c6-8196f1379fec
+ summarizeBy: none
+ sourceColumn: diskType
+
+ annotation SummarizationSetBy = Automatic
+
+ column osType
+ dataType: string
+ lineageTag: dc48738a-1a9b-4047-847e-88280f01b887
+ summarizeBy: none
+ sourceColumn: osType
+
+ annotation SummarizationSetBy = Automatic
+
+ column skuName
+ dataType: string
+ lineageTag: 1d86f4bd-c814-4695-a0fd-e39f041c66db
+ summarizeBy: none
+ sourceColumn: skuName
+
+ annotation SummarizationSetBy = Automatic
+
+ column skuTier
+ dataType: string
+ lineageTag: 9fb89960-0a93-4909-b914-769f7bbd092c
+ summarizeBy: none
+ sourceColumn: skuTier
+
+ annotation SummarizationSetBy = Automatic
+
+ column diskSizeGB
+ dataType: double
+ formatString: 0
+ lineageTag: a24d4618-df23-48d2-9ebb-6cf5dd5451a9
+ summarizeBy: sum
+ sourceColumn: diskSizeGB
+
+ annotation SummarizationSetBy = Automatic
+
+ annotation PBI_FormatHint = {"isDecimal":true}
+
+ column diskMBpsReadWrite
+ dataType: double
+ lineageTag: 7ae71c89-85ff-490d-9c3b-28649909da03
+ summarizeBy: sum
+ sourceColumn: diskMBpsReadWrite
+
+ annotation SummarizationSetBy = Automatic
+
+ annotation PBI_FormatHint = {"isGeneralNumber":true}
+
+ column diskIOPSReadWrite
+ dataType: double
+ lineageTag: bf7b13bf-4dd3-484e-bebb-474b1de33c37
+ summarizeBy: sum
+ sourceColumn: diskIOPSReadWrite
+
+ annotation SummarizationSetBy = Automatic
+
+ annotation PBI_FormatHint = {"isGeneralNumber":true}
+
+ column diskState
+ dataType: string
+ lineageTag: 10cfeddf-8177-4e10-8338-08dc46798f33
+ summarizeBy: none
+ sourceColumn: diskState
+
+ annotation SummarizationSetBy = Automatic
+
+ column timeCreated
+ dataType: dateTime
+ formatString: General Date
+ lineageTag: ad7f8081-08aa-4b0f-bb02-410a56035f86
+ summarizeBy: none
+ sourceColumn: timeCreated
+
+ annotation SummarizationSetBy = Automatic
+
+ column LastOwnershipUpdateTime
+ dataType: dateTime
+ formatString: General Date
+ lineageTag: f5ad6b01-68b4-44c6-9f36-c4fa24992c3e
+ summarizeBy: none
+ sourceColumn: LastOwnershipUpdateTime
+
+ annotation SummarizationSetBy = Automatic
+
+ column Redundancy
+ dataType: string
+ lineageTag: d2e0caae-a0b7-405f-924d-917dd6e8b558
+ summarizeBy: none
+ sourceColumn: Redundancy
+
+ annotation SummarizationSetBy = Automatic
+
+ column parentVM
+ dataType: string
+ lineageTag: 6a722f3e-10bb-4cd5-ba1e-71636d6c4e60
+ summarizeBy: none
+ sourceColumn: parentVM
+
+ annotation SummarizationSetBy = Automatic
+
+ partition Disks = m
+ mode: import
+ queryGroup: 'Resource Graph'
+ source =
+ let
+ query = "
+ resources
+ | where type =~ 'microsoft.compute/disks'
+ | extend id = tolower(id)
+ | extend skuName = sku.name
+ | extend skuTier = sku.tier
+ | extend timeCreated = properties.timeCreated
+ | extend diskSizeGB = properties.diskSizeGB
+ | extend diskState = properties.diskState
+ | extend LastOwnershipUpdateTime = properties.LastOwnershipUpdateTime
+ | extend diskMBpsReadWrite = properties.diskMBpsReadWrite
+ | extend diskIOPSReadWrite = properties.diskIOPSReadWrite
+ | extend osType = properties.osType
+ | extend diskType = iff(isnull(osType), 'Data disk', 'OS disk')
+ | parse kind=regex skuName with '_' Redundancy
+ | parse kind=regex managedBy with 'virtualMachines/' parentVM
+ | project
+ subscriptionId,
+ resourceGroup,
+ id,
+ name,
+ tenantId,
+ location,
+ managedBy,
+ osType,
+ skuName,
+ skuTier,
+ diskSizeGB,
+ diskMBpsReadWrite,
+ diskIOPSReadWrite,
+ diskState,
+ timeCreated,
+ LastOwnershipUpdateTime,
+ Redundancy,
+ parentVM,
+ diskType
+ ",
+ Source = ftk_QueryARG(query, 2),
+ NullHandling =
+ if Source = null then
+ #table(
+ { "id", "name", "subscriptionId", "resourceGroup", "tenantId", "location", "managedBy", "osType", "skuName", "skuTier", "diskSizeGB", "diskMBpsReadWrite", "diskIOPSReadWrite", "diskState", "timeCreated", "LastOwnershipUpdateTime", "Redundancy", "parentVM", "diskType" },
+ {}
+ )
+ else Source,
+ Types = Table.TransformColumnTypes(NullHandling,{{"diskSizeGB", type number}, {"diskMBpsReadWrite", type number}, {"diskIOPSReadWrite", type number}, {"timeCreated", type datetimezone}, {"LastOwnershipUpdateTime", type datetimezone}})
+ in
+ Types
+
+ annotation PBI_NavigationStepName = Navigation
+
+ annotation PBI_ResultType = Table
+
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/ManagementGroups.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/ManagementGroups.tmdl
deleted file mode 120000
index c71c89f67..000000000
--- a/src/power-bi/storage/Shared.Dataset/definition/tables/ManagementGroups.tmdl
+++ /dev/null
@@ -1 +0,0 @@
-../../../../kql/Shared.Dataset/definition/tables/ManagementGroups.tmdl
\ No newline at end of file
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/ManagementGroups.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/ManagementGroups.tmdl
new file mode 100644
index 000000000..a482db663
--- /dev/null
+++ b/src/power-bi/storage/Shared.Dataset/definition/tables/ManagementGroups.tmdl
@@ -0,0 +1,266 @@
+table ManagementGroups
+ lineageTag: 0e04ab5f-9838-4180-a7f3-dc1cbcb6f296
+
+ column id
+ dataType: string
+ lineageTag: 38577e5e-de2d-4ca7-a7bf-0bd1d7760f70
+ summarizeBy: none
+ sourceColumn: id
+
+ annotation SummarizationSetBy = Automatic
+
+ column name
+ dataType: string
+ lineageTag: 0fd21169-a00f-4900-9617-2b610fd5aeeb
+ summarizeBy: none
+ sourceColumn: name
+
+ annotation SummarizationSetBy = Automatic
+
+ column type
+ dataType: string
+ lineageTag: 7caac691-f03c-426f-a945-13fac8d416eb
+ summarizeBy: none
+ sourceColumn: type
+
+ annotation SummarizationSetBy = Automatic
+
+ column tenantId
+ dataType: string
+ lineageTag: 41a1123e-155c-48a8-ae42-be5c2f9a8d39
+ summarizeBy: none
+ sourceColumn: tenantId
+
+ annotation SummarizationSetBy = Automatic
+
+ column kind
+ dataType: string
+ lineageTag: fdcebd93-8ecc-42c1-ad50-b8a9545c2ff4
+ summarizeBy: none
+ sourceColumn: kind
+
+ annotation SummarizationSetBy = Automatic
+
+ column location
+ dataType: string
+ lineageTag: bd352c53-fffc-45b9-9042-ddac5d8cb7b1
+ summarizeBy: none
+ sourceColumn: location
+
+ annotation SummarizationSetBy = Automatic
+
+ column resourceGroup
+ dataType: string
+ lineageTag: 32c2cdd3-8cfb-467f-b932-bd860cdf5454
+ summarizeBy: none
+ sourceColumn: resourceGroup
+
+ annotation SummarizationSetBy = Automatic
+
+ column subscriptionId
+ dataType: string
+ lineageTag: 95c5f3c2-0cf9-40e6-93bf-70c46e61ee16
+ summarizeBy: none
+ sourceColumn: subscriptionId
+
+ annotation SummarizationSetBy = Automatic
+
+ column managedBy
+ dataType: string
+ lineageTag: b7f98133-e7a2-4b5c-80b3-f07c76116251
+ summarizeBy: none
+ sourceColumn: managedBy
+
+ annotation SummarizationSetBy = Automatic
+
+ column sku
+ dataType: string
+ lineageTag: 8a230b5a-d863-43b3-a713-31badfce6796
+ summarizeBy: none
+ sourceColumn: sku
+
+ annotation SummarizationSetBy = Automatic
+
+ column plan
+ dataType: string
+ lineageTag: c405bc3b-7b6b-45c4-93e4-06f0d3eda278
+ summarizeBy: none
+ sourceColumn: plan
+
+ annotation SummarizationSetBy = Automatic
+
+ column tags
+ dataType: string
+ lineageTag: 9084e19a-6639-447c-b365-671cd2e81486
+ summarizeBy: none
+ sourceColumn: tags
+
+ annotation SummarizationSetBy = Automatic
+
+ column identity
+ dataType: string
+ lineageTag: 5ffd94bb-922a-4e28-a475-b818e035a90f
+ summarizeBy: none
+ sourceColumn: identity
+
+ annotation SummarizationSetBy = Automatic
+
+ column zones
+ dataType: string
+ lineageTag: 843d2718-8d1a-41a2-be04-8010408f4f84
+ summarizeBy: none
+ sourceColumn: zones
+
+ annotation SummarizationSetBy = Automatic
+
+ column extendedLocation
+ dataType: string
+ lineageTag: 1536d8ca-3e8b-492f-9ebd-1760fcda0656
+ summarizeBy: none
+ sourceColumn: extendedLocation
+
+ annotation SummarizationSetBy = Automatic
+
+ column properties
+ dataType: string
+ lineageTag: 78c55e74-c4b8-40c9-83fa-5cc7ffe7ba35
+ summarizeBy: none
+ sourceColumn: properties
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.displayName'
+ dataType: string
+ lineageTag: 77376fd0-0cbd-4aea-9e27-4c85b79fac0f
+ summarizeBy: none
+ sourceColumn: properties.displayName
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.details'
+ dataType: string
+ lineageTag: b461edc9-5520-4c5a-bf67-5838f2e467b1
+ summarizeBy: none
+ sourceColumn: properties.details
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.details.managementGroupAncestorsChain'
+ dataType: string
+ lineageTag: d2fbf058-de2f-43b1-8081-eb1093ae0a97
+ summarizeBy: none
+ sourceColumn: properties.details.managementGroupAncestorsChain
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.details.updatedTime'
+ dataType: string
+ lineageTag: 6aff6f29-5cc8-4ddf-97ad-0f38672122ba
+ summarizeBy: none
+ sourceColumn: properties.details.updatedTime
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.details.updatedBy'
+ dataType: string
+ lineageTag: cbfd897b-08e8-4285-89cb-372113198db1
+ summarizeBy: none
+ sourceColumn: properties.details.updatedBy
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.details.version'
+ dataType: string
+ lineageTag: cc5c1908-4ea7-4d0e-b1f7-ae30db8c3448
+ summarizeBy: none
+ sourceColumn: properties.details.version
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.details.parent'
+ dataType: string
+ lineageTag: cdb333f1-7b73-4341-9144-c1b11091f4c9
+ summarizeBy: none
+ sourceColumn: properties.details.parent
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.details.parent.displayName'
+ dataType: string
+ lineageTag: 59269895-6d89-46b2-8b3c-b2f12cdb5128
+ summarizeBy: none
+ sourceColumn: properties.details.parent.displayName
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.details.parent.name'
+ dataType: string
+ lineageTag: 427c73d7-9a51-41c4-ac4d-6027908b59f5
+ summarizeBy: none
+ sourceColumn: properties.details.parent.name
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.details.parent.id'
+ dataType: string
+ lineageTag: c684c947-b504-4f61-b713-0a9f5a763ed1
+ summarizeBy: none
+ sourceColumn: properties.details.parent.id
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.details.managementGroupAncestorsChain.displayName'
+ dataType: string
+ lineageTag: e5da0404-bcf9-4993-b287-a25549381c42
+ summarizeBy: none
+ sourceColumn: properties.details.managementGroupAncestorsChain.displayName
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.details.managementGroupAncestorsChain.name'
+ dataType: string
+ lineageTag: a832ce75-93eb-449c-a0f3-0d929a03bbc2
+ summarizeBy: none
+ sourceColumn: properties.details.managementGroupAncestorsChain.name
+
+ annotation SummarizationSetBy = Automatic
+
+ partition ManagementGroups = m
+ mode: import
+ queryGroup: 'Resource Graph'
+ source =
+ let
+ query = "
+ resourcecontainers
+ | where type == 'microsoft.management/managementgroups'
+ | extend
+ ['properties.displayName'] = properties.displayName,
+ ['properties.details'] = properties.details,
+ ['properties.details.managementGroupAncestorsChain'] = properties.details.managementGroupAncestorsChain,
+ ['properties.details.updatedTime'] = properties.details.updatedTime,
+ ['properties.details.updatedBy'] = properties.details.updatedBy,
+ ['properties.details.version'] = properties.details.version,
+ ['properties.details.parent'] = properties.details.parent,
+ ['properties.details.parent.displayName'] = properties.details.parent.displayName,
+ ['properties.details.parent.name'] = properties.details.parent.name,
+ ['properties.details.parent.id'] = properties.details.parent.id
+ | mv-expand ['properties.details.managementGroupAncestorsChain']
+ | extend
+ ['properties.details.managementGroupAncestorsChain.displayName'] = properties.details.managementGroupAncestorsChain.displayName,
+ ['properties.details.managementGroupAncestorsChain.name'] = properties.details.managementGroupAncestorsChain.name
+ " & (if ftk_DemoFilter() = "" then "" else "| where name startswith 'Trey'"),
+ Source = AzureResourceGraph.Query(query, "Tenant", null, null, [resultTruncated = false]),
+ NullHandling =
+ if Table.HasColumns(Source, "Results") and Table.RowCount(Source) = 1 then
+ #table(
+ { "id", "name", "properties.displayName", "properties.details", "properties.details.managementGroupAncestorsChain", "properties.details.updatedTime", "properties.details.updatedBy", "properties.details.version", "properties.details.parent", "properties.details.parent.displayName", "properties.details.parent.name", "properties.details.parent.id", "properties.details.managementGroupAncestorsChain.displayName", "properties.details.managementGroupAncestorsChain.name" },
+ {}
+ )
+ else Source
+ in
+ NullHandling
+
+ annotation PBI_NavigationStepName = Navigation
+
+ annotation PBI_ResultType = Table
+
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/NetworkInterfaces.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/NetworkInterfaces.tmdl
deleted file mode 120000
index 8607c17a7..000000000
--- a/src/power-bi/storage/Shared.Dataset/definition/tables/NetworkInterfaces.tmdl
+++ /dev/null
@@ -1 +0,0 @@
-../../../../kql/Shared.Dataset/definition/tables/NetworkInterfaces.tmdl
\ No newline at end of file
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/NetworkInterfaces.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/NetworkInterfaces.tmdl
new file mode 100644
index 000000000..3e5770345
--- /dev/null
+++ b/src/power-bi/storage/Shared.Dataset/definition/tables/NetworkInterfaces.tmdl
@@ -0,0 +1,455 @@
+table NetworkInterfaces
+ lineageTag: 471a2007-5388-404a-97e6-1b2292878a8c
+
+ column id
+ dataType: string
+ lineageTag: 350304ea-658e-45c9-b91f-9a5c4e9e4e5e
+ summarizeBy: none
+ sourceColumn: id
+
+ annotation SummarizationSetBy = Automatic
+
+ column name
+ dataType: string
+ lineageTag: 4de0f771-a5db-454d-8359-25ac021b7c34
+ summarizeBy: none
+ sourceColumn: name
+
+ annotation SummarizationSetBy = Automatic
+
+ column type
+ dataType: string
+ lineageTag: 30277976-2075-47bf-88d6-316004a703ef
+ summarizeBy: none
+ sourceColumn: type
+
+ annotation SummarizationSetBy = Automatic
+
+ column tenantId
+ dataType: string
+ lineageTag: e19c378f-5a30-4891-94a5-9433d5063a05
+ summarizeBy: none
+ sourceColumn: tenantId
+
+ annotation SummarizationSetBy = Automatic
+
+ column kind
+ dataType: string
+ lineageTag: 129a13b3-51f2-4efa-92ac-83ec9da54ac3
+ summarizeBy: none
+ sourceColumn: kind
+
+ annotation SummarizationSetBy = Automatic
+
+ column location
+ dataType: string
+ lineageTag: 859d2a47-f779-4202-8342-d4e9868d8577
+ summarizeBy: none
+ sourceColumn: location
+
+ annotation SummarizationSetBy = Automatic
+
+ column resourceGroup
+ dataType: string
+ lineageTag: 87326b2b-3574-4489-a376-efb4a97c6f1c
+ summarizeBy: none
+ sourceColumn: resourceGroup
+
+ annotation SummarizationSetBy = Automatic
+
+ column subscriptionId
+ dataType: string
+ lineageTag: 33e52a92-a847-4919-a23a-4c93a0932e1c
+ summarizeBy: none
+ sourceColumn: subscriptionId
+
+ annotation SummarizationSetBy = Automatic
+
+ column managedBy
+ dataType: string
+ lineageTag: dd7f082f-7e83-4270-af76-194e5c1feb8e
+ summarizeBy: none
+ sourceColumn: managedBy
+
+ annotation SummarizationSetBy = Automatic
+
+ column sku
+ dataType: string
+ lineageTag: 3e15e566-bff8-4a36-91ec-e506030024ec
+ summarizeBy: none
+ sourceColumn: sku
+
+ annotation SummarizationSetBy = Automatic
+
+ column plan
+ dataType: string
+ lineageTag: 7627e490-3357-4dd3-9c87-dd788bba3447
+ summarizeBy: none
+ sourceColumn: plan
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.provisioningState'
+ dataType: string
+ lineageTag: a914b230-a579-49f5-8d62-30f53d413472
+ summarizeBy: none
+ sourceColumn: properties.provisioningState
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.resourceGuid'
+ dataType: string
+ lineageTag: f45d5cde-7c8c-4569-912f-9c5e231564d8
+ summarizeBy: none
+ sourceColumn: properties.resourceGuid
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.enableAcceleratedNetworking'
+ dataType: string
+ lineageTag: a1b2c147-76f7-4804-8957-16d7f697ff99
+ summarizeBy: none
+ sourceColumn: properties.enableAcceleratedNetworking
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.disableTcpStateTracking'
+ dataType: string
+ lineageTag: b5d561af-b683-4af3-87fc-f7566cc5f8f9
+ summarizeBy: none
+ sourceColumn: properties.disableTcpStateTracking
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.vnetEncryptionSupported'
+ dataType: string
+ lineageTag: 415ce3bd-0646-4e4a-b38a-fc9a45800ef9
+ summarizeBy: none
+ sourceColumn: properties.vnetEncryptionSupported
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.networkSecurityGroup.id'
+ dataType: string
+ lineageTag: 54e23578-a933-447d-a1db-f96c9089063d
+ summarizeBy: none
+ sourceColumn: properties.networkSecurityGroup.id
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.ipConfigurations.type'
+ dataType: string
+ lineageTag: 414395a3-c718-4bc4-ac73-606db3b02953
+ summarizeBy: none
+ sourceColumn: properties.ipConfigurations.type
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.ipConfigurations.name'
+ dataType: string
+ lineageTag: 9dce3e2f-9097-4437-a16e-d5f79f3d75a9
+ summarizeBy: none
+ sourceColumn: properties.ipConfigurations.name
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.ipConfigurations.properties.provisioningState'
+ dataType: string
+ lineageTag: 59df08a7-16e3-4ae1-9ceb-8b0370af6dbd
+ summarizeBy: none
+ sourceColumn: properties.ipConfigurations.properties.provisioningState
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.ipConfigurations.properties.privateIPAddressVersion'
+ dataType: string
+ lineageTag: 73c9a30f-9d7d-40f3-b25c-469ba0479e72
+ summarizeBy: none
+ sourceColumn: properties.ipConfigurations.properties.privateIPAddressVersion
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.ipConfigurations.properties.privateIPAllocationMethod'
+ dataType: string
+ lineageTag: b76aad6e-6023-4164-8a57-a70456ed9f03
+ summarizeBy: none
+ sourceColumn: properties.ipConfigurations.properties.privateIPAllocationMethod
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.ipConfigurations.properties.subnet'
+ dataType: string
+ lineageTag: 80ef1a4a-cf6e-48fc-afc4-181e61360d1d
+ summarizeBy: none
+ sourceColumn: properties.ipConfigurations.properties.subnet
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.ipConfigurations.properties.privateIPAddress'
+ dataType: string
+ lineageTag: 8c504c90-132f-4223-a0ad-a4348a5ee790
+ summarizeBy: none
+ sourceColumn: properties.ipConfigurations.properties.privateIPAddress
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.ipConfigurations.properties.primary'
+ dataType: string
+ lineageTag: a9cbfce3-bbdf-4db6-bbb1-d16afbc57117
+ summarizeBy: none
+ sourceColumn: properties.ipConfigurations.properties.primary
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.ipConfigurations.properties.publicIPAddress.id'
+ dataType: string
+ lineageTag: 26bdae49-b2c1-4acc-908b-6bc01631c134
+ summarizeBy: none
+ sourceColumn: properties.ipConfigurations.properties.publicIPAddress.id
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.ipConfigurations.id'
+ dataType: string
+ lineageTag: 3c77c9cd-7a20-43f1-ad5f-4f57755e0f79
+ summarizeBy: none
+ sourceColumn: properties.ipConfigurations.id
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.ipConfigurations.etag'
+ dataType: string
+ lineageTag: 95127943-55d6-4d40-9386-2bde61c45455
+ summarizeBy: none
+ sourceColumn: properties.ipConfigurations.etag
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.enableIPForwarding'
+ dataType: string
+ lineageTag: 8c870b92-2431-48ed-a4e3-8adc3977625a
+ summarizeBy: none
+ sourceColumn: properties.enableIPForwarding
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.tapConfigurations'
+ dataType: string
+ lineageTag: 23417d1a-820a-4832-94a8-fa7097c30863
+ summarizeBy: none
+ sourceColumn: properties.tapConfigurations
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.hostedWorkloads'
+ dataType: string
+ lineageTag: 69ad895c-4bb9-4f98-8da3-6c0b8a00d4f0
+ summarizeBy: none
+ sourceColumn: properties.hostedWorkloads
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.allowPort25Out'
+ dataType: string
+ lineageTag: e9b92dd1-0da9-4db1-82db-1437b06af481
+ summarizeBy: none
+ sourceColumn: properties.allowPort25Out
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.auxiliaryMode'
+ dataType: string
+ lineageTag: b3a8fb34-de86-48b2-bcc2-4602912fa4ac
+ summarizeBy: none
+ sourceColumn: properties.auxiliaryMode
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.dnsSettings'
+ dataType: string
+ lineageTag: 02f4ca50-b2c4-4c58-9349-dbc5f64cff51
+ summarizeBy: none
+ sourceColumn: properties.dnsSettings
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.auxiliarySku'
+ dataType: string
+ lineageTag: 2b2a9e20-1b30-47e7-b827-de2d05b60924
+ summarizeBy: none
+ sourceColumn: properties.auxiliarySku
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.macAddress'
+ dataType: string
+ lineageTag: ad7b0e74-c32a-46be-9b70-707bfc821aa1
+ summarizeBy: none
+ sourceColumn: properties.macAddress
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.nicType'
+ dataType: string
+ lineageTag: b80d3831-5768-43c2-96a8-b9c7e02cb784
+ summarizeBy: none
+ sourceColumn: properties.nicType
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.primary'
+ dataType: string
+ lineageTag: 17232334-69c8-41d2-8f26-2c29dbba06a3
+ summarizeBy: none
+ sourceColumn: properties.primary
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.virtualMachine.id'
+ dataType: string
+ lineageTag: 04875637-be0f-43c8-8cef-9c1acc492ffc
+ summarizeBy: none
+ sourceColumn: properties.virtualMachine.id
+
+ annotation SummarizationSetBy = Automatic
+
+ column tags
+ dataType: string
+ lineageTag: cc6805a2-9531-49b5-96ed-35f7c18cc7ee
+ summarizeBy: none
+ sourceColumn: tags
+
+ annotation SummarizationSetBy = Automatic
+
+ column identity
+ dataType: string
+ lineageTag: 6d99fdf1-5301-4413-b799-668280d8e5b1
+ summarizeBy: none
+ sourceColumn: identity
+
+ annotation SummarizationSetBy = Automatic
+
+ column zones
+ dataType: string
+ lineageTag: f6053c64-a2a2-432f-a449-8838e8b587ac
+ summarizeBy: none
+ sourceColumn: zones
+
+ annotation SummarizationSetBy = Automatic
+
+ column extendedLocation
+ dataType: string
+ lineageTag: ad7aa309-2b05-442e-b919-32029e0770ff
+ summarizeBy: none
+ sourceColumn: extendedLocation
+
+ annotation SummarizationSetBy = Automatic
+
+ column properties
+ dataType: string
+ lineageTag: 49dc4b9c-259a-456b-acf0-90105d789c00
+ summarizeBy: none
+ sourceColumn: properties
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.networkSecurityGroup'
+ dataType: string
+ lineageTag: d8fdde05-77b3-458f-930f-7a70790d889d
+ summarizeBy: none
+ sourceColumn: properties.networkSecurityGroup
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.ipConfigurations'
+ dataType: string
+ lineageTag: 2802adc4-809b-4610-ab8b-538298983258
+ summarizeBy: none
+ sourceColumn: properties.ipConfigurations
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.virtualMachine'
+ dataType: string
+ lineageTag: f49a5008-662e-4c89-bf6e-deff893045ec
+ summarizeBy: none
+ sourceColumn: properties.virtualMachine
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.ipConfigurations.properties'
+ dataType: string
+ lineageTag: f0c5d156-6fc2-4b32-a55d-2255a2b9945f
+ summarizeBy: none
+ sourceColumn: properties.ipConfigurations.properties
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.ipConfigurations.properties.publicIPAddress'
+ dataType: string
+ lineageTag: 773f8dc4-0e6f-42da-afba-bcfbdbee8d88
+ summarizeBy: none
+ sourceColumn: properties.ipConfigurations.properties.publicIPAddress
+
+ annotation SummarizationSetBy = Automatic
+
+ partition NetworkInterfaces = m
+ mode: import
+ queryGroup: 'Resource Graph'
+ source =
+ let
+ query = "
+ Resources
+ | where type =~ 'microsoft.network/networkinterfaces'
+ | extend
+ ['properties.provisioningState'] = properties.provisioningState,
+ ['properties.resourceGuid'] = properties.resourceGuid,
+ ['properties.enableAcceleratedNetworking'] = properties.enableAcceleratedNetworking,
+ ['properties.disableTcpStateTracking'] = properties.disableTcpStateTracking,
+ ['properties.vnetEncryptionSupported'] = properties.vnetEncryptionSupported,
+ ['properties.networkSecurityGroup'] = properties.networkSecurityGroup,
+ ['properties.ipConfigurations'] = properties.ipConfigurations,
+ ['properties.enableIPForwarding'] = properties.enableIPForwarding,
+ ['properties.tapConfigurations'] = properties.tapConfigurations,
+ ['properties.hostedWorkloads'] = properties.hostedWorkloads,
+ ['properties.allowPort25Out'] = properties.allowPort25Out,
+ ['properties.auxiliaryMode'] = properties.auxiliaryMode,
+ ['properties.dnsSettings'] = properties.dnsSettings,
+ ['properties.auxiliarySku'] = properties.auxiliarySku,
+ ['properties.macAddress'] = properties.macAddress,
+ ['properties.nicType'] = properties.nicType,
+ ['properties.primary'] = properties.primary,
+ ['properties.virtualMachine'] = properties.virtualMachine,
+ ['properties.virtualMachine.id'] = properties.virtualMachine.id
+ | mv-expand ['properties.ipConfigurations']
+ | extend
+ ['properties.ipConfigurations.type'] = properties.ipConfigurations.type,
+ ['properties.ipConfigurations.name'] = properties.ipConfigurations.name,
+ ['properties.ipConfigurations.properties'] = properties.ipConfigurations.properties,
+ ['properties.ipConfigurations.id'] = properties.ipConfigurations.id,
+ ['properties.ipConfigurations.etag'] = properties.ipConfigurations.etag,
+ ['properties.ipConfigurations.properties.provisioningState'] = properties.ipConfigurations.properties.provisioningState,
+ ['properties.ipConfigurations.properties.privateIPAddressVersion'] = properties.ipConfigurations.properties.privateIPAddressVersion,
+ ['properties.ipConfigurations.properties.privateIPAllocationMethod'] = properties.ipConfigurations.properties.privateIPAllocationMethod,
+ ['properties.ipConfigurations.properties.subnet'] = properties.ipConfigurations.properties.subnet,
+ ['properties.ipConfigurations.properties.privateIPAddress'] = properties.ipConfigurations.properties.privateIPAddress,
+ ['properties.ipConfigurations.properties.primary'] = properties.ipConfigurations.properties.primary,
+ ['properties.ipConfigurations.properties.publicIPAddress'] = properties.ipConfigurations.properties.publicIPAddress,
+ ['properties.ipConfigurations.properties.publicIPAddress.id'] = properties.ipConfigurations.properties.publicIPAddress.id,
+ ['properties.networkSecurityGroup.id'] = properties.networkSecurityGroup.id
+ ",
+ Source = ftk_QueryARG(query, 2),
+ NullHandling =
+ if Source = null then
+ #table(
+ { "id", "name", "location", "resourceGroup", "properties.provisioningState", "properties.resourceGuid", "properties.enableAcceleratedNetworking", "properties.disableTcpStateTracking", "properties.vnetEncryptionSupported", "properties.networkSecurityGroup", "properties.ipConfigurations", "properties.enableIPForwarding", "properties.tapConfigurations", "properties.hostedWorkloads", "properties.allowPort25Out", "properties.auxiliaryMode", "properties.dnsSettings", "properties.auxiliarySku", "properties.macAddress", "properties.nicType", "properties.primary", "properties.virtualMachine", "properties.virtualMachine.id", "properties.ipConfigurations.type", "properties.ipConfigurations.name", "properties.ipConfigurations.properties", "properties.ipConfigurations.id", "properties.ipConfigurations.etag", "properties.ipConfigurations.properties.provisioningState", "properties.ipConfigurations.properties.privateIPAddressVersion", "properties.ipConfigurations.properties.privateIPAllocationMethod", "properties.ipConfigurations.properties.subnet", "properties.ipConfigurations.properties.privateIPAddress", "properties.ipConfigurations.properties.primary", "properties.ipConfigurations.properties.publicIPAddress", "properties.ipConfigurations.properties.publicIPAddress.id", "properties.networkSecurityGroup.id" },
+ {}
+ )
+ else Source
+ in
+ NullHandling
+
+ annotation PBI_NavigationStepName = Navigation
+
+ annotation PBI_ResultType = Table
+
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/NetworkSecurityGroups.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/NetworkSecurityGroups.tmdl
deleted file mode 120000
index 7eb7d8f75..000000000
--- a/src/power-bi/storage/Shared.Dataset/definition/tables/NetworkSecurityGroups.tmdl
+++ /dev/null
@@ -1 +0,0 @@
-../../../../kql/Shared.Dataset/definition/tables/NetworkSecurityGroups.tmdl
\ No newline at end of file
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/NetworkSecurityGroups.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/NetworkSecurityGroups.tmdl
new file mode 100644
index 000000000..98e115ddf
--- /dev/null
+++ b/src/power-bi/storage/Shared.Dataset/definition/tables/NetworkSecurityGroups.tmdl
@@ -0,0 +1,345 @@
+table NetworkSecurityGroups
+ lineageTag: 7d98f967-9180-4a4f-958a-89256520af0f
+
+ column id
+ dataType: string
+ lineageTag: f482c1e4-d36d-47dd-ab46-ab41d9e651ae
+ summarizeBy: none
+ sourceColumn: id
+
+ annotation SummarizationSetBy = Automatic
+
+ column name
+ dataType: string
+ lineageTag: dbe15cec-f5b3-4c38-8688-b1dc486c42d9
+ summarizeBy: none
+ sourceColumn: name
+
+ annotation SummarizationSetBy = Automatic
+
+ column type
+ dataType: string
+ lineageTag: 5f4b1e88-2765-4e77-adb4-cfc36d46993a
+ summarizeBy: none
+ sourceColumn: type
+
+ annotation SummarizationSetBy = Automatic
+
+ column tenantId
+ dataType: string
+ lineageTag: 72c91362-41b8-4bc4-8c8a-203ed8678806
+ summarizeBy: none
+ sourceColumn: tenantId
+
+ annotation SummarizationSetBy = Automatic
+
+ column kind
+ dataType: string
+ lineageTag: 54ccea47-564a-482a-811a-a087edbe78c6
+ summarizeBy: none
+ sourceColumn: kind
+
+ annotation SummarizationSetBy = Automatic
+
+ column location
+ dataType: string
+ lineageTag: 8043bb49-8a98-4a22-85be-655e135f6f79
+ summarizeBy: none
+ sourceColumn: location
+
+ annotation SummarizationSetBy = Automatic
+
+ column resourceGroup
+ dataType: string
+ lineageTag: 1099ad85-7cc4-4dd6-9a20-ee04cf0187db
+ summarizeBy: none
+ sourceColumn: resourceGroup
+
+ annotation SummarizationSetBy = Automatic
+
+ column subscriptionId
+ dataType: string
+ lineageTag: 0e6a56c5-6e87-498a-ba54-d0eee60d4494
+ summarizeBy: none
+ sourceColumn: subscriptionId
+
+ annotation SummarizationSetBy = Automatic
+
+ column managedBy
+ dataType: string
+ lineageTag: b6c809eb-78b5-4c85-9126-92c3b404242d
+ summarizeBy: none
+ sourceColumn: managedBy
+
+ annotation SummarizationSetBy = Automatic
+
+ column sku
+ dataType: string
+ lineageTag: d97c5705-4579-4d8d-be6a-17261fd6ff0e
+ summarizeBy: none
+ sourceColumn: sku
+
+ annotation SummarizationSetBy = Automatic
+
+ column plan
+ dataType: string
+ lineageTag: b8c418c7-6526-4106-8541-8c529b94f33d
+ summarizeBy: none
+ sourceColumn: plan
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.resourceGuid'
+ dataType: string
+ lineageTag: eff5cb67-bada-4826-adc8-4b2a10f81ddc
+ summarizeBy: none
+ sourceColumn: properties.resourceGuid
+
+ annotation SummarizationSetBy = Automatic
+
+ column tags
+ dataType: string
+ lineageTag: 3a4b6011-036a-43b2-b00a-0dde8213c493
+ summarizeBy: none
+ sourceColumn: tags
+
+ annotation SummarizationSetBy = Automatic
+
+ column identity
+ dataType: string
+ lineageTag: 2850f8aa-e401-404a-accb-70ea7e7f411d
+ summarizeBy: none
+ sourceColumn: identity
+
+ annotation SummarizationSetBy = Automatic
+
+ column zones
+ dataType: string
+ lineageTag: 6bc69d6e-9632-4bd0-b190-3ce481d89224
+ summarizeBy: none
+ sourceColumn: zones
+
+ annotation SummarizationSetBy = Automatic
+
+ column extendedLocation
+ dataType: string
+ lineageTag: b339f020-364d-4510-b227-7715a48353fa
+ summarizeBy: none
+ sourceColumn: extendedLocation
+
+ annotation SummarizationSetBy = Automatic
+
+ column isWarning = ```
+ IF('NetworkSecurityGroups'[properties.securityRules.properties.access]="Allow",
+ SWITCH(
+ 'NetworkSecurityGroups'[properties.securityRules.properties.destinationPortRange],
+ "80", "True",
+ "22", "True",
+ "3389", "True",
+ "False"
+ ), "False"
+ )
+ ```
+ lineageTag: 5fb590a3-057d-487e-af26-3e6686be93fe
+ summarizeBy: none
+
+ annotation SummarizationSetBy = Automatic
+
+ column properties
+ dataType: string
+ lineageTag: 3210063e-4d1f-4710-99a1-0bddda8feae2
+ summarizeBy: none
+ sourceColumn: properties
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.securityRules'
+ dataType: string
+ lineageTag: 43a82151-c0ed-4e50-9fb3-36ff0171e4fb
+ summarizeBy: none
+ sourceColumn: properties.securityRules
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.securityRules.name'
+ dataType: string
+ lineageTag: 6b1e0e16-ccd1-46da-b6bc-02fc95c0b2cf
+ summarizeBy: none
+ sourceColumn: properties.securityRules.name
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.securityRules.id'
+ dataType: string
+ lineageTag: dc86cb83-2007-47bb-9cc1-ed57b2086dab
+ summarizeBy: none
+ sourceColumn: properties.securityRules.id
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.securityRules.properties.destinationAddressPrefix'
+ dataType: string
+ lineageTag: c45d909d-f65e-4bd2-93e5-5910b763f8de
+ summarizeBy: none
+ sourceColumn: properties.securityRules.properties.destinationAddressPrefix
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.securityRules.properties.sourceAddressPrefix'
+ dataType: string
+ lineageTag: 450edaa7-42f1-4038-8901-1b550cc1aab8
+ summarizeBy: none
+ sourceColumn: properties.securityRules.properties.sourceAddressPrefix
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.securityRules.properties.destinationPortRange'
+ dataType: string
+ lineageTag: 79ec3e7b-2b36-4ce7-ada9-f659d4964a63
+ summarizeBy: none
+ sourceColumn: properties.securityRules.properties.destinationPortRange
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.securityRules.properties.sourcePortRange'
+ dataType: string
+ lineageTag: b8ab66e9-6594-4835-8771-dd1f25fe111d
+ summarizeBy: none
+ sourceColumn: properties.securityRules.properties.sourcePortRange
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.securityRules.properties.protocol'
+ dataType: string
+ lineageTag: 327de031-a53a-452f-9814-ecefaabd17fe
+ summarizeBy: none
+ sourceColumn: properties.securityRules.properties.protocol
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.securityRules.properties.direction'
+ dataType: string
+ lineageTag: e78f376a-1c3e-47e0-8120-d78061f64cfe
+ summarizeBy: none
+ sourceColumn: properties.securityRules.properties.direction
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.securityRules.properties.priority'
+ dataType: string
+ lineageTag: a9257dd6-aa47-45e4-acaa-6e68a1111f01
+ summarizeBy: none
+ sourceColumn: properties.securityRules.properties.priority
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.securityRules.properties.access'
+ dataType: string
+ lineageTag: 9ae417f5-791a-4903-9308-5b211d3b1f27
+ summarizeBy: none
+ sourceColumn: properties.securityRules.properties.access
+
+ annotation SummarizationSetBy = Automatic
+
+ partition NetworkSecurityGroups = m
+ mode: import
+ queryGroup: 'Resource Graph'
+ source =
+ let
+ query = "
+ resources
+ | where type =~ 'microsoft.network/networksecuritygroups'
+ | extend
+ ['properties.resourceGuid'] = properties.resourceGuid,
+ ['properties.securityRules'] = properties.securityRules
+ | mv-expand ['properties.securityRules']
+ | extend
+ ['properties.securityRules.name'] = properties.securityRules.name,
+ ['properties.securityRules.id'] = properties.securityRules.id,
+ ['properties.securityRules.properties.destinationAddressPrefix'] = properties.securityRules.properties.destinationAddressPrefix,
+ ['properties.securityRules.properties.sourceAddressPrefix'] = properties.securityRules.properties.sourceAddressPrefix,
+ ['properties.securityRules.properties.destinationPortRange'] = properties.securityRules.properties.destinationPortRange,
+ ['properties.securityRules.properties.sourcePortRange'] = properties.securityRules.properties.sourcePortRange,
+ ['properties.securityRules.properties.protocol'] = properties.securityRules.properties.protocol,
+ ['properties.securityRules.properties.direction'] = properties.securityRules.properties.direction,
+ ['properties.securityRules.properties.priority'] = properties.securityRules.properties.priority,
+ ['properties.securityRules.properties.access'] = properties.securityRules.properties.access
+ ",
+ Source = ftk_QueryARG(query),
+ NullHandling =
+ if Source = null then
+ #table(
+ { "id", "name", "location", "resourceGroup", "properties.resourceGuid", "properties.securityRules", "properties.securityRules.name", "properties.securityRules.id", "properties.securityRules.properties.destinationAddressPrefix", "properties.securityRules.properties.sourceAddressPrefix", "properties.securityRules.properties.destinationPortRange", "properties.securityRules.properties.sourcePortRange", "properties.securityRules.properties.protocol", "properties.securityRules.properties.direction", "properties.securityRules.properties.priority", "properties.securityRules.properties.access" },
+ {}
+ )
+ else Source
+ in
+ NullHandling
+
+
+ // Full query
+ // resources
+ // | where type =~ 'microsoft.network/networksecuritygroups'
+ // | extend
+ // ['properties.provisioningState'] = properties.provisioningState,
+ // ['properties.networkInterfaces'] = properties.networkInterfaces,
+ // ['properties.resourceGuid'] = properties.resourceGuid,
+ // ['properties.defaultSecurityRules'] = properties.defaultSecurityRules,
+ // ['properties.securityRules'] = properties.securityRules
+ // | mv-expand ['properties.networkInterfaces']
+ // | extend
+ // ['properties.networkInterfaces.id'] = properties.networkInterfaces.id
+ // | mv-expand ['properties.defaultSecurityRules']
+ // | extend
+ // ['properties.defaultSecurityRules.type'] = properties.defaultSecurityRules.type,
+ // ['properties.defaultSecurityRules.properties'] = properties.defaultSecurityRules.properties,
+ // ['properties.defaultSecurityRules.name'] = properties.defaultSecurityRules.name,
+ // ['properties.defaultSecurityRules.id'] = properties.defaultSecurityRules.id,
+ // ['properties.defaultSecurityRules.etag'] = properties.defaultSecurityRules.etag,
+ // ['properties.defaultSecurityRules.properties.provisioningState'] = properties.defaultSecurityRules.properties.provisioningState,
+ // ['properties.defaultSecurityRules.properties.destinationAddressPrefixes'] = properties.defaultSecurityRules.properties.destinationAddressPrefixes,
+ // ['properties.defaultSecurityRules.properties.destinationAddressPrefix'] = properties.defaultSecurityRules.properties.destinationAddressPrefix,
+ // ['properties.defaultSecurityRules.properties.destinationPortRanges'] = properties.defaultSecurityRules.properties.destinationPortRanges,
+ // ['properties.defaultSecurityRules.properties.sourceAddressPrefixes'] = properties.defaultSecurityRules.properties.sourceAddressPrefixes,
+ // ['properties.defaultSecurityRules.properties.sourceAddressPrefix'] = properties.defaultSecurityRules.properties.sourceAddressPrefix,
+ // ['properties.defaultSecurityRules.properties.destinationPortRange'] = properties.defaultSecurityRules.properties.destinationPortRange,
+ // ['properties.defaultSecurityRules.properties.sourcePortRanges'] = properties.defaultSecurityRules.properties.sourcePortRanges,
+ // ['properties.defaultSecurityRules.properties.sourcePortRange'] = properties.defaultSecurityRules.properties.sourcePortRange,
+ // ['properties.defaultSecurityRules.properties.description'] = properties.defaultSecurityRules.properties.description,
+ // ['properties.defaultSecurityRules.properties.protocol'] = properties.defaultSecurityRules.properties.protocol,
+ // ['properties.defaultSecurityRules.properties.direction'] = properties.defaultSecurityRules.properties.direction,
+ // ['properties.defaultSecurityRules.properties.priority'] = properties.defaultSecurityRules.properties.priority,
+ // ['properties.defaultSecurityRules.properties.access'] = properties.defaultSecurityRules.properties.access
+ // | mv-expand ['properties.defaultSecurityRules.properties.destinationAddressPrefixes']
+ // | mv-expand ['properties.defaultSecurityRules.properties.destinationPortRanges']
+ // | mv-expand ['properties.defaultSecurityRules.properties.sourceAddressPrefixes']
+ // | mv-expand ['properties.defaultSecurityRules.properties.sourcePortRanges']
+ // | mv-expand ['properties.securityRules']
+ // | extend
+ // ['properties.securityRules.type'] = properties.securityRules.type,
+ // ['properties.securityRules.properties'] = properties.securityRules.properties,
+ // ['properties.securityRules.name'] = properties.securityRules.name,
+ // ['properties.securityRules.id'] = properties.securityRules.id,
+ // ['properties.securityRules.etag'] = properties.securityRules.etag,
+ // ['properties.securityRules.properties.provisioningState'] = properties.securityRules.properties.provisioningState,
+ // ['properties.securityRules.properties.destinationAddressPrefixes'] = properties.securityRules.properties.destinationAddressPrefixes,
+ // ['properties.securityRules.properties.destinationAddressPrefix'] = properties.securityRules.properties.destinationAddressPrefix,
+ // ['properties.securityRules.properties.destinationPortRanges'] = properties.securityRules.properties.destinationPortRanges,
+ // ['properties.securityRules.properties.sourceAddressPrefixes'] = properties.securityRules.properties.sourceAddressPrefixes,
+ // ['properties.securityRules.properties.sourceAddressPrefix'] = properties.securityRules.properties.sourceAddressPrefix,
+ // ['properties.securityRules.properties.destinationPortRange'] = properties.securityRules.properties.destinationPortRange,
+ // ['properties.securityRules.properties.sourcePortRanges'] = properties.securityRules.properties.sourcePortRanges,
+ // ['properties.securityRules.properties.sourcePortRange'] = properties.securityRules.properties.sourcePortRange,
+ // ['properties.securityRules.properties.protocol'] = properties.securityRules.properties.protocol,
+ // ['properties.securityRules.properties.direction'] = properties.securityRules.properties.direction,
+ // ['properties.securityRules.properties.priority'] = properties.securityRules.properties.priority,
+ // ['properties.securityRules.properties.access'] = properties.securityRules.properties.access
+ // | mv-expand ['properties.securityRules.properties.destinationAddressPrefixes']
+ // | mv-expand ['properties.securityRules.properties.destinationPortRanges']
+ // | mv-expand ['properties.securityRules.properties.sourceAddressPrefixes']
+ // | mv-expand ['properties.securityRules.properties.sourcePortRanges']
+
+ annotation PBI_NavigationStepName = Navigation
+
+ annotation PBI_ResultType = Table
+
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/PolicyAssignments.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/PolicyAssignments.tmdl
deleted file mode 120000
index b745e0ec1..000000000
--- a/src/power-bi/storage/Shared.Dataset/definition/tables/PolicyAssignments.tmdl
+++ /dev/null
@@ -1 +0,0 @@
-../../../../kql/Shared.Dataset/definition/tables/PolicyAssignments.tmdl
\ No newline at end of file
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/PolicyAssignments.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/PolicyAssignments.tmdl
new file mode 100644
index 000000000..04b50544e
--- /dev/null
+++ b/src/power-bi/storage/Shared.Dataset/definition/tables/PolicyAssignments.tmdl
@@ -0,0 +1,419 @@
+table PolicyAssignments
+ lineageTag: fc42feb2-59a9-44bf-8459-e2c1592a05dd
+
+ column id
+ dataType: string
+ lineageTag: 1d348226-a506-40a1-8192-5ec485e0af9e
+ summarizeBy: none
+ sourceColumn: id
+
+ annotation SummarizationSetBy = Automatic
+
+ column name
+ dataType: string
+ lineageTag: ff261d9a-3eef-498a-8636-ff52bf63770c
+ summarizeBy: none
+ sourceColumn: name
+
+ annotation SummarizationSetBy = Automatic
+
+ column type
+ dataType: string
+ lineageTag: 2b822050-6e77-4075-bb0f-f2d6cf69f24c
+ summarizeBy: none
+ sourceColumn: type
+
+ annotation SummarizationSetBy = Automatic
+
+ column tenantId
+ dataType: string
+ lineageTag: 547923f6-9b9b-42ee-a3fe-60febb512248
+ summarizeBy: none
+ sourceColumn: tenantId
+
+ annotation SummarizationSetBy = Automatic
+
+ column kind
+ dataType: string
+ lineageTag: dab047e3-031a-4d30-a307-f887aaf4d632
+ summarizeBy: none
+ sourceColumn: kind
+
+ annotation SummarizationSetBy = Automatic
+
+ column location
+ dataType: string
+ lineageTag: 9227d34e-58ec-4453-876c-fd3963258fa8
+ summarizeBy: none
+ sourceColumn: location
+
+ annotation SummarizationSetBy = Automatic
+
+ column resourceGroup
+ dataType: string
+ lineageTag: eb28befe-6be2-42a5-a00d-b864d26892f5
+ summarizeBy: none
+ sourceColumn: resourceGroup
+
+ annotation SummarizationSetBy = Automatic
+
+ column subscriptionId
+ dataType: string
+ lineageTag: 55fc6fe4-f166-486d-a8a2-4681e867ed05
+ summarizeBy: none
+ sourceColumn: subscriptionId
+
+ annotation SummarizationSetBy = Automatic
+
+ column managedBy
+ dataType: string
+ lineageTag: 694e09fa-ece5-451a-9915-b4d14746953b
+ summarizeBy: none
+ sourceColumn: managedBy
+
+ annotation SummarizationSetBy = Automatic
+
+ column sku
+ dataType: string
+ lineageTag: 095b39f5-352f-42b7-b3ad-4270ab061250
+ summarizeBy: none
+ sourceColumn: sku
+
+ annotation SummarizationSetBy = Automatic
+
+ column plan
+ dataType: string
+ lineageTag: 1d318e16-2d1e-42bf-b48e-0eee499be0f5
+ summarizeBy: none
+ sourceColumn: plan
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.policyDefinitionId'
+ dataType: string
+ lineageTag: 36991dc9-f91b-42b4-9748-be127108cfde
+ summarizeBy: none
+ sourceColumn: properties.policyDefinitionId
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.effectiveDefinitionVersion'
+ dataType: string
+ lineageTag: 16da8ecd-c393-4286-a7cd-1040228789be
+ summarizeBy: none
+ sourceColumn: properties.effectiveDefinitionVersion
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.latestDefinitionVersion'
+ dataType: string
+ lineageTag: 3bca024d-238d-4d9b-bbb0-d684521dd31d
+ summarizeBy: none
+ sourceColumn: properties.latestDefinitionVersion
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.nonComplianceMessages'
+ dataType: string
+ lineageTag: 57b279a8-b3c2-4044-9e04-de1cc0c6164a
+ summarizeBy: none
+ sourceColumn: properties.nonComplianceMessages
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.definitionVersion'
+ dataType: string
+ lineageTag: 9aebe9eb-2371-4b13-9c76-36b3c5c823d6
+ summarizeBy: none
+ sourceColumn: properties.definitionVersion
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.resourceSelectors'
+ dataType: string
+ lineageTag: 11813bfd-1f37-488d-9285-1e772849b256
+ summarizeBy: none
+ sourceColumn: properties.resourceSelectors
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.enforcementMode'
+ dataType: string
+ lineageTag: d4584d1e-b6da-4040-b6a4-7134c0672510
+ summarizeBy: none
+ sourceColumn: properties.enforcementMode
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.assignmentType'
+ dataType: string
+ lineageTag: 6819787b-73a8-4e0e-8070-023568c7b976
+ summarizeBy: none
+ sourceColumn: properties.assignmentType
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.description'
+ dataType: string
+ lineageTag: d3ea744d-704e-48ee-9c5a-d8a17344916d
+ summarizeBy: none
+ sourceColumn: properties.description
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.displayName'
+ dataType: string
+ lineageTag: 5c957d8e-fd18-4850-960e-be9a8af7bccd
+ summarizeBy: none
+ sourceColumn: properties.displayName
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.parameters'
+ dataType: string
+ lineageTag: 1b67137d-df28-4b74-8513-486851b8628f
+ summarizeBy: none
+ sourceColumn: properties.parameters
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.notScopes'
+ dataType: string
+ lineageTag: e804ae45-625e-44c0-b9b7-faab55df20fc
+ summarizeBy: none
+ sourceColumn: properties.notScopes
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.overrides'
+ dataType: string
+ lineageTag: 1d20ddb9-f2f3-41d2-9449-dfea4797fb7f
+ summarizeBy: none
+ sourceColumn: properties.overrides
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.metadata.createdOn'
+ dataType: string
+ lineageTag: c2e66679-d4aa-440f-b152-d5d57460bea8
+ summarizeBy: none
+ sourceColumn: properties.metadata.createdOn
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.metadata.createdBy'
+ dataType: string
+ lineageTag: 9b40d28e-65b2-4ae1-92b1-7f60becaf430
+ summarizeBy: none
+ sourceColumn: properties.metadata.createdBy
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.metadata.assignedBy'
+ dataType: string
+ lineageTag: 5f9f32b3-e881-4748-814c-30eec5c31a6d
+ summarizeBy: none
+ sourceColumn: properties.metadata.assignedBy
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.metadata.parameterScopes'
+ dataType: string
+ lineageTag: cd98c09d-2563-4c18-b3ab-8843c0ec89fa
+ summarizeBy: none
+ sourceColumn: properties.metadata.parameterScopes
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.metadata.updatedOn'
+ dataType: string
+ lineageTag: 2a9a3ec7-6033-442b-95dd-ca16a8aa1a58
+ summarizeBy: none
+ sourceColumn: properties.metadata.updatedOn
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.metadata.updatedBy'
+ dataType: string
+ lineageTag: eff9fd70-f125-4e24-af7f-00c272ad7bd4
+ summarizeBy: none
+ sourceColumn: properties.metadata.updatedBy
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.metadata.category'
+ dataType: string
+ lineageTag: 359d4829-4b57-4c18-867f-175a3b77dfc9
+ summarizeBy: none
+ sourceColumn: properties.metadata.category
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.metadata.managedByResourceId'
+ dataType: string
+ lineageTag: c1974d8c-1e1f-429c-802c-ef88431e904a
+ summarizeBy: none
+ sourceColumn: properties.metadata.managedByResourceId
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.metadata.securityCenter'
+ dataType: string
+ lineageTag: 314cbab7-3be5-4e85-9d9f-9fe808ccc0be
+ summarizeBy: none
+ sourceColumn: properties.metadata.securityCenter
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.metadata.excludedOutOfTheBoxStandards'
+ dataType: string
+ lineageTag: 01fd1c38-2a24-4858-9335-8bd5cfdab130
+ summarizeBy: none
+ sourceColumn: properties.metadata.excludedOutOfTheBoxStandards
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.scope'
+ dataType: string
+ lineageTag: 445e8666-eaf2-4846-8f0f-439c5f6bf9da
+ summarizeBy: none
+ sourceColumn: properties.scope
+
+ annotation SummarizationSetBy = Automatic
+
+ column tags
+ dataType: string
+ lineageTag: a09bfa5d-31cb-42e3-8acf-b275f1d31393
+ summarizeBy: none
+ sourceColumn: tags
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'identity.userAssignedIdentities'
+ dataType: string
+ lineageTag: 8586946a-0e29-4772-b707-275f248a986b
+ summarizeBy: none
+ sourceColumn: identity.userAssignedIdentities
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'identity.principalId'
+ dataType: string
+ lineageTag: c41ce4d0-bbea-4b58-b2d9-31d310c82775
+ summarizeBy: none
+ sourceColumn: identity.principalId
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'identity.tenantId'
+ dataType: string
+ lineageTag: 3c44bc44-86b1-4fc9-af7b-0d1c0c80a39f
+ summarizeBy: none
+ sourceColumn: identity.tenantId
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'identity.type'
+ dataType: string
+ lineageTag: ab440e5d-da40-4376-8be6-ddae6a99cb27
+ summarizeBy: none
+ sourceColumn: identity.type
+
+ annotation SummarizationSetBy = Automatic
+
+ column zones
+ dataType: string
+ lineageTag: 3028b297-6696-4610-a7be-adcf9265888b
+ summarizeBy: none
+ sourceColumn: zones
+
+ annotation SummarizationSetBy = Automatic
+
+ column extendedLocation
+ dataType: string
+ lineageTag: 6bd96e6f-436a-478f-ba19-304ce558d978
+ summarizeBy: none
+ sourceColumn: extendedLocation
+
+ annotation SummarizationSetBy = Automatic
+
+ column properties
+ dataType: string
+ lineageTag: 49ce1144-59d6-4c26-90ab-e17dc2fa4b82
+ summarizeBy: none
+ sourceColumn: properties
+
+ annotation SummarizationSetBy = Automatic
+
+ column identity
+ dataType: string
+ lineageTag: c197f4e1-41f0-4234-a747-841344c1f798
+ summarizeBy: none
+ sourceColumn: identity
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.metadata'
+ dataType: string
+ lineageTag: c6b18c20-e706-4150-bf51-30f3366b6559
+ summarizeBy: none
+ sourceColumn: properties.metadata
+
+ annotation SummarizationSetBy = Automatic
+
+ partition PolicyAssignments = m
+ mode: import
+ queryGroup: 'Resource Graph'
+ source =
+ let
+ query = "
+ policyResources
+ | where type =~'Microsoft.Authorization/PolicyAssignments'
+ | extend subscriptionId = iff(tolower(tostring(split(id, '/')[1])) == 'subscriptions', tostring(split(id, '/')[2]), '')
+ | extend
+ ['properties.policyDefinitionId'] = properties.policyDefinitionId,
+ ['properties.effectiveDefinitionVersion'] = properties.effectiveDefinitionVersion,
+ ['properties.latestDefinitionVersion'] = properties.latestDefinitionVersion,
+ ['properties.nonComplianceMessages'] = properties.nonComplianceMessages,
+ ['properties.definitionVersion'] = properties.definitionVersion,
+ ['properties.resourceSelectors'] = properties.resourceSelectors,
+ ['properties.enforcementMode'] = properties.enforcementMode,
+ ['properties.assignmentType'] = properties.assignmentType,
+ ['properties.description'] = properties.description,
+ ['properties.displayName'] = properties.displayName,
+ ['properties.parameters'] = properties.parameters,
+ ['properties.notScopes'] = properties.notScopes,
+ ['properties.overrides'] = properties.overrides,
+ ['properties.metadata'] = properties.metadata,
+ ['properties.scope'] = properties.scope,
+ ['properties.metadata.createdOn'] = properties.metadata.createdOn,
+ ['properties.metadata.createdBy'] = properties.metadata.createdBy,
+ ['properties.metadata.assignedBy'] = properties.metadata.assignedBy,
+ ['properties.metadata.parameterScopes'] = properties.metadata.parameterScopes,
+ ['properties.metadata.updatedOn'] = properties.metadata.updatedOn,
+ ['properties.metadata.updatedBy'] = properties.metadata.updatedBy,
+ ['properties.metadata.category'] = properties.metadata.category,
+ ['properties.metadata.managedByResourceId'] = properties.metadata.managedByResourceId,
+ ['properties.metadata.securityCenter'] = properties.metadata.securityCenter,
+ ['properties.metadata.excludedOutOfTheBoxStandards'] = properties.metadata.excludedOutOfTheBoxStandards,
+ ['identity.userAssignedIdentities'] = identity.userAssignedIdentities,
+ ['identity.principalId'] = identity.principalId,
+ ['identity.tenantId'] = identity.tenantId,
+ ['identity.type'] = identity.type
+ | mv-expand ['properties.notScopes']
+ ",
+ Source = ftk_QueryARG(query, 2, true),
+ NullHandling =
+ if Source = null then
+ #table(
+ { "id", "name", "location", "resourceGroup", "properties.policyDefinitionId", "properties.effectiveDefinitionVersion", "properties.latestDefinitionVersion", "properties.nonComplianceMessages", "properties.definitionVersion", "properties.resourceSelectors", "properties.enforcementMode", "properties.assignmentType", "properties.description", "properties.displayName", "properties.parameters", "properties.notScopes", "properties.overrides", "properties.metadata", "properties.scope", "properties.metadata.createdOn", "properties.metadata.createdBy", "properties.metadata.assignedBy", "properties.metadata.parameterScopes", "properties.metadata.updatedOn", "properties.metadata.updatedBy", "properties.metadata.category", "properties.metadata.managedByResourceId", "properties.metadata.securityCenter", "properties.metadata.excludedOutOfTheBoxStandards", "identity.userAssignedIdentities", "identity.principalId", "identity.tenantId", "identity.type" },
+ {}
+ )
+ else Source
+ in
+ NullHandling
+
+ annotation PBI_NavigationStepName = Navigation
+
+ annotation PBI_ResultType = Table
+
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/PolicyStates.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/PolicyStates.tmdl
deleted file mode 120000
index 879e3a9e3..000000000
--- a/src/power-bi/storage/Shared.Dataset/definition/tables/PolicyStates.tmdl
+++ /dev/null
@@ -1 +0,0 @@
-../../../../kql/Shared.Dataset/definition/tables/PolicyStates.tmdl
\ No newline at end of file
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/PolicyStates.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/PolicyStates.tmdl
new file mode 100644
index 000000000..1a040b34e
--- /dev/null
+++ b/src/power-bi/storage/Shared.Dataset/definition/tables/PolicyStates.tmdl
@@ -0,0 +1,389 @@
+table PolicyStates
+ lineageTag: cf0e7752-0e35-40aa-a509-8a4f90194eee
+
+ measure complianceScore = [compliantCount]/[totalResourceCount]
+ formatString: 0.00\ %;-0.00\ %;0.00\ %
+ lineageTag: 8ef15317-240f-47a3-b0c2-fa0d092eda61
+
+ measure compliantCount = [totalResourceCount]-[nonCompliantCount]
+ lineageTag: 29316f3a-f1eb-4c74-9f1b-a5b5534a8439
+
+ measure nonCompliantCount = CALCULATE(DISTINCTCOUNT(PolicyStates[properties.resourceId]),FILTER(PolicyStates,PolicyStates[properties.complianceState]="NonCompliant"))
+ formatString: 0
+ lineageTag: c25950a1-8a49-4e9e-9d81-0a5972981c83
+
+ measure totalResourceCount = DISTINCTCOUNT(PolicyStates[properties.resourceId])
+ formatString: 0
+ lineageTag: b2e3060a-ed8b-4a7f-bf4e-171701a5e3d6
+
+ column id
+ dataType: string
+ lineageTag: d4561592-c509-4be1-b385-54bd35c5ec64
+ summarizeBy: none
+ sourceColumn: id
+
+ annotation SummarizationSetBy = Automatic
+
+ column name
+ dataType: string
+ lineageTag: 2df63a8b-89fb-4025-b249-7966450656e0
+ summarizeBy: none
+ sourceColumn: name
+
+ annotation SummarizationSetBy = Automatic
+
+ column type
+ dataType: string
+ lineageTag: 296452d0-4293-4beb-99e0-7c8a21b4a361
+ summarizeBy: none
+ sourceColumn: type
+
+ annotation SummarizationSetBy = Automatic
+
+ column tenantId
+ dataType: string
+ lineageTag: 43d677e1-f401-4b5c-921a-d579d4237a77
+ summarizeBy: none
+ sourceColumn: tenantId
+
+ annotation SummarizationSetBy = Automatic
+
+ column kind
+ dataType: string
+ lineageTag: e5c9d963-f9db-4757-9c33-e24b8d24ea76
+ summarizeBy: none
+ sourceColumn: kind
+
+ annotation SummarizationSetBy = Automatic
+
+ column location
+ dataType: string
+ lineageTag: b720b39d-cf51-43f2-bef4-513f8395820a
+ summarizeBy: none
+ sourceColumn: location
+
+ annotation SummarizationSetBy = Automatic
+
+ column resourceGroup
+ dataType: string
+ lineageTag: 61af56aa-a434-4bda-aeb0-81e9d0beca9a
+ summarizeBy: none
+ sourceColumn: resourceGroup
+
+ annotation SummarizationSetBy = Automatic
+
+ column subscriptionId
+ dataType: string
+ lineageTag: 97907a6a-8f80-4d94-91d0-556633f1a4de
+ summarizeBy: none
+ sourceColumn: subscriptionId
+
+ annotation SummarizationSetBy = Automatic
+
+ column managedBy
+ dataType: string
+ lineageTag: 5d9f1b25-abb9-4734-8a18-76d1ecbadc0c
+ summarizeBy: none
+ sourceColumn: managedBy
+
+ annotation SummarizationSetBy = Automatic
+
+ column sku
+ dataType: string
+ lineageTag: 61f92f73-d86b-435e-a291-769f735087e3
+ summarizeBy: none
+ sourceColumn: sku
+
+ annotation SummarizationSetBy = Automatic
+
+ column plan
+ dataType: string
+ lineageTag: 84e225fa-b931-4ae9-a9f6-4a1eb252fef3
+ summarizeBy: none
+ sourceColumn: plan
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.policyAssignmentParameters'
+ dataType: string
+ lineageTag: 783fc75e-393f-420a-b8ee-2646799d9089
+ summarizeBy: none
+ sourceColumn: properties.policyAssignmentParameters
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.policyDefinitionAction'
+ dataType: string
+ lineageTag: 58ea97b8-2c5d-43a7-98ea-3e0951ec4dfc
+ summarizeBy: none
+ sourceColumn: properties.policyDefinitionAction
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.policyAssignmentScope'
+ dataType: string
+ lineageTag: f665182c-f54e-4c40-977c-561dd6faa46d
+ summarizeBy: none
+ sourceColumn: properties.policyAssignmentScope
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.policyAssignmentName'
+ dataType: string
+ lineageTag: 3df25eec-090a-4c1b-a852-69054f56dfdd
+ summarizeBy: none
+ sourceColumn: properties.policyAssignmentName
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.policyDefinitionName'
+ dataType: string
+ lineageTag: 67350a21-f5cc-43c1-92ed-064bb00320ac
+ summarizeBy: none
+ sourceColumn: properties.policyDefinitionName
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.policyDefinitionReferenceId'
+ dataType: string
+ lineageTag: 3c524d4a-60f0-4a4d-8a5b-1123317b7096
+ summarizeBy: none
+ sourceColumn: properties.policyDefinitionReferenceId
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.policyDefinitionId'
+ dataType: string
+ lineageTag: f0d2244b-93f7-481e-9de9-c3dc6d894ea8
+ summarizeBy: none
+ sourceColumn: properties.policyDefinitionId
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.managementGroupIds'
+ dataType: string
+ lineageTag: 720d2a55-2591-4d1d-a162-6a2c3b0c1061
+ summarizeBy: none
+ sourceColumn: properties.managementGroupIds
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.policyAssignmentId'
+ dataType: string
+ lineageTag: 77528366-57af-4541-b8d9-034cbfdfd50a
+ summarizeBy: none
+ sourceColumn: properties.policyAssignmentId
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.policySetDefinitionName'
+ dataType: string
+ lineageTag: ff358f4c-5504-4c56-a883-53d4e636b71e
+ summarizeBy: none
+ sourceColumn: properties.policySetDefinitionName
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.complianceState'
+ dataType: string
+ lineageTag: 5ab6c2e6-763a-412b-960f-cfb43ddeb748
+ summarizeBy: none
+ sourceColumn: properties.complianceState
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.policySetDefinitionId'
+ dataType: string
+ lineageTag: e8f24c7c-ea8a-46b7-a73d-1fa68f22bc92
+ summarizeBy: none
+ sourceColumn: properties.policySetDefinitionId
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.subscriptionId'
+ dataType: string
+ lineageTag: 6ff5f7b7-6409-4422-9836-e62d383cc34a
+ summarizeBy: none
+ sourceColumn: properties.subscriptionId
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.resourceType'
+ dataType: string
+ lineageTag: b1d49f84-9b69-4118-9235-cde3c949457c
+ summarizeBy: none
+ sourceColumn: properties.resourceType
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.stateWeight'
+ dataType: string
+ lineageTag: 5c6c27a9-5ef9-492a-af89-ec2e7de56e3c
+ summarizeBy: none
+ sourceColumn: properties.stateWeight
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.resourceGroup'
+ dataType: string
+ lineageTag: bab7846a-e342-4472-82db-587b700c3e03
+ summarizeBy: none
+ sourceColumn: properties.resourceGroup
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.resourceId'
+ dataType: string
+ lineageTag: be95d463-c31e-472e-b7a9-ce79a87886c5
+ summarizeBy: none
+ sourceColumn: properties.resourceId
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.timestamp'
+ dataType: string
+ lineageTag: f3d23e6e-ccdb-4149-8f8e-87df9ec51a6c
+ summarizeBy: none
+ sourceColumn: properties.timestamp
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.isDeleted'
+ dataType: string
+ lineageTag: 8b13dbc1-fda0-4464-9c8f-543d1fa99f9a
+ summarizeBy: none
+ sourceColumn: properties.isDeleted
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.resourceLocation'
+ dataType: string
+ lineageTag: 7face71a-1084-448e-9448-fdbd851a4a73
+ summarizeBy: none
+ sourceColumn: properties.resourceLocation
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.policySetDefinitionCategory'
+ dataType: string
+ lineageTag: 2821fa37-31e7-49c4-983d-e097cc4ac6b3
+ summarizeBy: none
+ sourceColumn: properties.policySetDefinitionCategory
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.policyDefinitionGroupNames'
+ dataType: string
+ lineageTag: 5b1f343c-d014-4884-976f-078ec25e7432
+ summarizeBy: none
+ sourceColumn: properties.policyDefinitionGroupNames
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.complianceReasonCode'
+ dataType: string
+ lineageTag: d7426779-4a22-4013-8dbd-65b45b3fc3d1
+ summarizeBy: none
+ sourceColumn: properties.complianceReasonCode
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.stateDetails'
+ dataType: string
+ lineageTag: b29f486c-994e-4218-8b7f-d4b4421a54b8
+ summarizeBy: none
+ sourceColumn: properties.stateDetails
+
+ annotation SummarizationSetBy = Automatic
+
+ column tags
+ dataType: string
+ lineageTag: 7a49e86e-b0bf-4067-9282-763f2d44bebc
+ summarizeBy: none
+ sourceColumn: tags
+
+ annotation SummarizationSetBy = Automatic
+
+ column identity
+ dataType: string
+ lineageTag: 019f7b22-25f4-4146-b752-13053d03ed96
+ summarizeBy: none
+ sourceColumn: identity
+
+ annotation SummarizationSetBy = Automatic
+
+ column zones
+ dataType: string
+ lineageTag: 5947cd38-8f2a-4334-a5a7-5d01bb43d51e
+ summarizeBy: none
+ sourceColumn: zones
+
+ annotation SummarizationSetBy = Automatic
+
+ column extendedLocation
+ dataType: string
+ lineageTag: 5b099162-3582-46bd-902b-95529385e58c
+ summarizeBy: none
+ sourceColumn: extendedLocation
+
+ annotation SummarizationSetBy = Automatic
+
+ column properties
+ dataType: string
+ lineageTag: 1c44fa0d-9a5d-4620-9d4b-448c7f806d0b
+ summarizeBy: none
+ sourceColumn: properties
+
+ annotation SummarizationSetBy = Automatic
+
+ partition PolicyStates = m
+ mode: import
+ queryGroup: 'Resource Graph'
+ source =
+ let
+ query = "
+ policyResources
+ | where type =~'Microsoft.PolicyInsights/PolicyStates'
+ | extend subscriptionId = iff(tolower(tostring(split(id, '/')[1])) == 'subscriptions', tostring(split(id, '/')[2]), '')
+ | extend
+ ['properties.policyAssignmentParameters'] = properties.policyAssignmentParameters,
+ ['properties.policyDefinitionAction'] = properties.policyDefinitionAction,
+ ['properties.policyAssignmentScope'] = properties.policyAssignmentScope,
+ ['properties.policyAssignmentName'] = properties.policyAssignmentName,
+ ['properties.policyDefinitionName'] = properties.policyDefinitionName,
+ ['properties.policyDefinitionReferenceId'] = properties.policyDefinitionReferenceId,
+ ['properties.policyDefinitionId'] = properties.policyDefinitionId,
+ ['properties.managementGroupIds'] = properties.managementGroupIds,
+ ['properties.policyAssignmentId'] = properties.policyAssignmentId,
+ ['properties.policySetDefinitionName'] = properties.policySetDefinitionName,
+ ['properties.complianceState'] = properties.complianceState,
+ ['properties.policySetDefinitionId'] = properties.policySetDefinitionId,
+ ['properties.subscriptionId'] = properties.subscriptionId,
+ ['properties.resourceType'] = properties.resourceType,
+ ['properties.stateWeight'] = properties.stateWeight,
+ ['properties.resourceGroup'] = properties.resourceGroup,
+ ['properties.resourceId'] = properties.resourceId,
+ ['properties.timestamp'] = properties.timestamp,
+ ['properties.isDeleted'] = properties.isDeleted,
+ ['properties.resourceLocation'] = properties.resourceLocation,
+ ['properties.policySetDefinitionCategory'] = properties.policySetDefinitionCategory,
+ ['properties.policyDefinitionGroupNames'] = properties.policyDefinitionGroupNames,
+ ['properties.complianceReasonCode'] = properties.complianceReasonCode,
+ ['properties.stateDetails'] = properties.stateDetails
+ ",
+ Source = ftk_QueryARG(query, 2, true),
+ NullHandling =
+ if Source = null then
+ #table(
+ { "id", "name", "location", "resourceGroup", "properties.policyAssignmentParameters", "properties.policyDefinitionAction", "properties.policyAssignmentScope", "properties.policyAssignmentName", "properties.policyDefinitionName", "properties.policyDefinitionReferenceId", "properties.policyDefinitionId", "properties.managementGroupIds", "properties.policyAssignmentId", "properties.policySetDefinitionName", "properties.complianceState", "properties.policySetDefinitionId", "properties.subscriptionId", "properties.resourceType", "properties.stateWeight", "properties.resourceGroup", "properties.resourceId", "properties.timestamp", "properties.isDeleted", "properties.resourceLocation", "properties.policySetDefinitionCategory", "properties.policyDefinitionGroupNames", "properties.complianceReasonCode", "properties.stateDetails" },
+ {}
+ )
+ else Source,
+ Types = Table.TransformColumns(NullHandling, {{"properties.policyAssignmentScope", each Text.AfterDelimiter(_, "/", {0, RelativePosition.FromEnd}), type text}}, null, MissingField.Ignore)
+ in
+ Types
+
+ annotation PBI_NavigationStepName = Navigation
+
+ annotation PBI_ResultType = Table
+
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/PublicIPAddresses.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/PublicIPAddresses.tmdl
deleted file mode 120000
index 8fad22b99..000000000
--- a/src/power-bi/storage/Shared.Dataset/definition/tables/PublicIPAddresses.tmdl
+++ /dev/null
@@ -1 +0,0 @@
-../../../../kql/Shared.Dataset/definition/tables/PublicIPAddresses.tmdl
\ No newline at end of file
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/PublicIPAddresses.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/PublicIPAddresses.tmdl
new file mode 100644
index 000000000..86bcd5aa8
--- /dev/null
+++ b/src/power-bi/storage/Shared.Dataset/definition/tables/PublicIPAddresses.tmdl
@@ -0,0 +1,228 @@
+table PublicIPAddresses
+ lineageTag: 5c35f59e-97dc-424c-b1ae-0526c2c708ed
+
+ column id
+ dataType: string
+ lineageTag: 25bf5fbf-8f5e-4b15-a187-625c6a612325
+ summarizeBy: none
+ sourceColumn: id
+
+ annotation SummarizationSetBy = Automatic
+
+ column name
+ dataType: string
+ lineageTag: 6004d8c7-c14e-4645-959a-be60b835cff9
+ summarizeBy: none
+ sourceColumn: name
+
+ annotation SummarizationSetBy = Automatic
+
+ column type
+ dataType: string
+ lineageTag: 1c2e1fc0-e06c-412c-869e-1d331ad8124f
+ summarizeBy: none
+ sourceColumn: type
+
+ annotation SummarizationSetBy = Automatic
+
+ column tenantId
+ dataType: string
+ lineageTag: e66cea86-1d7d-451b-a563-77527fa7a040
+ summarizeBy: none
+ sourceColumn: tenantId
+
+ annotation SummarizationSetBy = Automatic
+
+ column kind
+ dataType: string
+ lineageTag: f50f28b2-0509-4b8e-b65f-1dee90ad40e0
+ summarizeBy: none
+ sourceColumn: kind
+
+ annotation SummarizationSetBy = Automatic
+
+ column location
+ dataType: string
+ lineageTag: 659c2554-62a2-4789-9e4e-a08a80b56402
+ summarizeBy: none
+ sourceColumn: location
+
+ annotation SummarizationSetBy = Automatic
+
+ column resourceGroup
+ dataType: string
+ lineageTag: 413653d8-db89-4907-aa49-edb840bce4ae
+ summarizeBy: none
+ sourceColumn: resourceGroup
+
+ annotation SummarizationSetBy = Automatic
+
+ column subscriptionId
+ dataType: string
+ lineageTag: 856cbcf9-1bb5-4522-92cb-cf481423a37b
+ summarizeBy: none
+ sourceColumn: subscriptionId
+
+ annotation SummarizationSetBy = Automatic
+
+ column managedBy
+ dataType: string
+ lineageTag: d55896cd-835b-47f3-947c-16e5d2eadeab
+ summarizeBy: none
+ sourceColumn: managedBy
+
+ annotation SummarizationSetBy = Automatic
+
+ column sku
+ dataType: string
+ lineageTag: 52a19f62-b4a6-4e96-b7c5-615759029dcb
+ summarizeBy: none
+ sourceColumn: sku
+
+ annotation SummarizationSetBy = Automatic
+
+ column plan
+ dataType: string
+ lineageTag: 4740149e-b926-4ab6-b486-680691496a95
+ summarizeBy: none
+ sourceColumn: plan
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.provisioningState'
+ dataType: string
+ lineageTag: 552b63bf-51c6-487b-94ba-9811897d6668
+ summarizeBy: none
+ sourceColumn: properties.provisioningState
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.resourceGuid'
+ dataType: string
+ lineageTag: 9792e908-997a-4ef1-a288-cca086f0a720
+ summarizeBy: none
+ sourceColumn: properties.resourceGuid
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.idleTimeoutInMinutes'
+ dataType: string
+ lineageTag: 71fa242f-feef-4749-871e-212257842c7c
+ summarizeBy: none
+ sourceColumn: properties.idleTimeoutInMinutes
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.publicIPAllocationMethod'
+ dataType: string
+ lineageTag: 6691799d-57f0-4949-b0cb-a3d392b056c0
+ summarizeBy: none
+ sourceColumn: properties.publicIPAllocationMethod
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.publicIPAddressVersion'
+ dataType: string
+ lineageTag: a2509f77-55b5-4da7-bc2b-673da4224c5c
+ summarizeBy: none
+ sourceColumn: properties.publicIPAddressVersion
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.ipAddress'
+ dataType: string
+ lineageTag: c4667d70-08f9-4d7c-8401-1bb9674cdc65
+ summarizeBy: none
+ sourceColumn: properties.ipAddress
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.ipConfiguration'
+ dataType: string
+ lineageTag: 996ada29-00db-4da9-8c3a-f132a9942293
+ summarizeBy: none
+ sourceColumn: properties.ipConfiguration
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.ipTags'
+ dataType: string
+ lineageTag: c6048a40-80ce-40bf-85c2-5020bd678dee
+ summarizeBy: none
+ sourceColumn: properties.ipTags
+
+ annotation SummarizationSetBy = Automatic
+
+ column tags
+ dataType: string
+ lineageTag: 80bcdb91-6e88-445e-8363-2e4c2df501cc
+ summarizeBy: none
+ sourceColumn: tags
+
+ annotation SummarizationSetBy = Automatic
+
+ column identity
+ dataType: string
+ lineageTag: 588b89cc-2124-424c-9f2f-0dfebe0aec5a
+ summarizeBy: none
+ sourceColumn: identity
+
+ annotation SummarizationSetBy = Automatic
+
+ column zones
+ dataType: string
+ lineageTag: 5e273fd8-51e0-450f-b97d-868411e2b66b
+ summarizeBy: none
+ sourceColumn: zones
+
+ annotation SummarizationSetBy = Automatic
+
+ column extendedLocation
+ dataType: string
+ lineageTag: 74c227cb-8a90-41c5-8457-bd3b0ebaae99
+ summarizeBy: none
+ sourceColumn: extendedLocation
+
+ annotation SummarizationSetBy = Automatic
+
+ column properties
+ dataType: string
+ lineageTag: 465b0574-de95-46a1-8959-18d2eb167b28
+ summarizeBy: none
+ sourceColumn: properties
+
+ annotation SummarizationSetBy = Automatic
+
+ partition PublicIPAddresses = m
+ mode: import
+ queryGroup: 'Resource Graph'
+ source =
+ let
+ query = "
+ Resources
+ | where type =~ 'microsoft.network/publicipaddresses'
+ | extend
+ ['properties.provisioningState'] = properties.provisioningState,
+ ['properties.resourceGuid'] = properties.resourceGuid,
+ ['properties.idleTimeoutInMinutes'] = properties.idleTimeoutInMinutes,
+ ['properties.publicIPAllocationMethod'] = properties.publicIPAllocationMethod,
+ ['properties.publicIPAddressVersion'] = properties.publicIPAddressVersion,
+ ['properties.ipAddress'] = properties.ipAddress,
+ ['properties.ipConfiguration'] = properties.ipConfiguration,
+ ['properties.ipTags'] = properties.ipTags
+ ",
+ Source = ftk_QueryARG(query, 5),
+ NullHandling =
+ if Source = null then
+ #table(
+ { "id", "name", "location", "resourceGroup", "properties.provisioningState", "properties.resourceGuid", "properties.idleTimeoutInMinutes", "properties.publicIPAllocationMethod", "properties.publicIPAddressVersion", "properties.ipAddress", "properties.ipConfiguration", "properties.ipTags" },
+ {}
+ )
+ else Source
+ in
+ NullHandling
+
+ annotation PBI_NavigationStepName = Navigation
+
+ annotation PBI_ResultType = Table
+
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/Resources.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/Resources.tmdl
deleted file mode 120000
index a0cac40ed..000000000
--- a/src/power-bi/storage/Shared.Dataset/definition/tables/Resources.tmdl
+++ /dev/null
@@ -1 +0,0 @@
-../../../../kql/Shared.Dataset/definition/tables/Resources.tmdl
\ No newline at end of file
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/Resources.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/Resources.tmdl
new file mode 100644
index 000000000..7fb4b5320
--- /dev/null
+++ b/src/power-bi/storage/Shared.Dataset/definition/tables/Resources.tmdl
@@ -0,0 +1,114 @@
+table Resources
+ lineageTag: ec447c64-6e55-41d8-a5ea-a43adab5dc79
+
+ column x_ResourceGroupId = "/subscriptions/" & Resources[subscriptionId] & "/resourcegroups/" & Resources[resourceGroup]
+ lineageTag: dfd516fd-8d25-441f-93a3-190abe05d572
+ summarizeBy: none
+
+ annotation SummarizationSetBy = Automatic
+
+ column id
+ dataType: string
+ lineageTag: 3e3f2af4-0c29-4314-bb73-2f2814bce3d0
+ summarizeBy: none
+ sourceColumn: id
+
+ annotation SummarizationSetBy = Automatic
+
+ column name
+ dataType: string
+ lineageTag: df96413f-3717-4f22-8e50-69d5e667c403
+ summarizeBy: none
+ sourceColumn: name
+
+ annotation SummarizationSetBy = Automatic
+
+ column type
+ dataType: string
+ lineageTag: f5eb1b01-e021-4ae0-9a31-6f52efec4801
+ summarizeBy: none
+ sourceColumn: type
+
+ annotation SummarizationSetBy = Automatic
+
+ column tenantId
+ dataType: string
+ lineageTag: f3a1771a-7794-4bf1-bf81-7c046a215b44
+ summarizeBy: none
+ sourceColumn: tenantId
+
+ annotation SummarizationSetBy = Automatic
+
+ column location
+ dataType: string
+ lineageTag: 565179fa-8aec-468c-bee1-0442f3a3be54
+ summarizeBy: none
+ sourceColumn: location
+
+ annotation SummarizationSetBy = Automatic
+
+ column resourceGroup
+ dataType: string
+ lineageTag: d6304358-f530-408f-ba5c-b9de2d9c2be8
+ summarizeBy: none
+ sourceColumn: resourceGroup
+
+ annotation SummarizationSetBy = Automatic
+
+ column subscriptionId
+ dataType: string
+ lineageTag: 2964f864-60c6-47d5-b1b9-cbeebda9e754
+ summarizeBy: none
+ sourceColumn: subscriptionId
+
+ annotation SummarizationSetBy = Automatic
+
+ column creationTime
+ dataType: string
+ lineageTag: 3793d80a-795c-429a-a786-e29e1c04cb0c
+ summarizeBy: none
+ sourceColumn: creationTime
+
+ annotation SummarizationSetBy = Automatic
+
+ column timeModified
+ dataType: string
+ lineageTag: 1fea57ec-7e6c-4929-84f9-8842192253b1
+ summarizeBy: none
+ sourceColumn: timeModified
+
+ annotation SummarizationSetBy = Automatic
+
+ partition Resources = m
+ mode: import
+ queryGroup: 'Resource Graph'
+ source =
+ let
+ query = "
+ resources
+ | extend
+ id = tolower(id),
+ ['creationTime'] = properties.creationTime,
+ ['timeModified'] = properties.timeModified
+ | project id, name, type, tenantId, location, subscriptionId, resourceGroup, creationTime, timeModified
+ ",
+ Source = ftk_QueryARG(query),
+ NullHandling =
+ if Source = null then
+ #table(
+ { "id", "name", "type", "tenantId", "location", "subscriptionId", "resourceGroup", "creationTime", "timeModified" },
+ {}
+ )
+ else Source,
+
+ // Remove duplicate IDs
+ // This step may hide valid rows and show invalid rows due to a bug in Resource Graph. We do not recommend it but are including it in case you want to unblock yourself.
+ // If you experience a "duplicate IDs" error for the Resources table, please file a support request against Azure Resource Graph.
+ RemoveDuplicates = if #"Remove Duplicate Resource IDs" then Table.Distinct(NullHandling, {"id"}) else NullHandling
+ in
+ RemoveDuplicates
+
+ annotation PBI_NavigationStepName = Navigation
+
+ annotation PBI_ResultType = Table
+
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/SqlDatabases.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/SqlDatabases.tmdl
deleted file mode 120000
index 076e27526..000000000
--- a/src/power-bi/storage/Shared.Dataset/definition/tables/SqlDatabases.tmdl
+++ /dev/null
@@ -1 +0,0 @@
-../../../../kql/Shared.Dataset/definition/tables/SqlDatabases.tmdl
\ No newline at end of file
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/SqlDatabases.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/SqlDatabases.tmdl
new file mode 100644
index 000000000..77722b8ba
--- /dev/null
+++ b/src/power-bi/storage/Shared.Dataset/definition/tables/SqlDatabases.tmdl
@@ -0,0 +1,383 @@
+table SqlDatabases
+ lineageTag: 28ccb046-cb49-4d65-8bef-6c25b4e6d9bd
+
+ column id
+ dataType: string
+ lineageTag: a62eaf23-4570-4604-84a8-62c1cc93732f
+ summarizeBy: none
+ sourceColumn: id
+
+ annotation SummarizationSetBy = Automatic
+
+ column name
+ dataType: string
+ lineageTag: b343c8ed-f905-49e3-a997-7993656a8edc
+ summarizeBy: none
+ sourceColumn: name
+
+ annotation SummarizationSetBy = Automatic
+
+ column type
+ dataType: string
+ lineageTag: 2f845801-82a4-4a1d-baee-4e00cc5d9fe9
+ summarizeBy: none
+ sourceColumn: type
+
+ annotation SummarizationSetBy = Automatic
+
+ column tenantId
+ dataType: string
+ lineageTag: 9f91fdb8-e2ca-48c2-8f1b-d2c5947cd214
+ summarizeBy: none
+ sourceColumn: tenantId
+
+ annotation SummarizationSetBy = Automatic
+
+ column kind
+ dataType: string
+ lineageTag: e5be51cd-a91e-444e-be6d-853d13754106
+ summarizeBy: none
+ sourceColumn: kind
+
+ annotation SummarizationSetBy = Automatic
+
+ column location
+ dataType: string
+ lineageTag: a6dd3004-5b67-45c1-a819-f31cc1bf0712
+ summarizeBy: none
+ sourceColumn: location
+
+ annotation SummarizationSetBy = Automatic
+
+ column resourceGroup
+ dataType: string
+ lineageTag: 84645a55-1f21-4fa6-b2bb-377d9558ac8e
+ summarizeBy: none
+ sourceColumn: resourceGroup
+
+ annotation SummarizationSetBy = Automatic
+
+ column subscriptionId
+ dataType: string
+ lineageTag: 6bb6f3b4-e77d-416e-a914-d0cf2f35c63d
+ summarizeBy: none
+ sourceColumn: subscriptionId
+
+ annotation SummarizationSetBy = Automatic
+
+ column managedBy
+ dataType: string
+ lineageTag: 119ad678-6f92-49f1-8e0b-0e5e267a15f7
+ summarizeBy: none
+ sourceColumn: managedBy
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'sku.name'
+ dataType: string
+ lineageTag: 1be92f30-01fc-4f24-b3f1-7f6321288452
+ summarizeBy: none
+ sourceColumn: sku.name
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'sku.tier'
+ dataType: string
+ lineageTag: 1055f96a-796e-4fdd-92c4-d82dfe695486
+ summarizeBy: none
+ sourceColumn: sku.tier
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'sku.capacity'
+ dataType: string
+ lineageTag: 043c12dd-1962-4a4b-ae15-28f6dcceb173
+ summarizeBy: none
+ sourceColumn: sku.capacity
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'sku.family'
+ dataType: string
+ lineageTag: dc9ae49c-72fb-4f17-8dc5-274874adf4d3
+ summarizeBy: none
+ sourceColumn: sku.family
+
+ annotation SummarizationSetBy = Automatic
+
+ column plan
+ dataType: string
+ lineageTag: 56dffce6-500b-4cea-849b-5446195aea77
+ summarizeBy: none
+ sourceColumn: plan
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.status'
+ dataType: string
+ lineageTag: 5acab20a-48e5-40a6-be42-4ce285d6050c
+ summarizeBy: none
+ sourceColumn: properties.status
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.requestedBackupStorageRedundancy'
+ dataType: string
+ lineageTag: 06b8e874-abdd-4169-ab5d-9bb0d77133e9
+ summarizeBy: none
+ sourceColumn: properties.requestedBackupStorageRedundancy
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.currentBackupStorageRedundancy'
+ dataType: string
+ lineageTag: 9b75a75f-130c-4740-b1c6-5f8b5b2349a0
+ summarizeBy: none
+ sourceColumn: properties.currentBackupStorageRedundancy
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.requestedServiceObjectiveName'
+ dataType: string
+ lineageTag: 5e0bca97-e4e6-48dd-b0cf-0aec6b495e54
+ summarizeBy: none
+ sourceColumn: properties.requestedServiceObjectiveName
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.currentServiceObjectiveName'
+ dataType: string
+ lineageTag: b9f2c839-cb78-4fbd-a865-0b9bdcea1d93
+ summarizeBy: none
+ sourceColumn: properties.currentServiceObjectiveName
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.maintenanceConfigurationId'
+ dataType: string
+ lineageTag: a70c975b-7ee1-4f9d-86ea-0a608ee1ca06
+ summarizeBy: none
+ sourceColumn: properties.maintenanceConfigurationId
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.defaultSecondaryLocation'
+ dataType: string
+ lineageTag: 0618b4ff-529a-47ab-b17d-d3cc1b44a365
+ summarizeBy: none
+ sourceColumn: properties.defaultSecondaryLocation
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.isInfraEncryptionEnabled'
+ dataType: string
+ lineageTag: 71c1a23e-de24-406d-8f60-2d37a331d8e2
+ summarizeBy: none
+ sourceColumn: properties.isInfraEncryptionEnabled
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.earliestRestoreDate'
+ dataType: string
+ lineageTag: 5d9c2600-6d0a-41e5-8674-964c34ee2211
+ summarizeBy: none
+ sourceColumn: properties.earliestRestoreDate
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.zoneRedundant'
+ dataType: string
+ lineageTag: 99c1096c-4e12-4f02-b8eb-b56b958ba0c1
+ summarizeBy: none
+ sourceColumn: properties.zoneRedundant
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.availabilityZone'
+ dataType: string
+ lineageTag: f94ad863-bf18-46a0-9c48-0f5ca34e3c8a
+ summarizeBy: none
+ sourceColumn: properties.availabilityZone
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.catalogCollation'
+ dataType: string
+ lineageTag: 2bd47a2e-a367-4120-a8d9-8538155790fb
+ summarizeBy: none
+ sourceColumn: properties.catalogCollation
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.creationDate'
+ dataType: dateTime
+ formatString: General Date
+ lineageTag: f5cf5ffd-b2b2-482a-8573-1af7a4cce5b2
+ summarizeBy: none
+ sourceColumn: properties.creationDate
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.collation'
+ dataType: string
+ lineageTag: 70eab20f-6666-4657-aca7-eb17823fc698
+ summarizeBy: none
+ sourceColumn: properties.collation
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.licenseType'
+ dataType: string
+ lineageTag: 319756bd-fd30-4055-b93c-bd3eef82607c
+ summarizeBy: none
+ sourceColumn: properties.licenseType
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.maxSizeBytes'
+ dataType: string
+ lineageTag: ecc2bd34-5a78-4734-a156-296b640b1901
+ summarizeBy: none
+ sourceColumn: properties.maxSizeBytes
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.isLedgerOn'
+ dataType: string
+ lineageTag: ae359e3d-1a28-4232-b24c-14e2d3d0d7d1
+ summarizeBy: none
+ sourceColumn: properties.isLedgerOn
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.databaseId'
+ dataType: string
+ lineageTag: 300c3dce-a252-4c19-9eb8-f566861f76b0
+ summarizeBy: none
+ sourceColumn: properties.databaseId
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.currentSku'
+ dataType: string
+ lineageTag: 13aba0ef-924c-4e25-81b2-5cca3fff3da1
+ summarizeBy: none
+ sourceColumn: properties.currentSku
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.readScale'
+ dataType: string
+ lineageTag: 1459556c-62f2-40ff-9518-f258f7a053a8
+ summarizeBy: none
+ sourceColumn: properties.readScale
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.maxLogSizeBytes'
+ dataType: string
+ lineageTag: 466ba7c2-ad63-45a4-bde1-8f17ea763bc2
+ summarizeBy: none
+ sourceColumn: properties.maxLogSizeBytes
+
+ annotation SummarizationSetBy = Automatic
+
+ column tags
+ dataType: string
+ lineageTag: c47eec27-9dd9-4f75-8711-1bb7db4ed44f
+ summarizeBy: none
+ sourceColumn: tags
+
+ annotation SummarizationSetBy = Automatic
+
+ column identity
+ dataType: string
+ lineageTag: ce93bb70-63a4-454c-b152-467c0a99f759
+ summarizeBy: none
+ sourceColumn: identity
+
+ annotation SummarizationSetBy = Automatic
+
+ column zones
+ dataType: string
+ lineageTag: 96e50542-0c55-48b1-ab1a-5be6947e4497
+ summarizeBy: none
+ sourceColumn: zones
+
+ annotation SummarizationSetBy = Automatic
+
+ column extendedLocation
+ dataType: string
+ lineageTag: 6c1b0c87-9514-446a-b056-09b9df624a4e
+ summarizeBy: none
+ sourceColumn: extendedLocation
+
+ annotation SummarizationSetBy = Automatic
+
+ column sku
+ dataType: string
+ lineageTag: d7a4cc1a-1ec2-4d53-9fbc-67bd9909b432
+ summarizeBy: none
+ sourceColumn: sku
+
+ annotation SummarizationSetBy = Automatic
+
+ column properties
+ dataType: string
+ lineageTag: ce2fc334-a9de-4987-9251-0069e7208ada
+ summarizeBy: none
+ sourceColumn: properties
+
+ annotation SummarizationSetBy = Automatic
+
+ partition SqlDatabases = m
+ mode: import
+ queryGroup: 'Resource Graph'
+ source =
+ let
+ query = "
+ resources
+ | where type == 'microsoft.sql/servers/databases'
+ | extend
+ ['sku.name'] = sku.name,
+ ['sku.tier'] = sku.tier,
+ ['sku.capacity'] = sku.capacity,
+ ['sku.family'] = sku.family,
+ ['properties.status'] = properties.status,
+ ['properties.requestedBackupStorageRedundancy'] = properties.requestedBackupStorageRedundancy,
+ ['properties.currentBackupStorageRedundancy'] = properties.currentBackupStorageRedundancy,
+ ['properties.requestedServiceObjectiveName'] = properties.requestedServiceObjectiveName,
+ ['properties.currentServiceObjectiveName'] = properties.currentServiceObjectiveName,
+ ['properties.maintenanceConfigurationId'] = properties.maintenanceConfigurationId,
+ ['properties.defaultSecondaryLocation'] = properties.defaultSecondaryLocation,
+ ['properties.isInfraEncryptionEnabled'] = properties.isInfraEncryptionEnabled,
+ ['properties.earliestRestoreDate'] = properties.earliestRestoreDate,
+ ['properties.zoneRedundant'] = properties.zoneRedundant,
+ ['properties.availabilityZone'] = properties.availabilityZone,
+ ['properties.catalogCollation'] = properties.catalogCollation,
+ ['properties.creationDate'] = properties.creationDate,
+ ['properties.collation'] = properties.collation,
+ ['properties.licenseType'] = properties.licenseType,
+ ['properties.maxSizeBytes'] = properties.maxSizeBytes,
+ ['properties.isLedgerOn'] = properties.isLedgerOn,
+ ['properties.databaseId'] = properties.databaseId,
+ ['properties.currentSku'] = properties.currentSku,
+ ['properties.readScale'] = properties.readScale,
+ ['properties.maxLogSizeBytes'] = properties.maxLogSizeBytes
+ ",
+ Source = ftk_QueryARG(query, 2),
+ NullHandling =
+ if Source = null then
+ #table(
+ { "id", "name", "sku.name", "sku.tier", "sku.capacity", "sku.family", "location", "resourceGroup", "properties.status", "properties.requestedBackupStorageRedundancy", "properties.currentBackupStorageRedundancy", "properties.requestedServiceObjectiveName", "properties.currentServiceObjectiveName", "properties.maintenanceConfigurationId", "properties.defaultSecondaryLocation", "properties.isInfraEncryptionEnabled", "properties.earliestRestoreDate", "properties.zoneRedundant", "properties.availabilityZone", "properties.catalogCollation", "properties.creationDate", "properties.collation", "properties.licenseType", "properties.maxSizeBytes", "properties.isLedgerOn", "properties.databaseId", "properties.currentSku", "properties.readScale", "properties.maxLogSizeBytes" },
+ {}
+ )
+ else Source,
+ Types = Table.TransformColumnTypes(NullHandling, {{"properties.creationDate", type datetimezone}})
+ in
+ Types
+
+ annotation PBI_NavigationStepName = Navigation
+
+ annotation PBI_ResultType = Table
+
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/Subscriptions.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/Subscriptions.tmdl
deleted file mode 120000
index 71dd57f47..000000000
--- a/src/power-bi/storage/Shared.Dataset/definition/tables/Subscriptions.tmdl
+++ /dev/null
@@ -1 +0,0 @@
-../../../../kql/Shared.Dataset/definition/tables/Subscriptions.tmdl
\ No newline at end of file
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/Subscriptions.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/Subscriptions.tmdl
new file mode 100644
index 000000000..67afd70bc
--- /dev/null
+++ b/src/power-bi/storage/Shared.Dataset/definition/tables/Subscriptions.tmdl
@@ -0,0 +1,175 @@
+table Subscriptions
+ lineageTag: 07b667e4-2b48-4235-8cfb-5d59858a92fd
+
+ column id
+ dataType: string
+ lineageTag: 793921fd-f3f6-4f61-b14e-8fa9430505b4
+ summarizeBy: none
+ sourceColumn: id
+
+ annotation SummarizationSetBy = Automatic
+
+ column name
+ dataType: string
+ lineageTag: 8505a157-2e52-44c3-aae3-7a17aa29e660
+ summarizeBy: none
+ sourceColumn: name
+
+ annotation SummarizationSetBy = Automatic
+
+ column type
+ dataType: string
+ lineageTag: f4dd6a96-342a-43f3-88a3-e1787d6d67b8
+ summarizeBy: none
+ sourceColumn: type
+
+ annotation SummarizationSetBy = Automatic
+
+ column tenantId
+ dataType: string
+ lineageTag: 3194af1d-8e00-49df-86bb-8b491c39ae3d
+ summarizeBy: none
+ sourceColumn: tenantId
+
+ annotation SummarizationSetBy = Automatic
+
+ column kind
+ dataType: string
+ lineageTag: 540d1adf-2e23-4e17-afca-65de9fe9681b
+ summarizeBy: none
+ sourceColumn: kind
+
+ annotation SummarizationSetBy = Automatic
+
+ column location
+ dataType: string
+ lineageTag: 4ba56665-8cb0-448d-a51a-1d5847d1d651
+ summarizeBy: none
+ sourceColumn: location
+
+ annotation SummarizationSetBy = Automatic
+
+ column resourceGroup
+ dataType: string
+ lineageTag: a1a2d9d2-d9f1-4109-b4c7-2eb2697004e9
+ summarizeBy: none
+ sourceColumn: resourceGroup
+
+ annotation SummarizationSetBy = Automatic
+
+ column subscriptionId
+ dataType: string
+ lineageTag: 3ed589d4-d97f-460c-9f6f-81b131c8b8b2
+ summarizeBy: none
+ sourceColumn: subscriptionId
+
+ annotation SummarizationSetBy = Automatic
+
+ column managedBy
+ dataType: string
+ lineageTag: 5be96267-523e-4c25-823c-ed29e37bd321
+ summarizeBy: none
+ sourceColumn: managedBy
+
+ annotation SummarizationSetBy = Automatic
+
+ column sku
+ dataType: string
+ lineageTag: 21317308-a1e5-495b-9e1c-d0e60fa9e45e
+ summarizeBy: none
+ sourceColumn: sku
+
+ annotation SummarizationSetBy = Automatic
+
+ column plan
+ dataType: string
+ lineageTag: 71a123ff-da4e-40a8-9e8a-51cf3e0cd91b
+ summarizeBy: none
+ sourceColumn: plan
+
+ annotation SummarizationSetBy = Automatic
+
+ column tags
+ dataType: string
+ lineageTag: ff48b324-4a1c-488d-97d3-f9f59e0b7f3c
+ summarizeBy: none
+ sourceColumn: tags
+
+ annotation SummarizationSetBy = Automatic
+
+ column identity
+ dataType: string
+ lineageTag: c13df37c-910c-432c-a474-b7d68dbc1ddb
+ summarizeBy: none
+ sourceColumn: identity
+
+ annotation SummarizationSetBy = Automatic
+
+ column zones
+ dataType: string
+ lineageTag: 39936a9e-4e8c-4e26-9688-6a23cbe4804d
+ summarizeBy: none
+ sourceColumn: zones
+
+ annotation SummarizationSetBy = Automatic
+
+ column extendedLocation
+ dataType: string
+ lineageTag: a6bc54f9-1649-4b14-b916-70b557245ac4
+ summarizeBy: none
+ sourceColumn: extendedLocation
+
+ annotation SummarizationSetBy = Automatic
+
+ column properties
+ dataType: string
+ lineageTag: 5fac4a2f-7543-457b-807f-38bc02674634
+ summarizeBy: none
+ sourceColumn: properties
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.managementGroupAncestorsChain'
+ dataType: string
+ lineageTag: 59d31e9b-c76b-450d-9d6c-b7d9ab9f27c8
+ summarizeBy: none
+ sourceColumn: properties.managementGroupAncestorsChain
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'properties.state'
+ dataType: string
+ lineageTag: e279b0de-83db-4bef-b13d-442bd5049ab1
+ summarizeBy: none
+ sourceColumn: properties.state
+
+ annotation SummarizationSetBy = Automatic
+
+ partition Subscriptions = m
+ mode: import
+ queryGroup: 'Resource Graph'
+ source = ```
+ let
+ query = "
+ resourcecontainers
+ | where type == 'microsoft.resources/subscriptions'
+ | extend
+ ['properties.managementGroupAncestorsChain'] = properties.managementGroupAncestorsChain,
+ ['properties.state'] = properties.state
+ " & ftk_DemoFilter(),
+ Source = AzureResourceGraph.Query(query, "Tenant", null, null, [resultTruncated = false]),
+ NullHandling =
+ if Table.HasColumns(Source, "Results") and Table.RowCount(Source) = 1 then
+ #table(
+ { "id", "name", "type", "subscriptionId", "tenantId", "properties.managementGroupAncestorsChain", "properties.state" },
+ {}
+ )
+ else Source
+ in
+ NullHandling
+ ```
+
+ annotation PBI_NavigationStepName = Navigation
+
+ annotation PBI_ResultType = Table
+
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/VirtualMachines.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/VirtualMachines.tmdl
deleted file mode 120000
index 2590be6d5..000000000
--- a/src/power-bi/storage/Shared.Dataset/definition/tables/VirtualMachines.tmdl
+++ /dev/null
@@ -1 +0,0 @@
-../../../../kql/Shared.Dataset/definition/tables/VirtualMachines.tmdl
\ No newline at end of file
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/VirtualMachines.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/VirtualMachines.tmdl
new file mode 100644
index 000000000..542de68b7
--- /dev/null
+++ b/src/power-bi/storage/Shared.Dataset/definition/tables/VirtualMachines.tmdl
@@ -0,0 +1,632 @@
+table VirtualMachines
+ lineageTag: bc3b3e64-3016-4758-897f-eeae6043bd77
+
+ column id
+ dataType: string
+ lineageTag: aabba0f4-f3dd-44b1-8976-664cfcb25bbd
+ summarizeBy: none
+ sourceColumn: id
+
+ annotation SummarizationSetBy = Automatic
+
+ column name
+ dataType: string
+ lineageTag: 8dd0096e-87b5-452b-bf31-cdd348a545ec
+ summarizeBy: none
+ sourceColumn: name
+
+ annotation SummarizationSetBy = Automatic
+
+ column type
+ dataType: string
+ lineageTag: c1f1826b-ec65-4454-85b5-a9608023b7c0
+ summarizeBy: none
+ sourceColumn: type
+
+ annotation SummarizationSetBy = Automatic
+
+ column tenantId
+ dataType: string
+ lineageTag: 2eb7032a-6d0d-4451-898e-879c5f920271
+ summarizeBy: none
+ sourceColumn: tenantId
+
+ annotation SummarizationSetBy = Automatic
+
+ column kind
+ dataType: string
+ lineageTag: c5d56e46-717a-4805-8335-f8f484911e2d
+ summarizeBy: none
+ sourceColumn: kind
+
+ annotation SummarizationSetBy = Automatic
+
+ column location
+ dataType: string
+ lineageTag: fb708cfd-f964-48f6-940e-25f701ade205
+ summarizeBy: none
+ sourceColumn: location
+
+ annotation SummarizationSetBy = Automatic
+
+ column resourceGroup
+ dataType: string
+ lineageTag: 762718ba-a32d-438e-a57f-ffe009f61db8
+ summarizeBy: none
+ sourceColumn: resourceGroup
+
+ annotation SummarizationSetBy = Automatic
+
+ column subscriptionId
+ dataType: string
+ lineageTag: 5e2fe227-1bd7-4cb6-8a22-1f787a8833a3
+ summarizeBy: none
+ sourceColumn: subscriptionId
+
+ annotation SummarizationSetBy = Automatic
+
+ column managedBy
+ dataType: string
+ lineageTag: b240b168-1c98-4bff-bb8f-fae14f3e6869
+ summarizeBy: none
+ sourceColumn: managedBy
+
+ annotation SummarizationSetBy = Automatic
+
+ column sku
+ dataType: string
+ lineageTag: 87441a66-5602-455f-91ca-81e2745138f0
+ summarizeBy: none
+ sourceColumn: sku
+
+ annotation SummarizationSetBy = Automatic
+
+ column plan
+ dataType: string
+ lineageTag: 759ea6be-70df-4491-8002-ff8099db1738
+ summarizeBy: none
+ sourceColumn: plan
+
+ annotation SummarizationSetBy = Automatic
+
+ column provisioningState
+ dataType: string
+ lineageTag: f8c7e75f-672b-438c-bf36-d638b2f32fa7
+ summarizeBy: none
+ sourceColumn: provisioningState
+
+ annotation SummarizationSetBy = Automatic
+
+ column timeCreated
+ dataType: string
+ lineageTag: 17f797bb-49c7-4cb4-9be4-2e043232a35d
+ summarizeBy: none
+ sourceColumn: timeCreated
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'networkInterfaces.properties.deleteOption'
+ dataType: string
+ lineageTag: 554004cc-811f-4dde-862a-dac3930dfe6d
+ summarizeBy: none
+ sourceColumn: networkInterfaces.properties.deleteOption
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'networkInterfaces.id'
+ dataType: string
+ lineageTag: 939a3bed-0418-4daa-a584-2e8e22707d36
+ summarizeBy: none
+ sourceColumn: networkInterfaces.id
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'osProfile.computerName'
+ dataType: string
+ lineageTag: 991a5af1-9bcc-45b1-a61f-c96679b5299c
+ summarizeBy: none
+ sourceColumn: osProfile.computerName
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'osProfile.requireGuestProvisionSignal'
+ dataType: string
+ lineageTag: 2c1729b5-b12d-44d5-9a8a-770ecef7e443
+ summarizeBy: none
+ sourceColumn: osProfile.requireGuestProvisionSignal
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'osProfile.allowExtensionOperations'
+ dataType: string
+ lineageTag: 909cdeef-5a65-4fec-ac70-b611dd8694a3
+ summarizeBy: none
+ sourceColumn: osProfile.allowExtensionOperations
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'osProfile.adminUsername'
+ dataType: string
+ lineageTag: ca20db16-1cec-4d87-8116-fd33c1c52ab6
+ summarizeBy: none
+ sourceColumn: osProfile.adminUsername
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'osProfile.secrets'
+ dataType: string
+ lineageTag: f61d4998-0550-4787-96dc-b862adec39ad
+ summarizeBy: none
+ sourceColumn: osProfile.secrets
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'osProfile.linuxConfiguration'
+ dataType: string
+ lineageTag: 9f5d66ab-2c26-4788-acb0-4fb1124af210
+ summarizeBy: none
+ sourceColumn: osProfile.linuxConfiguration
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'osProfile.windowsConfiguration'
+ dataType: string
+ lineageTag: 9939f09a-936e-455b-9ffd-81fef08964b0
+ summarizeBy: none
+ sourceColumn: osProfile.windowsConfiguration
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'storageProfile.imageReference.publisher'
+ dataType: string
+ lineageTag: 81517633-977d-44f0-988b-b0d929045952
+ summarizeBy: none
+ sourceColumn: storageProfile.imageReference.publisher
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'storageProfile.imageReference.sku'
+ dataType: string
+ lineageTag: aeb7e0ca-2b7b-4b87-acf7-c62c9393e177
+ summarizeBy: none
+ sourceColumn: storageProfile.imageReference.sku
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'storageProfile.imageReference.version'
+ dataType: string
+ lineageTag: 3a9f2c79-ae20-49af-932b-d8d4245c5d32
+ summarizeBy: none
+ sourceColumn: storageProfile.imageReference.version
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'storageProfile.imageReference.exactVersion'
+ dataType: string
+ lineageTag: 9b0a4e2f-a55e-4e7b-8143-6a7019f53b6a
+ summarizeBy: none
+ sourceColumn: storageProfile.imageReference.exactVersion
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'storageProfile.imageReference.offer'
+ dataType: string
+ lineageTag: 157f58e3-6ce8-4397-b0db-578cc680828f
+ summarizeBy: none
+ sourceColumn: storageProfile.imageReference.offer
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'storageProfile.dataDisks.name'
+ dataType: string
+ lineageTag: 727d23eb-c156-4a16-a732-58e17c7f65ec
+ summarizeBy: none
+ sourceColumn: storageProfile.dataDisks.name
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'storageProfile.dataDisks.createOption'
+ dataType: string
+ lineageTag: 56a3f6cc-9aae-4967-937e-2cf37b34a3ec
+ summarizeBy: none
+ sourceColumn: storageProfile.dataDisks.createOption
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'storageProfile.dataDisks.deleteOption'
+ dataType: string
+ lineageTag: ee0d1c42-8700-4004-acbd-270256062de9
+ summarizeBy: none
+ sourceColumn: storageProfile.dataDisks.deleteOption
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'storageProfile.dataDisks.managedDisk.id'
+ dataType: string
+ lineageTag: d3b45be8-8d78-4075-8a06-313042ad6f88
+ summarizeBy: none
+ sourceColumn: storageProfile.dataDisks.managedDisk.id
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'storageProfile.dataDisks.caching'
+ dataType: string
+ lineageTag: c1d37b38-b93c-46bd-8408-6b61fb407dc7
+ summarizeBy: none
+ sourceColumn: storageProfile.dataDisks.caching
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'storageProfile.dataDisks.toBeDetached'
+ dataType: string
+ lineageTag: e933b3f8-fd92-4b5a-9813-18a4cd0218eb
+ summarizeBy: none
+ sourceColumn: storageProfile.dataDisks.toBeDetached
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'storageProfile.dataDisks.writeAcceleratorEnabled'
+ dataType: string
+ lineageTag: c7979256-5152-4cee-9be5-11b2408253a6
+ summarizeBy: none
+ sourceColumn: storageProfile.dataDisks.writeAcceleratorEnabled
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'storageProfile.dataDisks.lun'
+ dataType: string
+ lineageTag: 23627fcb-60b2-45f6-a257-1207e544cc63
+ summarizeBy: none
+ sourceColumn: storageProfile.dataDisks.lun
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'storageProfile.osDisk.name'
+ dataType: string
+ lineageTag: bc9c01d8-8cf3-4bca-aba4-de325bf9fb35
+ summarizeBy: none
+ sourceColumn: storageProfile.osDisk.name
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'storageProfile.osDisk.createOption'
+ dataType: string
+ lineageTag: 19288f47-9a67-48ff-ae49-a60fc4d22e3d
+ summarizeBy: none
+ sourceColumn: storageProfile.osDisk.createOption
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'storageProfile.osDisk.osType'
+ dataType: string
+ lineageTag: 52dbf86f-4936-4258-8d30-30fd7e2280ae
+ summarizeBy: none
+ sourceColumn: storageProfile.osDisk.osType
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'storageProfile.osDisk.deleteOption'
+ dataType: string
+ lineageTag: 8033fb68-7806-4d13-ae45-6d84ef8f5c9a
+ summarizeBy: none
+ sourceColumn: storageProfile.osDisk.deleteOption
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'storageProfile.osDisk.managedDisk.id'
+ dataType: string
+ lineageTag: eef9ea0b-b112-4577-a964-935f247ef493
+ summarizeBy: none
+ sourceColumn: storageProfile.osDisk.managedDisk.id
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'storageProfile.osDisk.caching'
+ dataType: string
+ lineageTag: 5301af8a-1f76-4c1d-9122-69dcf00b7594
+ summarizeBy: none
+ sourceColumn: storageProfile.osDisk.caching
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'hardwareProfile.vmSize'
+ dataType: string
+ lineageTag: 7c391f84-138d-42dc-b710-96526d722d74
+ summarizeBy: none
+ sourceColumn: hardwareProfile.vmSize
+
+ annotation SummarizationSetBy = Automatic
+
+ column vmId
+ dataType: string
+ lineageTag: 0c594826-f13f-4054-adbe-1eb9c8e0aebb
+ summarizeBy: none
+ sourceColumn: vmId
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'diagnosticsProfile.bootDiagnostics.enabled'
+ dataType: string
+ lineageTag: d5dcd997-9933-4afa-86c4-d2d4fe865970
+ summarizeBy: none
+ sourceColumn: diagnosticsProfile.bootDiagnostics.enabled
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'diagnosticsProfile.bootDiagnostics.storageUri'
+ dataType: string
+ lineageTag: 0d8d0d6a-763f-4cd9-bf2b-625d32f8dc4d
+ summarizeBy: none
+ sourceColumn: diagnosticsProfile.bootDiagnostics.storageUri
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'powerState.displayStatus'
+ dataType: string
+ lineageTag: 1138b30d-fa61-49f8-badc-879c58ca77c2
+ summarizeBy: none
+ sourceColumn: powerState.displayStatus
+
+ annotation SummarizationSetBy = Automatic
+
+ column licenseType
+ dataType: string
+ lineageTag: 15e7fcf4-e6b1-4187-b9f4-2a4841f82aff
+ summarizeBy: none
+ sourceColumn: licenseType
+
+ annotation SummarizationSetBy = Automatic
+
+ column tags
+ dataType: string
+ lineageTag: b2e67076-1777-4242-909e-69cb17d2e132
+ summarizeBy: none
+ sourceColumn: tags
+
+ annotation SummarizationSetBy = Automatic
+
+ column identity
+ dataType: string
+ lineageTag: 33acb080-037b-4ac2-a634-7d6ce12bbf1b
+ summarizeBy: none
+ sourceColumn: identity
+
+ annotation SummarizationSetBy = Automatic
+
+ column zones
+ dataType: string
+ lineageTag: 427f6ba3-edbc-42ef-b1e3-f3ccac9d62b5
+ summarizeBy: none
+ sourceColumn: zones
+
+ annotation SummarizationSetBy = Automatic
+
+ column extendedLocation
+ dataType: string
+ lineageTag: 41562289-8d10-49f5-befd-b80af1aba395
+ summarizeBy: none
+ sourceColumn: extendedLocation
+
+ annotation SummarizationSetBy = Automatic
+
+ column properties
+ dataType: string
+ lineageTag: e6dfb866-56e9-41d3-92be-51ca63dce8de
+ summarizeBy: none
+ sourceColumn: properties
+
+ annotation SummarizationSetBy = Automatic
+
+ column networkProfile
+ dataType: string
+ lineageTag: e44b9015-72d2-4fca-8c66-d453745ceda2
+ summarizeBy: none
+ sourceColumn: networkProfile
+
+ annotation SummarizationSetBy = Automatic
+
+ column osProfile
+ dataType: string
+ lineageTag: 3f7a330b-35c4-4a46-a437-bd7830c91821
+ summarizeBy: none
+ sourceColumn: osProfile
+
+ annotation SummarizationSetBy = Automatic
+
+ column storageProfile
+ dataType: string
+ lineageTag: fdffb001-8cd4-4545-a5e3-5a7625f01df0
+ summarizeBy: none
+ sourceColumn: storageProfile
+
+ annotation SummarizationSetBy = Automatic
+
+ column hardwareProfile
+ dataType: string
+ lineageTag: 998c7342-d833-46f0-87d0-671da7ad19b1
+ summarizeBy: none
+ sourceColumn: hardwareProfile
+
+ annotation SummarizationSetBy = Automatic
+
+ column diagnosticsProfile
+ dataType: string
+ lineageTag: 236da049-94eb-4611-8d87-2e621ae2d291
+ summarizeBy: none
+ sourceColumn: diagnosticsProfile
+
+ annotation SummarizationSetBy = Automatic
+
+ column extended
+ dataType: string
+ lineageTag: 91e1d8db-9b66-40af-8e05-bafa4708198b
+ summarizeBy: none
+ sourceColumn: extended
+
+ annotation SummarizationSetBy = Automatic
+
+ column networkInterfaces
+ dataType: string
+ lineageTag: bd9607d7-e154-4bf7-a5c8-bb9864896f17
+ summarizeBy: none
+ sourceColumn: networkInterfaces
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'networkInterfaces.properties'
+ dataType: string
+ lineageTag: c5159fb4-3eec-4b67-8bf5-07181160e398
+ summarizeBy: none
+ sourceColumn: networkInterfaces.properties
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'storageProfile.imageReference'
+ dataType: string
+ lineageTag: d0dbf571-2490-4b7f-8995-22c0036dfa67
+ summarizeBy: none
+ sourceColumn: storageProfile.imageReference
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'storageProfile.dataDisks'
+ dataType: string
+ lineageTag: 83e2e073-2bf8-496e-bc2c-a3553f8c5384
+ summarizeBy: none
+ sourceColumn: storageProfile.dataDisks
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'storageProfile.osDisk'
+ dataType: string
+ lineageTag: d4af0653-26d8-4e20-8305-31be6cb05548
+ summarizeBy: none
+ sourceColumn: storageProfile.osDisk
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'storageProfile.dataDisks.managedDisk'
+ dataType: string
+ lineageTag: 66cd5719-8338-4102-b1b6-0caa9bb55fa5
+ summarizeBy: none
+ sourceColumn: storageProfile.dataDisks.managedDisk
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'storageProfile.osDisk.managedDisk'
+ dataType: string
+ lineageTag: 9961ea28-ed3c-4097-b061-ca148131d6ad
+ summarizeBy: none
+ sourceColumn: storageProfile.osDisk.managedDisk
+
+ annotation SummarizationSetBy = Automatic
+
+ column 'diagnosticsProfile.bootDiagnostics'
+ dataType: string
+ lineageTag: 6f3662b6-91e3-4645-858c-ecdca8b1ef3d
+ summarizeBy: none
+ sourceColumn: diagnosticsProfile.bootDiagnostics
+
+ annotation SummarizationSetBy = Automatic
+
+ column instanceView
+ dataType: string
+ lineageTag: ec49c96b-adf9-4b6a-b5ed-a4605ea55702
+ summarizeBy: none
+ sourceColumn: instanceView
+
+ annotation SummarizationSetBy = Automatic
+
+ column powerState
+ dataType: string
+ lineageTag: 9111acad-c60b-40b3-8e7f-37cdfc80c85e
+ summarizeBy: none
+ sourceColumn: powerState
+
+ annotation SummarizationSetBy = Automatic
+
+ partition VirtualMachines = m
+ mode: import
+ queryGroup: 'Resource Graph'
+ source =
+ let
+ query = "
+ Resources
+ | where type =~ 'Microsoft.Compute/virtualMachines'
+ | extend
+ provisioningState = properties.provisioningState,
+ timeCreated = properties.timeCreated,
+ networkProfile = properties.networkProfile,
+ osProfile = properties.osProfile,
+ storageProfile = properties.storageProfile,
+ hardwareProfile = properties.hardwareProfile,
+ vmId = properties.vmId,
+ diagnosticsProfile = properties.diagnosticsProfile,
+ extended = properties.extended,
+ licenseType = properties.licenseType
+ | extend
+ ['osProfile.computerName'] = osProfile.computerName,
+ ['osProfile.requireGuestProvisionSignal'] = osProfile.requireGuestProvisionSignal,
+ ['osProfile.allowExtensionOperations'] = osProfile.allowExtensionOperations,
+ ['osProfile.adminUsername'] = osProfile.adminUsername,
+ ['osProfile.secrets'] = osProfile.secrets,
+ ['osProfile.linuxConfiguration'] = osProfile.linuxConfiguration,
+ ['osProfile.windowsConfiguration'] = osProfile.windowsConfiguration,
+ networkInterfaces = networkProfile.networkInterfaces
+ | mv-expand ['networkInterfaces']
+ | extend
+ ['networkInterfaces.properties'] = networkInterfaces.properties,
+ ['networkInterfaces.id'] = networkInterfaces.id,
+ ['networkInterfaces.properties.deleteOption'] = networkInterfaces.properties.deleteOption,
+ ['storageProfile.imageReference'] = storageProfile.imageReference,
+ ['storageProfile.dataDisks'] = storageProfile.dataDisks,
+ ['storageProfile.osDisk'] = storageProfile.osDisk,
+ ['storageProfile.imageReference.publisher'] = storageProfile.imageReference.publisher,
+ ['storageProfile.imageReference.sku'] = storageProfile.imageReference.sku,
+ ['storageProfile.imageReference.version'] = storageProfile.imageReference.version,
+ ['storageProfile.imageReference.exactVersion'] = storageProfile.imageReference.exactVersion,
+ ['storageProfile.imageReference.offer'] = storageProfile.imageReference.offer
+ | mv-expand ['storageProfile.dataDisks']
+ | extend
+ ['storageProfile.dataDisks.name'] = storageProfile.dataDisks.name,
+ ['storageProfile.dataDisks.createOption'] = storageProfile.dataDisks.createOption,
+ ['storageProfile.dataDisks.deleteOption'] = storageProfile.dataDisks.deleteOption,
+ ['storageProfile.dataDisks.managedDisk'] = storageProfile.dataDisks.managedDisk,
+ ['storageProfile.dataDisks.caching'] = storageProfile.dataDisks.caching,
+ ['storageProfile.dataDisks.toBeDetached'] = storageProfile.dataDisks.toBeDetached,
+ ['storageProfile.dataDisks.writeAcceleratorEnabled'] = storageProfile.dataDisks.writeAcceleratorEnabled,
+ ['storageProfile.dataDisks.lun'] = storageProfile.dataDisks.lun,
+ ['storageProfile.dataDisks.managedDisk.id'] = storageProfile.dataDisks.managedDisk.id,
+ ['storageProfile.osDisk.name'] = storageProfile.osDisk.name,
+ ['storageProfile.osDisk.createOption'] = storageProfile.osDisk.createOption,
+ ['storageProfile.osDisk.osType'] = storageProfile.osDisk.osType,
+ ['storageProfile.osDisk.deleteOption'] = storageProfile.osDisk.deleteOption,
+ ['storageProfile.osDisk.managedDisk'] = storageProfile.osDisk.managedDisk,
+ ['storageProfile.osDisk.caching'] = storageProfile.osDisk.caching,
+ ['storageProfile.osDisk.managedDisk.id'] = storageProfile.osDisk.managedDisk.id,
+ ['hardwareProfile.vmSize'] = hardwareProfile.vmSize,
+ ['diagnosticsProfile.bootDiagnostics'] = diagnosticsProfile.bootDiagnostics,
+ ['diagnosticsProfile.bootDiagnostics.enabled'] = diagnosticsProfile.bootDiagnostics.enabled,
+ ['diagnosticsProfile.bootDiagnostics.storageUri'] = diagnosticsProfile.bootDiagnostics.storageUri
+ | extend
+ instanceView = extended.instanceView,
+ powerState = extended.instanceView.powerState
+ | extend
+ ['powerState.displayStatus'] = powerState.displayStatus
+ | mv-expand ['zones']
+ ",
+ Source = ftk_QueryARG(query),
+ NullHandling =
+ if Source = null then
+ #table(
+ { "id", "name", "location", "resourceGroup", "provisioningState", "timeCreated", "networkProfile", "osProfile", "storageProfile", "hardwareProfile", "vmId", "diagnosticsProfile", "extended", "licenseType", "osProfile.computerName", "osProfile.requireGuestProvisionSignal", "osProfile.allowExtensionOperations", "osProfile.adminUsername", "osProfile.secrets", "osProfile.linuxConfiguration", "osProfile.windowsConfiguration", "networkInterfaces", "networkInterfaces.properties", "networkInterfaces.id", "networkInterfaces.properties.deleteOption", "storageProfile.imageReference", "storageProfile.dataDisks", "storageProfile.osDisk", "storageProfile.imageReference.publisher", "storageProfile.imageReference.sku", "storageProfile.imageReference.version", "storageProfile.imageReference.exactVersion", "storageProfile.imageReference.offer", "storageProfile.dataDisks.name", "storageProfile.dataDisks.createOption", "storageProfile.dataDisks.deleteOption", "storageProfile.dataDisks.managedDisk", "storageProfile.dataDisks.caching", "storageProfile.dataDisks.toBeDetached", "storageProfile.dataDisks.writeAcceleratorEnabled", "storageProfile.dataDisks.lun", "storageProfile.dataDisks.managedDisk.id", "storageProfile.osDisk.name", "storageProfile.osDisk.createOption", "storageProfile.osDisk.osType", "storageProfile.osDisk.deleteOption", "storageProfile.osDisk.managedDisk", "storageProfile.osDisk.caching", "storageProfile.osDisk.managedDisk.id", "hardwareProfile.vmSize", "diagnosticsProfile.bootDiagnostics", "diagnosticsProfile.bootDiagnostics.enabled", "diagnosticsProfile.bootDiagnostics.storageUri", "instanceView", "powerState", "powerState.displayStatus" },
+ {}
+ )
+ else Source
+ in
+ NullHandling
+
+ annotation PBI_NavigationStepName = Navigation
+
+ annotation PBI_ResultType = Table
+
diff --git a/src/scripts/Build-PowerBI.ps1 b/src/scripts/Build-PowerBI.ps1
index e6a67ad1a..265300eef 100644
--- a/src/scripts/Build-PowerBI.ps1
+++ b/src/scripts/Build-PowerBI.ps1
@@ -134,7 +134,7 @@ $reports | ForEach-Object {
Governance = @{
Intro = "The Cloud policy and governance report summarizes your Microsoft Cloud governance posture. It offers the standard metrics aligned with the Cloud Adoption Framework to facilitate identifying issues, applying recommendations, and resolving compliance gaps."
Tables = @("AdvisorRecommendations", "Compliance calculation", "Costs", "Disks", "ManagementGroups", "NetworkInterfaces", "NetworkSecurityGroups", "PolicyAssignments", "PolicyDefinitions", "PolicyStates", "Prices", "PricingUnits", "PublicIPAddresses", "Regions", "Resources", "ResourceTypes", "SqlDatabases", "Subscriptions", "VirtualMachines")
- Expressions = @("▶️ START HERE", "Cluster URL", "[storage]Storage URL", "Default Granularity", "Number of Months", "RangeStart", "RangeEnd", "Experimental: Add Missing Prices", "Remove Duplicate Resource IDs", "Deprecated: Perform Extra Query Optimizations", "ftk_DemoFilter", "ftk_DatetimeToJulianDate", "ftk_ImpalaToJulianDate", "ftk_Metadata", "ftk_ParseResourceId", "ftk_ParseResourceName", "ftk_ParseResourceType", "ftk_Storage")
+ Expressions = @("▶️ START HERE", "Cluster URL", "[storage]Storage URL", "Default Granularity", "Number of Months", "RangeStart", "RangeEnd", "Experimental: Add Missing Prices", "Remove Duplicate Resource IDs", "Deprecated: Perform Extra Query Optimizations", "ftk_ARGBatchSize", "ftk_DemoFilter", "ftk_QueryARG", "ftk_DatetimeToJulianDate", "ftk_ImpalaToJulianDate", "ftk_Metadata", "ftk_ParseResourceId", "ftk_ParseResourceName", "ftk_ParseResourceType", "ftk_Storage")
}
RateOptimization = @{
Intro = "The Rate optimization report provides insights into any workload optimization opportunities, like reservations, savings plans, and Azure Hybrid Benefit. This reports uses effective cost, which amortizes and breaks reservation and savings plan purchases down and allocates costs out to the resources that received the benefit. Effective cost will not match your invoice."
@@ -144,7 +144,7 @@ $reports | ForEach-Object {
WorkloadOptimization = @{
Intro = "The Workload optimization report provides insights into resource utilization and efficiency opportunities based on historical usage patterns. Use this report to determine if resources can be scaled down or even shutdown during off-peak hours to minimize wasteful usage and spending. Also consider cheaper alternatives when available and ensure all workloads have some direct or indirect link to business value to avoid unnecessary usage and costs that don't contribute to the mission."
Tables = @("AdvisorRecommendations", "Costs", "Disks", "Prices", "PricingUnits", "Resources", "Subscriptions")
- Expressions = @("▶️ START HERE", "Cluster URL", "[storage]Storage URL", "Default Granularity", "Number of Months", "RangeStart", "RangeEnd", "Experimental: Add Missing Prices", "Remove Duplicate Resource IDs", "Deprecated: Perform Extra Query Optimizations", "ftk_DemoFilter", "ftk_DatetimeToJulianDate", "ftk_ImpalaToJulianDate", "ftk_Metadata", "ftk_ParseResourceId", "ftk_ParseResourceName", "ftk_ParseResourceType", "ftk_Storage")
+ Expressions = @("▶️ START HERE", "Cluster URL", "[storage]Storage URL", "Default Granularity", "Number of Months", "RangeStart", "RangeEnd", "Experimental: Add Missing Prices", "Remove Duplicate Resource IDs", "Deprecated: Perform Extra Query Optimizations", "ftk_ARGBatchSize", "ftk_DemoFilter", "ftk_QueryARG", "ftk_DatetimeToJulianDate", "ftk_ImpalaToJulianDate", "ftk_Metadata", "ftk_ParseResourceId", "ftk_ParseResourceName", "ftk_ParseResourceType", "ftk_Storage")
}
}[$reportName]
From 65e0a7808b083586d824693541f2521f2d024429 Mon Sep 17 00:00:00 2001
From: MSBrett
Date: Fri, 31 Jul 2026 00:51:25 -0700
Subject: [PATCH 13/15] Address RolandKrummenacher review findings on ARG
batching
- Raise an explicit error instead of silently returning empty results
when the subscription-list query fails or returns an unusable shape
- Add retry with backoff and jitter around all AzureResourceGraph.Query
calls in ftk_QueryARG (kql and storage datasets)
- Document the resourcecontainers-vs-resources RBAC scope mismatch in
code comments and in governance.md / workload-optimization.md
- Document why ftk_DemoFilter() intentionally does not apply to the
unscoped (tenant/management-group) query path
- Remove unreachable Value.Is checks that try...otherwise already
narrows away
- Replace placeholder-looking lineageTag GUIDs with real random GUIDs
- Remove the stale per-batch order by SortOrder in
AdvisorReservationRecommendations (discarded by Table.Combine
anyway); fix the matching stale comment in AdvisorRecommendations
- Document that AdvisorRecommendations and AdvisorReservationRecommendations
now return complete per-batch results (resultTruncated=false via
ftk_QueryARG) instead of silently truncating, as an explicit decision
- Clarify in errors.md that the effective ARG batch size is
ftk_ARGBatchSize() times a per-table multiplier, not a flat 100
- Revert an unrelated See also / Related content restructure in
workload-optimization.md
Follow-ups tracked in #2224: hoisting the subscription-list query into
a shared/cached expression, and normalizing Table.Combine output
against each table's authoritative column list.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
---
docs-mslearn/toolkit/changelog.md | 4 +-
docs-mslearn/toolkit/help/errors.md | 6 +--
docs-mslearn/toolkit/power-bi/governance.md | 4 +-
.../toolkit/power-bi/workload-optimization.md | 16 +++++---
.../definition/expressions.tmdl | 39 ++++++++++++++-----
.../tables/AdvisorRecommendations.tmdl | 2 +-
.../AdvisorReservationRecommendations.tmdl | 4 +-
.../definition/expressions.tmdl | 39 ++++++++++++++-----
.../tables/AdvisorRecommendations.tmdl | 2 +-
.../AdvisorReservationRecommendations.tmdl | 4 +-
10 files changed, 84 insertions(+), 36 deletions(-)
diff --git a/docs-mslearn/toolkit/changelog.md b/docs-mslearn/toolkit/changelog.md
index 554a8ecd2..96399d2fc 100644
--- a/docs-mslearn/toolkit/changelog.md
+++ b/docs-mslearn/toolkit/changelog.md
@@ -3,7 +3,7 @@ title: FinOps toolkit changelog
description: Review the latest features and enhancements in the FinOps toolkit, including updates to FinOps hubs, Power BI reports, and more.
author: MSBrett
ms.author: brettwil
-ms.date: 07/30/2026
+ms.date: 07/31/2026
ms.topic: reference
ms.service: finops
ms.subservice: finops-toolkit
@@ -63,7 +63,7 @@ _Released June 2026_
- **Fixed**
- Fixed Power BI storage report refresh errors caused by ISO 8601 duration `x_SkuTerm` values (like `P3Y`) and empty strings in cost exports ([#2174](https://github.com/microsoft/finops-toolkit/issues/2174)).
- - Paginate Azure Resource Graph queries by subscription to mitigate [payload size limit](help/errors.md#response-payload-size-is-and-has-exceeded-the-limit) errors in the [Governance](power-bi/governance.md) and [Workload optimization](power-bi/workload-optimization.md) reports ([#1768](https://github.com/microsoft/finops-toolkit/issues/1768)).
+ - Paginate Azure Resource Graph queries by subscription to mitigate [payload size limit](help/errors.md#response-payload-size-is-and-has-exceeded-the-limit) errors in the [Governance](power-bi/governance.md) and [Workload optimization](power-bi/workload-optimization.md) reports ([#1768](https://github.com/microsoft/finops-toolkit/issues/1768)). Queries still surface a payload size error (rather than silently returning truncated results) if a single batch of subscriptions exceeds the limit; see [Reduce the batch size](help/errors.md#option-1-reduce-the-batch-size) for the mitigation. As part of this change, the `AdvisorRecommendations` and `AdvisorReservationRecommendations` tables now return complete (non-truncated) results per batch, matching every other batched table; previously these two tables silently dropped rows beyond the payload limit instead of erroring.
### [Data dictionary](help/data-dictionary.md) updates
diff --git a/docs-mslearn/toolkit/help/errors.md b/docs-mslearn/toolkit/help/errors.md
index bde463e44..85b00c6a6 100644
--- a/docs-mslearn/toolkit/help/errors.md
+++ b/docs-mslearn/toolkit/help/errors.md
@@ -3,7 +3,7 @@ title: Troubleshoot common FinOps toolkit errors
description: This article describes common FinOps toolkit errors and provides solutions to help you resolve issues you might encounter.
author: flanakin
ms.author: micflan
-ms.date: 07/30/2026
+ms.date: 07/31/2026
ms.topic: troubleshooting
ms.service: finops
ms.subservice: finops-toolkit
@@ -766,13 +766,13 @@ Azure Resource Graph queries in the Governance and Workload optimization Power B
> _OLE DB or ODBC error: [Expression.Error] Please provide below info when asking for support: timestamp = {timestamp}, correlationId = {guid}. Details: Response payload size is {number}, and has exceeded the limit of 16777216. Please consider querying less data at a time and make paginated call if needed._
-Azure Resource Graph enforces a 16 MB response payload limit per query. FinOps toolkit reports automatically paginate queries in batches of subscriptions (default: 100 per batch) to stay within this limit, so most environments should not encounter this error. If you still see it, it means the resources in a single batch of subscriptions exceed the 16 MB limit.
+Azure Resource Graph enforces a 16 MB response payload limit per query. FinOps toolkit reports automatically paginate queries in batches of subscriptions to stay within this limit, so most environments should not encounter this error. The base batch size is 100 subscriptions (set by the `ftk_ARGBatchSize` function), but some queries multiply this value for tables that return less data per resource, so the effective batch size varies by table. If you still see this error, it means the resources in a single batch of subscriptions exceed the 16 MB limit.
**Mitigation**: Try the following options in order:
### Option 1: Reduce the batch size
-Reduce the number of subscriptions queried in each batch:
+Reduce the base number of subscriptions queried in each batch (some tables multiply this value, so the effective batch size for those tables will still be smaller, but proportionally reduced):
1. Open Power BI Desktop and select **Transform data** from the ribbon.
2. In the **Queries** pane on the left, expand the **Functions** folder.
diff --git a/docs-mslearn/toolkit/power-bi/governance.md b/docs-mslearn/toolkit/power-bi/governance.md
index c9cd93c1a..cc8c10fc6 100644
--- a/docs-mslearn/toolkit/power-bi/governance.md
+++ b/docs-mslearn/toolkit/power-bi/governance.md
@@ -3,7 +3,7 @@ title: FinOps toolkit Governance report
description: Summarize cloud governance posture including areas like compliance, security, operations, and resource management in Power BI.
author: flanakin
ms.author: micflan
-ms.date: 07/30/2026
+ms.date: 07/31/2026
ms.topic: concept-article
ms.service: finops
ms.subservice: finops-toolkit
@@ -125,6 +125,8 @@ The Governance report uses Azure Resource Graph to query resource details. Azure
If you experience a "Response payload size... exceeded the limit" error, open the report in Power BI Desktop, go to the Power Query editor, and reduce the value returned by the `ftk_ARGBatchSize` function (default: 100). For detailed steps, see [Response payload size exceeded the limit](../help/errors.md#response-payload-size-is-and-has-exceeded-the-limit) in the error reference guide.
+Batching queries by subscription requires Reader access at the subscription level or above. If your account only has resource group-scoped access, some subscriptions may be silently excluded from the report even though you can see their resources elsewhere.
+
## Looking for more?
diff --git a/docs-mslearn/toolkit/power-bi/workload-optimization.md b/docs-mslearn/toolkit/power-bi/workload-optimization.md
index 58f97ef94..0e993163c 100644
--- a/docs-mslearn/toolkit/power-bi/workload-optimization.md
+++ b/docs-mslearn/toolkit/power-bi/workload-optimization.md
@@ -3,7 +3,7 @@ title: FinOps toolkit Workload optimization report
description: Learn about the Workload optimization report, which identifies opportunities for rightsizing and removing unused resources to enhance efficiency.
author: flanakin
ms.author: micflan
-ms.date: 07/30/2026
+ms.date: 07/31/2026
ms.topic: concept-article
ms.service: finops
ms.subservice: finops-toolkit
@@ -85,6 +85,15 @@ The Workload optimization report uses Azure Resource Graph to query resource det
If you experience a "Response payload size... exceeded the limit" error, open the report in Power BI Desktop, go to the Power Query editor, and reduce the value returned by the `ftk_ARGBatchSize` function (default: 100). For detailed steps, see [Response payload size exceeded the limit](../help/errors.md#response-payload-size-is-and-has-exceeded-the-limit) in the error reference guide.
+Batching queries by subscription requires Reader access at the subscription level or above. If your account only has resource group-scoped access, some subscriptions may be silently excluded from the report even though you can see their resources elsewhere.
+
+
+
+## See also
+
+- [Common terms](../help/terms.md)
+- [Data dictionary](../help/data-dictionary.md)
+
## Looking for more?
@@ -100,11 +109,6 @@ We'd love to hear about any reports, charts, or general reporting questions you'
## Related content
-Related resources:
-
-- [Common terms](../help/terms.md)
-- [Data dictionary](../help/data-dictionary.md)
-
Related FinOps capabilities:
- [Reporting and analytics](../../framework/understand/reporting.md)
diff --git a/src/power-bi/kql/Shared.Dataset/definition/expressions.tmdl b/src/power-bi/kql/Shared.Dataset/definition/expressions.tmdl
index d892cef1d..84be14d28 100644
--- a/src/power-bi/kql/Shared.Dataset/definition/expressions.tmdl
+++ b/src/power-bi/kql/Shared.Dataset/definition/expressions.tmdl
@@ -91,7 +91,7 @@ expression ftk_DemoFilter =
/// Number of subscriptions to include in each Azure Resource Graph query batch. Decrease if you experience payload limit errors. Default: 100.
expression ftk_ARGBatchSize = () => 100
- lineageTag: f7a1b2c3-d4e5-6789-0abc-def123456789
+ lineageTag: 8c0ab9c7-ff92-4d6f-9882-4ec18a0c041f
queryGroup: Functions
annotation PBI_NavigationStepName = Navigation
@@ -104,30 +104,51 @@ expression ftk_QueryARG =
let
defaultBatchSize = 100,
requestedBatchSize = try ftk_ARGBatchSize() * (if batchMultiplier <> null then batchMultiplier else 1) otherwise null,
- batchSize = if requestedBatchSize = null or not Value.Is(requestedBatchSize, type number) or requestedBatchSize < 1 then defaultBatchSize else Number.RoundDown(requestedBatchSize),
+ batchSize = if requestedBatchSize = null or requestedBatchSize < 1 then defaultBatchSize else Number.RoundDown(requestedBatchSize),
+ // retry each Azure Resource Graph call with a short backoff (plus jitter so concurrently-throttled batches don't all retry in lockstep) to absorb throttling: batching multiplies ARG calls per table refresh, and Power BI evaluates table partitions concurrently
+ retryDelays = {5, 10},
+ QueryARG = (q as text, optional attempt as number) as any =>
+ let
+ attemptNumber = if attempt = null then 0 else attempt,
+ attempted = try AzureResourceGraph.Query(q, "Tenant", null, null, [resultTruncated = false]),
+ result =
+ if attempted[HasError] and attemptNumber < List.Count(retryDelays) then
+ Function.InvokeAfter(() => @QueryARG(q, attemptNumber + 1), #duration(0, 0, 0, retryDelays{attemptNumber} + Number.RandomBetween(0, 3)))
+ else if attempted[HasError] then
+ error attempted[Error]
+ else
+ attempted[Value]
+ in
+ result,
+ // batch discovery requires Reader at subscription scope or above to enumerate resourcecontainers; a principal with only resource-group-scoped Reader won't see their subscription here even though they can read its resources, so their data is silently excluded from batching -- documented as a known limitation in the report docs
subQuery = "resourcecontainers | where type == 'microsoft.resources/subscriptions' | project subscriptionId" & ftk_DemoFilter(),
- Subscriptions = try AzureResourceGraph.Query(subQuery, "Tenant", null, null, [resultTruncated = false]) otherwise null,
- SubscriptionIds = if Subscriptions = null or not Value.Is(Subscriptions, type table) or Table.RowCount(Subscriptions) = 0 or not Table.HasColumns(Subscriptions, "subscriptionId") then {} else Subscriptions[subscriptionId],
+ Subscriptions = try QueryARG(subQuery) otherwise null,
+ // fail loudly instead of silently returning zero batches (indistinguishable from "refreshed successfully, no data" for every calling table) when the subscription list can't be determined at all; a well-formed empty result (zero subscriptions in scope) is treated as legitimate and passes through unchanged
+ SubscriptionIds =
+ if Subscriptions = null or not Table.HasColumns(Subscriptions, "subscriptionId") then
+ error Error.Record("DataSource.Error", "Unable to determine the list of subscriptions to query from Azure Resource Graph. Verify Resource Graph access and connectivity, then refresh again.")
+ else
+ Subscriptions[subscriptionId],
BatchCount = Number.RoundUp(List.Count(SubscriptionIds) / batchSize),
- Batches = List.Transform({0..BatchCount-1}, each
+ Batches = if BatchCount <= 0 then {} else List.Transform({0..BatchCount-1}, each
let
batchStart = _ * batchSize,
batchIds = List.Range(SubscriptionIds, batchStart, List.Min({batchSize, List.Count(SubscriptionIds) - batchStart})),
// filter within the ARG query itself (rather than the request-level "subscriptions" scope parameter) so batching logic stays entirely in M and behaves the same for every caller regardless of query shape
subFilter = " | where subscriptionId in (" & Text.Combine(List.Transform(batchIds, each "'" & _ & "'"), ",") & ")",
fullQuery = query & subFilter,
- Source = AzureResourceGraph.Query(fullQuery, "Tenant", null, null, [resultTruncated = false])
+ Source = QueryARG(fullQuery)
in
if Table.HasColumns(Source, "Results") and Table.RowCount(Source) = 1 then null else Source
),
- // some callers (for example tenant/management-group-scoped policy resources) can have a blank subscriptionId that never matches any subscription batch filter above; fetch those rows once, unbatched, when requested
- UnscopedSource = if includeUnscoped = true then (try AzureResourceGraph.Query(query & " | where isempty(subscriptionId)", "Tenant", null, null, [resultTruncated = false]) otherwise null) else null,
+ // some callers (for example tenant/management-group-scoped policy resources) can have a blank subscriptionId that never matches any subscription batch filter above; fetch those rows once, unbatched, when requested. ftk_DemoFilter() intentionally isn't applied here since these rows aren't tied to any specific subscription, so demo scoping can't cleanly narrow them
+ UnscopedSource = if includeUnscoped = true then (try QueryARG(query & " | where isempty(subscriptionId)") otherwise null) else null,
UnscopedFiltered = if UnscopedSource <> null and not (Table.HasColumns(UnscopedSource, "Results") and Table.RowCount(UnscopedSource) = 1) then UnscopedSource else null,
Filtered = List.RemoveNulls(Batches & {UnscopedFiltered}),
Combined = if List.Count(Filtered) > 0 then Table.Combine(Filtered) else null
in
Combined
- lineageTag: a1b2c3d4-e5f6-7890-abcd-ef1234567890
+ lineageTag: b4bb963c-20fd-4e46-8c14-7ecc59559bf7
queryGroup: Functions
annotation PBI_NavigationStepName = Navigation
diff --git a/src/power-bi/kql/Shared.Dataset/definition/tables/AdvisorRecommendations.tmdl b/src/power-bi/kql/Shared.Dataset/definition/tables/AdvisorRecommendations.tmdl
index 3a138bf3e..c52609f1f 100644
--- a/src/power-bi/kql/Shared.Dataset/definition/tables/AdvisorRecommendations.tmdl
+++ b/src/power-bi/kql/Shared.Dataset/definition/tables/AdvisorRecommendations.tmdl
@@ -538,7 +538,7 @@ table AdvisorRecommendations
{"properties.extendedProperties.ObservationPeriodEndDate", type datetimezone},
{"properties.lastUpdated", type datetimezone}
}, "en-US"),
- // Table.Combine concatenates per-batch results, so re-sort here to restore the global SortOrder ordering that the per-batch KQL "order by" only guarantees within each batch
+ // Table.Combine concatenates per-batch results in batch order, so re-sort here to restore SortOrder ordering across the combined table
Sorted = Table.Sort(Types, {{"SortOrder", Order.Ascending}})
in
Sorted
diff --git a/src/power-bi/kql/Shared.Dataset/definition/tables/AdvisorReservationRecommendations.tmdl b/src/power-bi/kql/Shared.Dataset/definition/tables/AdvisorReservationRecommendations.tmdl
index 3b9a01a0b..2dab7934a 100644
--- a/src/power-bi/kql/Shared.Dataset/definition/tables/AdvisorReservationRecommendations.tmdl
+++ b/src/power-bi/kql/Shared.Dataset/definition/tables/AdvisorReservationRecommendations.tmdl
@@ -491,7 +491,6 @@ table AdvisorReservationRecommendations
['properties.resourceMetadata.source'] = properties.resourceMetadata.source,
recommendedActions = iff(isnotempty(properties.extendedProperties.displaySKU), strcat(properties.extendedProperties.displaySKU, ' virtual machines in ', properties.extendedProperties.location), tostring(properties.shortDescription.solution)),
SortOrder = case(properties.impact == 'High', 1, properties.impact == 'Medium', 2, properties.impact == 'Low', 3, 9)
- | order by SortOrder asc
",
Source = ftk_QueryARG(query, 2),
NullHandling =
@@ -506,13 +505,14 @@ table AdvisorReservationRecommendations
{"properties.extendedProperties.savingsAmount", type number},
{"properties.extendedProperties.qty", Int64.Type},
{"properties.extendedProperties.displayQty", Int64.Type},
+ {"properties.extendedProperties.lookbackPeriod", Int64.Type},
{"properties.extendedProperties.targetResourceCount", Int64.Type},
{"SortOrder", type number},
{"properties.extendedProperties.ObservationPeriodStartDate", type datetimezone},
{"properties.extendedProperties.ObservationPeriodEndDate", type datetimezone},
{"properties.lastUpdated", type datetimezone}
}, "en-US"),
- // Table.Combine concatenates per-batch results, so re-sort here to restore the global SortOrder ordering that the per-batch KQL "order by" only guarantees within each batch
+ // Table.Combine concatenates per-batch results in batch order, so re-sort here to restore SortOrder ordering across the combined table
Sorted = Table.Sort(Types, {{"SortOrder", Order.Ascending}})
in
Sorted
diff --git a/src/power-bi/storage/Shared.Dataset/definition/expressions.tmdl b/src/power-bi/storage/Shared.Dataset/definition/expressions.tmdl
index 4da04b9e1..880524418 100644
--- a/src/power-bi/storage/Shared.Dataset/definition/expressions.tmdl
+++ b/src/power-bi/storage/Shared.Dataset/definition/expressions.tmdl
@@ -498,7 +498,7 @@ expression ftk_DemoFilter =
/// Number of subscriptions to include in each Azure Resource Graph query batch. Decrease if you experience payload limit errors. Default: 100.
expression ftk_ARGBatchSize = () => 100
- lineageTag: f7a1b2c3-d4e5-6789-0abc-def123456790
+ lineageTag: fae47c04-ebf8-427a-b42d-9cf1812d7d0c
queryGroup: Functions
annotation PBI_NavigationStepName = Navigation
@@ -511,30 +511,51 @@ expression ftk_QueryARG =
let
defaultBatchSize = 100,
requestedBatchSize = try ftk_ARGBatchSize() * (if batchMultiplier <> null then batchMultiplier else 1) otherwise null,
- batchSize = if requestedBatchSize = null or not Value.Is(requestedBatchSize, type number) or requestedBatchSize < 1 then defaultBatchSize else Number.RoundDown(requestedBatchSize),
+ batchSize = if requestedBatchSize = null or requestedBatchSize < 1 then defaultBatchSize else Number.RoundDown(requestedBatchSize),
+ // retry each Azure Resource Graph call with a short backoff (plus jitter so concurrently-throttled batches don't all retry in lockstep) to absorb throttling: batching multiplies ARG calls per table refresh, and Power BI evaluates table partitions concurrently
+ retryDelays = {5, 10},
+ QueryARG = (q as text, optional attempt as number) as any =>
+ let
+ attemptNumber = if attempt = null then 0 else attempt,
+ attempted = try AzureResourceGraph.Query(q, "Tenant", null, null, [resultTruncated = false]),
+ result =
+ if attempted[HasError] and attemptNumber < List.Count(retryDelays) then
+ Function.InvokeAfter(() => @QueryARG(q, attemptNumber + 1), #duration(0, 0, 0, retryDelays{attemptNumber} + Number.RandomBetween(0, 3)))
+ else if attempted[HasError] then
+ error attempted[Error]
+ else
+ attempted[Value]
+ in
+ result,
+ // batch discovery requires Reader at subscription scope or above to enumerate resourcecontainers; a principal with only resource-group-scoped Reader won't see their subscription here even though they can read its resources, so their data is silently excluded from batching -- documented as a known limitation in the report docs
subQuery = "resourcecontainers | where type == 'microsoft.resources/subscriptions' | project subscriptionId" & ftk_DemoFilter(),
- Subscriptions = try AzureResourceGraph.Query(subQuery, "Tenant", null, null, [resultTruncated = false]) otherwise null,
- SubscriptionIds = if Subscriptions = null or not Value.Is(Subscriptions, type table) or Table.RowCount(Subscriptions) = 0 or not Table.HasColumns(Subscriptions, "subscriptionId") then {} else Subscriptions[subscriptionId],
+ Subscriptions = try QueryARG(subQuery) otherwise null,
+ // fail loudly instead of silently returning zero batches (indistinguishable from "refreshed successfully, no data" for every calling table) when the subscription list can't be determined at all; a well-formed empty result (zero subscriptions in scope) is treated as legitimate and passes through unchanged
+ SubscriptionIds =
+ if Subscriptions = null or not Table.HasColumns(Subscriptions, "subscriptionId") then
+ error Error.Record("DataSource.Error", "Unable to determine the list of subscriptions to query from Azure Resource Graph. Verify Resource Graph access and connectivity, then refresh again.")
+ else
+ Subscriptions[subscriptionId],
BatchCount = Number.RoundUp(List.Count(SubscriptionIds) / batchSize),
- Batches = List.Transform({0..BatchCount-1}, each
+ Batches = if BatchCount <= 0 then {} else List.Transform({0..BatchCount-1}, each
let
batchStart = _ * batchSize,
batchIds = List.Range(SubscriptionIds, batchStart, List.Min({batchSize, List.Count(SubscriptionIds) - batchStart})),
// filter within the ARG query itself (rather than the request-level "subscriptions" scope parameter) so batching logic stays entirely in M and behaves the same for every caller regardless of query shape
subFilter = " | where subscriptionId in (" & Text.Combine(List.Transform(batchIds, each "'" & _ & "'"), ",") & ")",
fullQuery = query & subFilter,
- Source = AzureResourceGraph.Query(fullQuery, "Tenant", null, null, [resultTruncated = false])
+ Source = QueryARG(fullQuery)
in
if Table.HasColumns(Source, "Results") and Table.RowCount(Source) = 1 then null else Source
),
- // some callers (for example tenant/management-group-scoped policy resources) can have a blank subscriptionId that never matches any subscription batch filter above; fetch those rows once, unbatched, when requested
- UnscopedSource = if includeUnscoped = true then (try AzureResourceGraph.Query(query & " | where isempty(subscriptionId)", "Tenant", null, null, [resultTruncated = false]) otherwise null) else null,
+ // some callers (for example tenant/management-group-scoped policy resources) can have a blank subscriptionId that never matches any subscription batch filter above; fetch those rows once, unbatched, when requested. ftk_DemoFilter() intentionally isn't applied here since these rows aren't tied to any specific subscription, so demo scoping can't cleanly narrow them
+ UnscopedSource = if includeUnscoped = true then (try QueryARG(query & " | where isempty(subscriptionId)") otherwise null) else null,
UnscopedFiltered = if UnscopedSource <> null and not (Table.HasColumns(UnscopedSource, "Results") and Table.RowCount(UnscopedSource) = 1) then UnscopedSource else null,
Filtered = List.RemoveNulls(Batches & {UnscopedFiltered}),
Combined = if List.Count(Filtered) > 0 then Table.Combine(Filtered) else null
in
Combined
- lineageTag: a1b2c3d4-e5f6-7890-abcd-ef1234567891
+ lineageTag: 3936faef-af62-4562-b1cd-270516e5b91e
queryGroup: Functions
annotation PBI_NavigationStepName = Navigation
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/AdvisorRecommendations.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/AdvisorRecommendations.tmdl
index 3a138bf3e..c52609f1f 100644
--- a/src/power-bi/storage/Shared.Dataset/definition/tables/AdvisorRecommendations.tmdl
+++ b/src/power-bi/storage/Shared.Dataset/definition/tables/AdvisorRecommendations.tmdl
@@ -538,7 +538,7 @@ table AdvisorRecommendations
{"properties.extendedProperties.ObservationPeriodEndDate", type datetimezone},
{"properties.lastUpdated", type datetimezone}
}, "en-US"),
- // Table.Combine concatenates per-batch results, so re-sort here to restore the global SortOrder ordering that the per-batch KQL "order by" only guarantees within each batch
+ // Table.Combine concatenates per-batch results in batch order, so re-sort here to restore SortOrder ordering across the combined table
Sorted = Table.Sort(Types, {{"SortOrder", Order.Ascending}})
in
Sorted
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/AdvisorReservationRecommendations.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/AdvisorReservationRecommendations.tmdl
index 3b9a01a0b..2dab7934a 100644
--- a/src/power-bi/storage/Shared.Dataset/definition/tables/AdvisorReservationRecommendations.tmdl
+++ b/src/power-bi/storage/Shared.Dataset/definition/tables/AdvisorReservationRecommendations.tmdl
@@ -491,7 +491,6 @@ table AdvisorReservationRecommendations
['properties.resourceMetadata.source'] = properties.resourceMetadata.source,
recommendedActions = iff(isnotempty(properties.extendedProperties.displaySKU), strcat(properties.extendedProperties.displaySKU, ' virtual machines in ', properties.extendedProperties.location), tostring(properties.shortDescription.solution)),
SortOrder = case(properties.impact == 'High', 1, properties.impact == 'Medium', 2, properties.impact == 'Low', 3, 9)
- | order by SortOrder asc
",
Source = ftk_QueryARG(query, 2),
NullHandling =
@@ -506,13 +505,14 @@ table AdvisorReservationRecommendations
{"properties.extendedProperties.savingsAmount", type number},
{"properties.extendedProperties.qty", Int64.Type},
{"properties.extendedProperties.displayQty", Int64.Type},
+ {"properties.extendedProperties.lookbackPeriod", Int64.Type},
{"properties.extendedProperties.targetResourceCount", Int64.Type},
{"SortOrder", type number},
{"properties.extendedProperties.ObservationPeriodStartDate", type datetimezone},
{"properties.extendedProperties.ObservationPeriodEndDate", type datetimezone},
{"properties.lastUpdated", type datetimezone}
}, "en-US"),
- // Table.Combine concatenates per-batch results, so re-sort here to restore the global SortOrder ordering that the per-batch KQL "order by" only guarantees within each batch
+ // Table.Combine concatenates per-batch results in batch order, so re-sort here to restore SortOrder ordering across the combined table
Sorted = Table.Sort(Types, {{"SortOrder", Order.Ascending}})
in
Sorted
From 98a095649efb61fc6f614cfdf526f4816cdb0633 Mon Sep 17 00:00:00 2001
From: MSBrett
Date: Sun, 2 Aug 2026 02:25:07 -0700
Subject: [PATCH 14/15] Use native properties.subscriptionId in PolicyStates
instead of splitting id
Azure Policy Insights populates properties.subscriptionId natively as
the subscription of the resource each policy state row evaluates, so
prefer it over reconstructing the value from the resource id string.
Avoids casing/shape edge cases in the split-based approach. Behavior
is unchanged: a missing/null value still yields an empty string via
tostring(), matching the prior iff(...) fallback for tenant- and
management-group-scoped rows.
PolicyAssignments.tmdl keeps its split(id, '/')-based derivation since
it has no equivalent native field.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
---
.../kql/Shared.Dataset/definition/tables/PolicyStates.tmdl | 2 +-
.../storage/Shared.Dataset/definition/tables/PolicyStates.tmdl | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/power-bi/kql/Shared.Dataset/definition/tables/PolicyStates.tmdl b/src/power-bi/kql/Shared.Dataset/definition/tables/PolicyStates.tmdl
index 1a040b34e..ac544bf17 100644
--- a/src/power-bi/kql/Shared.Dataset/definition/tables/PolicyStates.tmdl
+++ b/src/power-bi/kql/Shared.Dataset/definition/tables/PolicyStates.tmdl
@@ -344,7 +344,7 @@ table PolicyStates
query = "
policyResources
| where type =~'Microsoft.PolicyInsights/PolicyStates'
- | extend subscriptionId = iff(tolower(tostring(split(id, '/')[1])) == 'subscriptions', tostring(split(id, '/')[2]), '')
+ | extend subscriptionId = tostring(properties.subscriptionId)
| extend
['properties.policyAssignmentParameters'] = properties.policyAssignmentParameters,
['properties.policyDefinitionAction'] = properties.policyDefinitionAction,
diff --git a/src/power-bi/storage/Shared.Dataset/definition/tables/PolicyStates.tmdl b/src/power-bi/storage/Shared.Dataset/definition/tables/PolicyStates.tmdl
index 1a040b34e..ac544bf17 100644
--- a/src/power-bi/storage/Shared.Dataset/definition/tables/PolicyStates.tmdl
+++ b/src/power-bi/storage/Shared.Dataset/definition/tables/PolicyStates.tmdl
@@ -344,7 +344,7 @@ table PolicyStates
query = "
policyResources
| where type =~'Microsoft.PolicyInsights/PolicyStates'
- | extend subscriptionId = iff(tolower(tostring(split(id, '/')[1])) == 'subscriptions', tostring(split(id, '/')[2]), '')
+ | extend subscriptionId = tostring(properties.subscriptionId)
| extend
['properties.policyAssignmentParameters'] = properties.policyAssignmentParameters,
['properties.policyDefinitionAction'] = properties.policyDefinitionAction,
From 5d0e7d84eef66fd32a6f29928be4d64dd8eb829e Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
Date: Sun, 2 Aug 2026 09:25:53 +0000
Subject: [PATCH 15/15] chore: Update ms.date in docs-mslearn files
---
docs-mslearn/toolkit/changelog.md | 2 +-
docs-mslearn/toolkit/help/errors.md | 2 +-
docs-mslearn/toolkit/power-bi/governance.md | 2 +-
docs-mslearn/toolkit/power-bi/workload-optimization.md | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/docs-mslearn/toolkit/changelog.md b/docs-mslearn/toolkit/changelog.md
index fca362a64..7933cbe76 100644
--- a/docs-mslearn/toolkit/changelog.md
+++ b/docs-mslearn/toolkit/changelog.md
@@ -3,7 +3,7 @@ title: FinOps toolkit changelog
description: Review the latest features and enhancements in the FinOps toolkit, including updates to FinOps hubs, Power BI reports, and more.
author: MSBrett
ms.author: brettwil
-ms.date: 07/31/2026
+ms.date: 08/02/2026
ms.topic: reference
ms.service: finops
ms.subservice: finops-toolkit
diff --git a/docs-mslearn/toolkit/help/errors.md b/docs-mslearn/toolkit/help/errors.md
index 85b00c6a6..b3c1fef0f 100644
--- a/docs-mslearn/toolkit/help/errors.md
+++ b/docs-mslearn/toolkit/help/errors.md
@@ -3,7 +3,7 @@ title: Troubleshoot common FinOps toolkit errors
description: This article describes common FinOps toolkit errors and provides solutions to help you resolve issues you might encounter.
author: flanakin
ms.author: micflan
-ms.date: 07/31/2026
+ms.date: 08/02/2026
ms.topic: troubleshooting
ms.service: finops
ms.subservice: finops-toolkit
diff --git a/docs-mslearn/toolkit/power-bi/governance.md b/docs-mslearn/toolkit/power-bi/governance.md
index cc8c10fc6..371791dc8 100644
--- a/docs-mslearn/toolkit/power-bi/governance.md
+++ b/docs-mslearn/toolkit/power-bi/governance.md
@@ -3,7 +3,7 @@ title: FinOps toolkit Governance report
description: Summarize cloud governance posture including areas like compliance, security, operations, and resource management in Power BI.
author: flanakin
ms.author: micflan
-ms.date: 07/31/2026
+ms.date: 08/02/2026
ms.topic: concept-article
ms.service: finops
ms.subservice: finops-toolkit
diff --git a/docs-mslearn/toolkit/power-bi/workload-optimization.md b/docs-mslearn/toolkit/power-bi/workload-optimization.md
index 0e993163c..71170662b 100644
--- a/docs-mslearn/toolkit/power-bi/workload-optimization.md
+++ b/docs-mslearn/toolkit/power-bi/workload-optimization.md
@@ -3,7 +3,7 @@ title: FinOps toolkit Workload optimization report
description: Learn about the Workload optimization report, which identifies opportunities for rightsizing and removing unused resources to enhance efficiency.
author: flanakin
ms.author: micflan
-ms.date: 07/31/2026
+ms.date: 08/02/2026
ms.topic: concept-article
ms.service: finops
ms.subservice: finops-toolkit