Skip to content

Commit 859178d

Browse files
author
Zac Larsen
committed
Merge remote-tracking branch 'origin/dev' into feature/finops-multitool
# Conflicts: # docs-mslearn/toolkit/changelog.md
2 parents bf2d27b + 28b11e5 commit 859178d

23 files changed

Lines changed: 38408 additions & 37239 deletions

‎.github/workflows/dev.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ jobs:
1717
runs-on: Windows-latest
1818
steps:
1919
- name: Install and cache PowerShell modules
20-
uses: potatoqualitee/psmodulecache@ee5e9494714abf56f6efbfa51527b2aec5c761b8 # v6.2.1
20+
uses: potatoqualitee/psmodulecache@9e4b63833c22c1768d648e115a9c849afdda22a5 # v6.3
2121
with:
2222
modules-to-cache: InvokeBuild, PSScriptAnalyzer, Pester:6.0.0, Az.Accounts, Az.Resources
2323
shell: pwsh

‎.github/workflows/opendata-instance-size-flexibility.yml‎

Lines changed: 45 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ on:
1515
# so the subscription only serves as an API routing scope.
1616
permissions:
1717
contents: write
18-
pull-requests: write
1918
id-token: write
2019

2120
jobs:
@@ -45,25 +44,11 @@ jobs:
4544
shell: pwsh
4645
run: src/scripts/Update-InstanceSizeFlexibility.ps1
4746

