Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions docs-mslearn/toolkit/changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,13 @@ _Released June 2026_

### [Power BI reports](power-bi/reports.md) v15

- **Added**
- Added the new FOCUS 1.3 and 1.4 columns to the Costs table in KQL and storage reports: `AllocatedMethodDetails`, `AllocatedMethodId`, `AllocatedResourceId`, `AllocatedResourceName`, `AllocatedTags`, `CommitmentProgramEligibilityDetails`, `ContractApplied`, the 12 `ContractCommitment*` columns, `HostProviderName`, `InvoiceDetailId`, and `ServiceProviderName` ([#2120](https://github.com/microsoft/finops-toolkit/issues/2120)).
- **Changed**
- Updated KQL reports to use the FinOps hubs `v1_4` schema (`Costs_v1_4()` and `Recommendations_v1_4()`) for FOCUS 1.4 ([#2120](https://github.com/microsoft/finops-toolkit/issues/2120)).
- Updated storage reports to align FOCUS 1.0-1.4 exports to the FOCUS 1.4 schema and to detect FOCUS 1.4 data when identifying the source version.
- **Deprecated**
- Deprecated the `ProviderName` and `PublisherName` columns in the Costs table. Both columns are retained for backward compatibility and are populated from the FOCUS 1.3 replacements, `HostProviderName` and `ServiceProviderName`, when not available in the source data.
- **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)).

Expand Down
5 changes: 3 additions & 2 deletions docs-mslearn/toolkit/hubs/compatibility.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ title: Compatibility guide
description: Learn which Power BI report versions are compatible with each FinOps hubs version to ensure seamless upgrades and data integrity.
author: flanakin
ms.author: micflan
ms.date: 04/01/2026
ms.date: 07/16/2026
ms.topic: concept-article
ms.service: finops
ms.subservice: finops-toolkit
Expand Down Expand Up @@ -33,7 +33,8 @@ The Power BI version refers to the Power BI reports made available within that s

| Cost Management exports | FinOps hubs | Storage path | Power BI | Notes |
| ----------------------------------------- | ----------- | ---------------------------------- | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| FOCUS costs, prices, reservation datasets | 12+ | {dataset}/{yyyy}/{MM}/{scope} | 12+Β² | KQL reports use the FinOps hubs v1_2 schema for FOCUS 1.2 |
| FOCUS costs, prices, reservation datasets | 15+ | {dataset}/{yyyy}/{MM}/{scope} | 15+Β² | KQL reports use the FinOps hubs v1_4 schema for FOCUS 1.4 |
| FOCUS costs, prices, reservation datasets | 12+ | {dataset}/{yyyy}/{MM}/{scope} | 12-14Β² | KQL reports use the FinOps hubs v1_2 schema for FOCUS 1.2 |
| FOCUS costs, prices, reservation datasets | 0.8+ | {dataset}/{yyyy}/{MM}/{scope} | 0.7-0.11Β² | |
| FOCUS costs, prices, reservation datasets | 0.7 | {dataset}/{yyyy}/{MM}/{scope}ΒΉ | 0.7+Β² | Storage path updated to new dataset names that support joining multiple related datasets together |
| FOCUS costs, prices, reservation datasets | 0.6 | {export-type}/{yyyy}/{MM}/{scope} | 0.6+ | Reservation recommendations pulled from hub storage |
Expand Down
214 changes: 213 additions & 1 deletion src/power-bi/kql/Shared.Dataset/definition/tables/Costs.tmdl
Original file line number Diff line number Diff line change
Expand Up @@ -1848,6 +1848,210 @@ table Costs

annotation SummarizationSetBy = Automatic

column AllocatedMethodDetails
dataType: string
sourceProviderType: nvarchar(max)
lineageTag: 55113e62-acbf-4acb-b0e1-41854cefeadc
summarizeBy: none
sourceColumn: AllocatedMethodDetails

annotation SummarizationSetBy = Automatic

column AllocatedMethodId
dataType: string
sourceProviderType: nvarchar(max)
lineageTag: 8256f9c9-1499-49ff-9d84-e528dc8dd3b5
summarizeBy: none
sourceColumn: AllocatedMethodId

annotation SummarizationSetBy = Automatic

column AllocatedResourceId
dataType: string
sourceProviderType: nvarchar(max)
lineageTag: ce5ffa08-514d-41c4-b3f9-ad22054d5b6e
summarizeBy: none
sourceColumn: AllocatedResourceId

annotation SummarizationSetBy = Automatic

column AllocatedResourceName
dataType: string
sourceProviderType: nvarchar(max)
lineageTag: 505ecaae-5603-46a4-9c7d-c2a93f84350f
summarizeBy: none
sourceColumn: AllocatedResourceName

annotation SummarizationSetBy = Automatic

column AllocatedTags
dataType: string
sourceProviderType: nvarchar(max)
lineageTag: 0c09f14d-e1b7-48a3-a51d-dbe9c65c7a4e
summarizeBy: none
sourceColumn: AllocatedTags

annotation SummarizationSetBy = Automatic

column CommitmentProgramEligibilityDetails
dataType: string
sourceProviderType: nvarchar(max)
lineageTag: e0a419cd-689a-4667-96e7-848817cf3140
summarizeBy: none
sourceColumn: CommitmentProgramEligibilityDetails

annotation SummarizationSetBy = Automatic

column ContractApplied
dataType: string
sourceProviderType: nvarchar(max)
lineageTag: 8e7d2334-99f6-4b4f-8683-2c3c9a535719
summarizeBy: none
sourceColumn: ContractApplied

annotation SummarizationSetBy = Automatic

column ContractCommitmentBenefitCategory
dataType: string
sourceProviderType: nvarchar(max)
lineageTag: c1b085bd-8b41-4947-adf8-3f7b295f7b02
summarizeBy: none
sourceColumn: ContractCommitmentBenefitCategory

annotation SummarizationSetBy = Automatic

column ContractCommitmentCreated
dataType: dateTime
formatString: General Date
sourceProviderType: datetimeoffset
lineageTag: b881035d-76ff-43bc-83ab-72f7c9ff9912
summarizeBy: none
sourceColumn: ContractCommitmentCreated

annotation SummarizationSetBy = Automatic

column ContractCommitmentDiscountPercentage
dataType: double
sourceProviderType: decimal
lineageTag: 3acab673-4552-4996-aa7e-8b04a05f8ea3
summarizeBy: none
sourceColumn: ContractCommitmentDiscountPercentage

annotation SummarizationSetBy = Automatic

annotation PBI_FormatHint = {"isGeneralNumber":true}

column ContractCommitmentDurationType
dataType: string
sourceProviderType: nvarchar(max)
lineageTag: 495b8505-e715-47fc-a27e-4834d2a1e3f6
summarizeBy: none
sourceColumn: ContractCommitmentDurationType

annotation SummarizationSetBy = Automatic

column ContractCommitmentFulfillmentInterval
dataType: string
sourceProviderType: nvarchar(max)
lineageTag: 0b54f930-ae2b-4efd-8422-fa6e56971946
summarizeBy: none
sourceColumn: ContractCommitmentFulfillmentInterval

annotation SummarizationSetBy = Automatic

column ContractCommitmentLastUpdated
dataType: dateTime
formatString: General Date
sourceProviderType: datetimeoffset
lineageTag: 58258b25-f8e3-45f8-862d-86e433720454
summarizeBy: none
sourceColumn: ContractCommitmentLastUpdated

annotation SummarizationSetBy = Automatic

column ContractCommitmentLifecycleStatus
dataType: string
sourceProviderType: nvarchar(max)
lineageTag: b09906a8-b301-4cdb-920a-dd91fcb40e1b
summarizeBy: none
sourceColumn: ContractCommitmentLifecycleStatus

annotation SummarizationSetBy = Automatic

column ContractCommitmentModel
dataType: string
sourceProviderType: nvarchar(max)
lineageTag: f79edd03-14c9-4a89-a877-fe9bcf3e6c8a
summarizeBy: none
sourceColumn: ContractCommitmentModel

annotation SummarizationSetBy = Automatic

column ContractCommitmentOfferCategory
dataType: string
sourceProviderType: nvarchar(max)
lineageTag: d2bc0b21-e86c-4ff2-9085-bb4fdd816e6b
summarizeBy: none
sourceColumn: ContractCommitmentOfferCategory

annotation SummarizationSetBy = Automatic

column ContractCommitmentPaymentInterval
dataType: string
sourceProviderType: nvarchar(max)
lineageTag: 4e174c85-2d67-4a8a-a8fb-63b1bdd9de4b
summarizeBy: none
sourceColumn: ContractCommitmentPaymentInterval

annotation SummarizationSetBy = Automatic

column ContractCommitmentPaymentModel
dataType: string
sourceProviderType: nvarchar(max)
lineageTag: 9ec28b52-c4c7-499e-abc8-62254bd7a94d
summarizeBy: none
sourceColumn: ContractCommitmentPaymentModel

annotation SummarizationSetBy = Automatic

column ContractCommitmentPaymentUpfrontPercentage
dataType: double
sourceProviderType: decimal
lineageTag: a7a0be0e-0f44-4c34-b313-0ae2a2e692a0
summarizeBy: none
sourceColumn: ContractCommitmentPaymentUpfrontPercentage

annotation SummarizationSetBy = Automatic

annotation PBI_FormatHint = {"isGeneralNumber":true}

column HostProviderName
dataType: string
sourceProviderType: nvarchar(max)
lineageTag: 5b7f174f-09d5-4c7b-9f51-4486012cf9d3
summarizeBy: none
sourceColumn: HostProviderName

annotation SummarizationSetBy = Automatic

column InvoiceDetailId
dataType: string
sourceProviderType: nvarchar(max)
lineageTag: f338213d-a52c-4fbd-8865-8f9e2ced5907
summarizeBy: none
sourceColumn: InvoiceDetailId

annotation SummarizationSetBy = Automatic

column ServiceProviderName
dataType: string
sourceProviderType: nvarchar(max)
lineageTag: d3d89090-75d9-4695-9df3-1758ab163a73
summarizeBy: none
sourceColumn: ServiceProviderName

annotation SummarizationSetBy = Automatic

hierarchy 'Service Hierarchy'
lineageTag: 039a7b6d-f19d-4a79-91b3-a05fbc778704

Expand Down Expand Up @@ -1886,7 +2090,11 @@ table Costs
Source = AzureDataExplorer.Contents(#"Cluster URL", "Hub", "


Costs_v1_2
Costs_v1_4
//
// Deprecated columns -- Removed from FOCUS in 1.3; retained for backward compatibility with existing visuals and custom reports
| extend ProviderName = HostProviderName
| extend PublisherName = ServiceProviderName
//
// Apply summarization settings
| where ChargePeriodStart >= monthsago(" & lookback & ")
Expand Down Expand Up @@ -1952,6 +2160,10 @@ table Costs
)
) else "") & "
//
| extend AllocatedMethodDetails = tostring(AllocatedMethodDetails)
| extend AllocatedTags = tostring(AllocatedTags)
| extend CommitmentProgramEligibilityDetails = tostring(CommitmentProgramEligibilityDetails)
| extend ContractApplied = tostring(ContractApplied)
| extend SkuPriceDetails = tostring(SkuPriceDetails)
| extend Tags = tostring(Tags)
| extend x_SkuDetails = tostring(x_SkuDetails)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,7 @@ table ReservationRecommendations
let
Source = AzureDataExplorer.Contents(#"Cluster URL", "Hub", "

Recommendations_v1_2
Recommendations_v1_4
| where x_SourceProvider == 'Microsoft' and x_SourceType == 'ReservationRecommendations'
| extend RegionId = tostring(x_RecommendationDetails.RegionId)
| extend RegionName = tostring(x_RecommendationDetails.RegionName)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -326,7 +326,11 @@ expression ftk_Storage = ```
"x_SourceType", each data),
"x_SourceVersion",
// TODO: Extract from the manifest
each if data = "focuscost" then (if Table.HasColumns(FilterRowsByDate, {"ChargeSubcategory"}) and [ChargeSubcategory] <> null then "1.0-preview(v1)" else "1.0")
each if data = "focuscost" then (
if Table.HasColumns(FilterRowsByDate, {"ServiceProviderName"}) and [ServiceProviderName] <> null then "1.4"
else if Table.HasColumns(FilterRowsByDate, {"ChargeSubcategory"}) and [ChargeSubcategory] <> null then "1.0-preview(v1)"
else if Table.HasColumns(FilterRowsByDate, {"InvoiceId"}) and [InvoiceId] <> null then "1.2"
else "1.0")
else if data = "pricesheet" then "2023-05-01"
else if data = "reservationdetails" then "2023-03-01"
else if data = "reservationtransactions" then "2023-05-01"
Expand Down
Loading