48-
- name: Create PR if data changed
49-
env:
50-
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
51-
PR_BODY: |
52-
## Summary
53-
54-
Weekly automated update of instance size flexibility (ISF) ratios from the
55-
[Azure Reservations Catalogs API](https://learn.microsoft.com/azure/cost-management-billing/reservations/instance-size-flexibility#extract-instance-size-flexibility-ratios-using-azure-catalogs-api).
56-
57-
This file maps each ARM SKU to its instance size flexibility group and ratio,
58-
replacing the deprecated `AutofitComboMeterData.csv` and `isfratioblob.csv` files
59-
that were hosted on `ccmstorageprod.blob.core.windows.net` (retired 30 Aug 2026).
60-
61-
## Test plan
62-
63-
- [ ] Review the diff for unexpected changes (large drops in group/SKU count, etc.)
64-
- [ ] Spot-check a few SKUs against the Azure Pricing Calculator
65-
66-
🤖 Generated by the **Update Instance Size Flexibility** workflow
47+
# GitHub Actions is not permitted to open pull requests in this org, so we push
48+
# a branch and surface a one-click "create PR" link in the job summary for a
49+
# maintainer to open. Opening the PR triggers Open Data CI and normal review.
50+
# This mirrors opendata-commitment-eligibility.yml, which hit the same wall.
51+
- name: Push branch and surface PR link if data changed
6752
run: |
6853
# Check for changes (handles both new file and modified file)
6954
if git diff --quiet --exit-code -- src/open-data/InstanceSizeFlexibility.csv 2>/dev/null && \
@@ -72,15 +57,50 @@ jobs:
7257
exit 0
7358
fi
7459
75-
BRANCH="opendata/instance-size-flexibility-$(date +%Y%m%d)"
60+
# run_number keeps a re-run on the same day from colliding with the branch an
61+
# earlier run already pushed; run_attempt does the same for a re-run of this
62+
# run, which keeps run_number and only increments the attempt.
63+
BRANCH="opendata/instance-size-flexibility-$(date +%Y%m%d)-${{ github.run_number }}.${{ github.run_attempt }}"
7664
git checkout -b "$BRANCH"
7765
git config user.name "github-actions[bot]"
7866
git config user.email "github-actions[bot]@users.noreply.github.com"
7967
git add src/open-data/InstanceSizeFlexibility.csv
8068
git commit -m "chore: Update instance size flexibility ratios"
8169
git push origin "$BRANCH"
8270
83-
gh pr create \
84-
--title "[Open Data] Update instance size flexibility ratios ($(date +'%B %Y'))" \
85-
--base dev \
86-
--body "$PR_BODY"
71+
PR_URL="${{ github.server_url }}/${{ github.repository }}/compare/dev...${BRANCH}?expand=1"
72+
{
73+
echo "### Instance size flexibility ratios updated"
74+
echo ""
75+
echo "Pushed branch \`${BRANCH}\`. GitHub Actions cannot open PRs in this repo, so open it manually:"
76+
echo ""
77+
echo "[**Create pull request →**](${PR_URL})"
78+
echo ""
79+
echo "Suggested title:"
80+
echo ""
81+
echo '```'
82+
echo "[Open Data] Update instance size flexibility ratios ($(date +'%B %Y'))"
83+
echo '```'
84+
echo ""
85+
echo "Suggested body:"
86+
echo ""
87+
echo '```markdown'
88+
echo "## Summary"
89+
echo ""
90+
echo "Weekly automated update of instance size flexibility (ISF) ratios from the"
91+
echo "[Azure Reservations Catalogs API](https://learn.microsoft.com/azure/cost-management-billing/reservations/instance-size-flexibility#extract-instance-size-flexibility-ratios-using-azure-catalogs-api)."
92+
echo ""
93+
echo "This file maps each ARM SKU to its instance size flexibility group and ratio,"
94+
echo "replacing the deprecated \`AutofitComboMeterData.csv\` and \`isfratioblob.csv\` files"
95+
echo "that were hosted on \`ccmstorageprod.blob.core.windows.net\` (retired 30 Aug 2026)."
96+
echo ""
97+
echo "## Test plan"
98+
echo ""
99+
echo "- [ ] Review the diff for unexpected changes (large drops in group/SKU count, etc.)"
100+
echo "- [ ] Spot-check a few SKUs against the Azure Pricing Calculator"
101+
echo ""
102+
echo "🤖 Generated by the **Update Instance Size Flexibility** workflow"
103+
echo '```'
104+
} >> "$GITHUB_STEP_SUMMARY"
105+
echo "Branch pushed: $BRANCH"
106+
echo "Open a PR here: $PR_URL"

‎.github/workflows/publish.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ jobs:
77
runs-on: windows-latest
88
steps:
99
- name: Install and cache PowerShell modules
10-
uses: potatoqualitee/psmodulecache@ee5e9494714abf56f6efbfa51527b2aec5c761b8 # v6.2.1
10+
uses: potatoqualitee/psmodulecache@9e4b63833c22c1768d648e115a9c849afdda22a5 # v6.3
1111
with:
1212
modules-to-cache: InvokeBuild, PSScriptAnalyzer, Pester, Az.Accounts, Az.Resources
1313
shell: pwsh

‎docs-mslearn/TOC.yml‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,8 @@
220220
href: toolkit/optimization-engine/faq.md
221221
- name: Troubleshooting guide
222222
href: toolkit/optimization-engine/troubleshooting.md
223+
- name: Reference
224+
href: toolkit/optimization-engine/reference.md
223225
- name: Open data
224226
href: toolkit/open-data.md
225227
- name: PowerShell

‎docs-mslearn/toolkit/changelog.md‎

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ title: FinOps toolkit changelog
33
description: Review the latest features and enhancements in the FinOps toolkit, including updates to FinOps hubs, Power BI reports, and more.
44
author: MSBrett
55
ms.author: brettwil
6-
ms.date: 08/23/2026
6+
ms.date: 09/07/2026
77
ms.topic: reference
88
ms.service: finops
99
ms.subservice: finops-toolkit
@@ -34,10 +34,12 @@ The following section lists features and enhancements that are currently in deve
3434
- Replaced redundant `tolower()` comparisons in hub KQL with case-insensitive operators (`has`, `=~`, `!~`) so the engine can use the term index instead of scanning every row ([#2213](https://github.com/microsoft/finops-toolkit/issues/2213)).
3535
- Replaced whole-term `contains` matches with `has` across hub KQL and the query catalog (resource ID paths, licensing phrases, SKU description terms) and added a per-row operator-equivalence regression harness with unit test coverage ([#2220](https://github.com/microsoft/finops-toolkit/pull/2220)).
3636
- **Fixed**
37+
- Fixed managed exports failing with an `Unauthorized` error because the Role Based Access Control Administrator role was never assigned to the Data Factory identity. Roles requested by a hub app are now assigned on the publisher storage account even when the app doesn't create the storage account itself ([#2253](https://github.com/microsoft/finops-toolkit/issues/2253)).
3738
- Fixed private-network deployments that Azure Policy blocked when `defaultOutboundAccess` was omitted. Private mode subnets now set it to `false`, while an Azure Files private endpoint supports deployment-script storage and the NAT Gateway provides required container egress ([#2258](https://github.com/microsoft/finops-toolkit/issues/2258), [#2259](https://github.com/microsoft/finops-toolkit/pull/2259)).
3839
- Fixed the `ContractedCost` recompute guard to compare with a null-safe tolerance instead of exact float equality, eliminating millions of no-op rewrites that polluted the `x_SourceValues` audit trail while preserving the null-cost backfill and no longer overwriting an existing cost when the unit price is missing ([#2216](https://github.com/microsoft/finops-toolkit/issues/2216)).
3940
- Fixed the SQL VMs without Azure Hybrid Benefit recommendation query to join on the SQL VM `virtualMachineResourceId` instead of a case-sensitive VM name match that skipped VMs with uppercase names and dropped duplicate names, and made all Azure Resource Graph join kinds explicit so no query relies on the `innerunique` default ([#2225](https://github.com/microsoft/finops-toolkit/pull/2225)).
4041
- Switched dimension enrichment in the v1_0/v1_2 ingestion transforms (`PricingUnits`, `Regions`, `ResourceTypes`, `Services`) from `join` to the broadcast-optimized `lookup` operator and deduplicated the `Services` mapping per resource type to prevent cost row fan-out ([#2225](https://github.com/microsoft/finops-toolkit/pull/2225)).
42+
- Fixed the v1_0 and v1_2 price transforms setting `x_CommitmentDiscountSpendEligibility` from reservation meters and `x_CommitmentDiscountUsageEligibility` from savings plan meters, the opposite of the FOCUS `CommitmentDiscountCategory` value the same transform assigns. The spend column now reports savings plan pricing and the usage column reports reservation pricing. Prices ingested after upgrading carry the corrected values; rows ingested earlier keep the old values until they are reingested ([#2279](https://github.com/microsoft/finops-toolkit/issues/2279)).
4143
4244
### [FinOps workbooks](workbooks/finops-workbooks-overview.md)
4345
@@ -67,8 +69,12 @@ The following section lists features and enhancements that are currently in deve
6769
6870
### [Optimization Engine](optimization-engine/overview.md)
6971
72+
- **Added**
73+
- Added a comprehensive [Azure Optimization Engine reference](optimization-engine/reference.md) for runbooks, schedules, variables, Log Analytics tables, and SQL Database tables ([#1271](https://github.com/microsoft/finops-toolkit/issues/1271)).
7074
- **Changed**
7175
- Switched the reservations and benefits workbooks from the retired `ccmstorageprod` isfratioblob.csv to the FinOps toolkit [Instance size flexibility](open-data.md#instance-size-flexibility) open data file ([#2090](https://github.com/microsoft/finops-toolkit/issues/2090)).
76+
- **Fixed**
77+
- Fixed a regression in the `AzureOptimizationConsumptionV1_CL` schema that was breaking the Reservations Usage workbook ([#2301](https://github.com/microsoft/finops-toolkit/issues/2301)).
7278
7379
### [PowerShell module](powershell/powershell-commands.md)
7480
@@ -87,6 +93,7 @@ The following section lists features and enhancements that are currently in deve
8793
- **Fixed**
8894
- Fixed the commitment discount eligibility dataset refresh so it is reproducible and complete; retired meters now age out and previously missed meters are included ([#2164](https://github.com/microsoft/finops-toolkit/pull/2164)).
8995
- Fixed the weekly commitment discount eligibility refresh timing out before it could publish, which left the dataset unchanged since it first shipped in v14. The refresh now walks each price type directly instead of sharding by service family, and verifies completeness by comparing two independent traversals before writing ([#2251](https://github.com/microsoft/finops-toolkit/pull/2251)).
96+
- Fixed `x_CommitmentDiscountSpendEligibility` and `x_CommitmentDiscountUsageEligibility` carrying each other's values. FOCUS classifies a reservation as a usage commitment (committed to a quantity of usage) and a savings plan as a spend commitment (committed to an amount of money), so the spend column now reports savings plan pricing and the usage column reports reservation pricing. The dataset shipped with the two reversed from v14 ([#2279](https://github.com/microsoft/finops-toolkit/issues/2279)).
9097
9198
-->
9299

‎docs-mslearn/toolkit/hubs/template.md‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ title: FinOps hub template
33
description: Learn about what's included in the FinOps hub template including parameters, resources, and outputs.
44
author: flanakin
55
ms.author: micflan
6-
ms.date: 06/03/2026
6+
ms.date: 08/24/2026
77
ms.topic: concept-article
88
ms.service: finops
99
ms.subservice: finops-toolkit
@@ -65,7 +65,7 @@ Ensure the following prerequisites are met before you deploy the template:
6565
| [Storage Account Contributor](/azure/role-based-access-control/built-in-roles#storage-account-contributor) | Assigned to Data Factory to manage data in storage. |
6666
| [Storage Blob Data Contributor](/azure/role-based-access-control/built-in-roles#storage-blob-data-contributor) | Assigned to Data Factory and Data Explorer to manage data in storage. |
6767
| [Storage File Data Privileged Contributor](/azure/role-based-access-control/built-in-roles/storage#storage-file-data-privileged-contributor) | Assigned to the deployment file upload identity that uploads files to the config container. |
68-
| [User Access Administrator](/azure/role-based-access-control/built-in-roles#user-access-administrator) | Assigned to Data Factory to manage data in storage. Not applied when **enableManagedExports** is disabled. |
68+
| [Role Based Access Control Administrator](/azure/role-based-access-control/built-in-roles/privileged#role-based-access-control-administrator) | Assigned to Data Factory on the storage account so it can create Cost Management exports, which grant their own identity access to the export destination. Not applied when **enableManagedExports** is disabled. |
6969

7070
- The Microsoft.EventGrid resource provider must be registered in your subscription. For more information, see [Register a resource provider](/azure/azure-resource-manager/management/resource-providers-and-types#register-resource-provider).
7171

@@ -97,7 +97,7 @@ Here are the parameters you can use to customize the deployment:
9797
| **dataExplorerFinalRetentionInMonths** | Int | Optional. Number of months of data to retain in the Data Explorer \*_final_v\* tables. | 13 |
9898
| **remoteHubStorageUri** | String | Optional. Data Lake storage endpoint from the remote (primary) hub storage account. Used for cross-tenant cost data collection where this hub sends processed data to a central hub. Example: `https://primaryhub.dfs.core.windows.net/` | |
9999
| **remoteHubStorageKey** | String | Optional. Storage account access key for the remote (primary) hub. Used with remoteHubStorageUri for cross-tenant scenarios. Must be kept secure as it provides full storage access. | |
100-
| **enableManagedExports** | Bool | Optional. Enable managed exports where your FinOps hub instance will create and run Cost Management exports on your behalf. Not supported for Microsoft Customer Agreement (MCA) billing profiles. Requires the ability to grant User Access Administrator role to FinOps hubs, which is required to create Cost Management exports. | True |
100+
| **enableManagedExports** | Bool | Optional. Enable managed exports where your FinOps hub instance will create and run Cost Management exports on your behalf. Not supported for Microsoft Customer Agreement (MCA) billing profiles. Requires the ability to grant the Role Based Access Control Administrator role to FinOps hubs, which is required to create Cost Management exports. | True |
101101
| **enableRecommendations** | Bool | Optional. Enable recommendations ingested from Azure Resource Graph based on configurable queries. The Data Factory managed identity requires Reader role on management groups or subscriptions to execute Resource Graph queries. | False |
102102
| **enableAHBRecommendations** | Bool | Optional. Enable Azure Hybrid Benefit recommendations that flag VMs and SQL VMs without Azure Hybrid Benefit enabled. May generate noise if your organization does not have on-premises licenses. Requires enableRecommendations. | False |
103103
| **enableSpotRecommendations** | Bool | Optional. Enable non-Spot AKS cluster recommendations that flag AKS clusters with autoscaling but not using Spot VMs. May generate noise since Spot VMs are only appropriate for interruptible workloads. Requires enableRecommendations. | False |

‎docs-mslearn/toolkit/open-data.md‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ description: Use open data to normalize and enhance your FinOps reporting, ensur
44
ms.topic: concept-article
55
author: flanakin
66
ms.author: micflan
7-
ms.date: 07/30/2026
7+
ms.date: 09/01/2026
88
ms.service: finops
99
ms.subservice: finops-toolkit
1010
ms.reviewer: micflan
@@ -162,13 +162,13 @@ Sample data:
162162
| MeterId | x_CommitmentDiscountSpendEligibility | x_CommitmentDiscountUsageEligibility |
163163
| ------------------------------------ | ------------------------------------ | ------------------------------------ |
164164
| 00003b45-e996-5b04-b673-a2db710f9237 | Eligible | Eligible |
165-
| 00020329-e657-5687-9d1a-0be9876e5116 | Eligible | Not Eligible |
166-
| 0003c425-b1df-551f-a855-9c95a08cb4ae | Not Eligible | Eligible |
165+
| 00020329-e657-5687-9d1a-0be9876e5116 | Not Eligible | Eligible |
166+
| 0003c425-b1df-551f-a855-9c95a08cb4ae | Eligible | Not Eligible |
167167

168168
A few important notes about the data:
169169

170-
- `x_CommitmentDiscountSpendEligibility` indicates whether the meter has Reserved Instance pricing.
171-
- `x_CommitmentDiscountUsageEligibility` indicates whether the meter has Savings Plan pricing.
170+
- `x_CommitmentDiscountSpendEligibility` indicates whether the meter has savings plan pricing. FOCUS classifies a savings plan as a spend commitment because you commit to an amount of money.
171+
- `x_CommitmentDiscountUsageEligibility` indicates whether the meter has reservation pricing. FOCUS classifies a reservation as a usage commitment because you commit to a quantity of usage.
172172
- Only primary meter regions are included to avoid duplicates.
173173
- Data is updated weekly via a GitHub Actions workflow.
174174

0 commit comments

Comments
 (0)