diff --git a/docs-mslearn/best-practices/storage.md b/docs-mslearn/best-practices/storage.md index 6e61ebd3f..cc15eaddd 100644 --- a/docs-mslearn/best-practices/storage.md +++ b/docs-mslearn/best-practices/storage.md @@ -3,7 +3,7 @@ title: FinOps best practices for Storage description: This article outlines proven FinOps practices for storage services, focusing on cost optimization, efficiency improvements, and resource insights. author: flanakin ms.author: micflan -ms.date: 04/01/2026 +ms.date: 05/12/2026 ms.topic: concept-article ms.service: finops ms.subservice: finops-learning-resources @@ -76,7 +76,6 @@ Azure managed disks are block-level storage volumes that are managed by Azure an Related resources: -- [Managed disks product page](https://azure.microsoft.com/products/managed-disks) - [Managed disks pricing](https://azure.microsoft.com/pricing/details/managed-disks) - [Managed disks documentation](/azure/virtual-machines/managed-disks-overview) diff --git a/docs-mslearn/framework/manage/onboarding.md b/docs-mslearn/framework/manage/onboarding.md index 04a301c8a..e8a8800f1 100644 --- a/docs-mslearn/framework/manage/onboarding.md +++ b/docs-mslearn/framework/manage/onboarding.md @@ -3,7 +3,7 @@ title: Onboarding workloads description: This article helps you understand the onboarding workloads capability within the FinOps Framework and how to implement that in the Microsoft Cloud. author: flanakin ms.author: micflan -ms.date: 04/01/2026 +ms.date: 05/12/2026 ms.topic: concept-article ms.service: finops ms.subservice: finops-learning-resources @@ -73,7 +73,7 @@ Document your onboarding process. Using existing tools and processes where avail ## Learn more at the FinOps Foundation -This capability is a part of the FinOps Framework by the FinOps Foundation, a non-profit organization dedicated to advancing cloud cost management and optimization. For more information about FinOps, including useful playbooks, training and certification programs, and more, see the [Onboarding workloads capability](https://www.finops.org/framework/capabilities/onboarding-workloads/) article in the FinOps Framework documentation. +This capability is a part of the FinOps Framework by the FinOps Foundation, a non-profit organization dedicated to advancing cloud cost management and optimization. For more information about FinOps, including useful playbooks, training and certification programs, and more, refer to the [FinOps Framework documentation](https://www.finops.org/framework/). You can also find related videos on the FinOps Foundation YouTube channel: diff --git a/docs-mslearn/framework/quantify/benchmarking.md b/docs-mslearn/framework/quantify/benchmarking.md index 4db88a05f..5f18652ac 100644 --- a/docs-mslearn/framework/quantify/benchmarking.md +++ b/docs-mslearn/framework/quantify/benchmarking.md @@ -3,7 +3,7 @@ title: FinOps benchmarking description: This article helps you understand the benchmarking capability within the FinOps Framework and how to implement that in the Microsoft Cloud. author: flanakin ms.author: micflan -ms.date: 04/01/2026 +ms.date: 05/12/2026 ms.topic: concept-article ms.service: finops ms.subservice: finops-learning-resources @@ -58,7 +58,7 @@ At this point, you implemented best practices based on cross-company benchmarks ## Learn more at the FinOps Foundation -This capability is a part of the FinOps Framework by the FinOps Foundation, a non-profit organization dedicated to advancing cloud cost management and optimization. For more information about FinOps, including useful playbooks, training and certification programs, and more, see to the [benchmarking](https://www.finops.org/framework/capabilities/benchmarking) article in the FinOps Framework documentation. +This capability is a part of the FinOps Framework by the FinOps Foundation, a non-profit organization dedicated to advancing cloud cost management and optimization. For more information about FinOps, including useful playbooks, training and certification programs, and more, refer to the [FinOps Framework documentation](https://www.finops.org/framework/).
diff --git a/docs-mslearn/toolkit/changelog.md b/docs-mslearn/toolkit/changelog.md index dc22e673f..76fe1b70f 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: 04/29/2026 +ms.date: 05/12/2026 ms.topic: reference ms.service: finops ms.subservice: finops-toolkit @@ -1058,7 +1058,7 @@ _**Breaking change**_ - Added param to disable external access to Azure Data Lake and Azure Data Explorer. - Added param to specify subnet range of virtual network - minimum size = /26 - Support for storage account infrastructure encryption. - - Published a [schema file](https://aka.ms/finops/hubs/settings-schema) for the hub settings.json file. + - Published a schema file for the hub settings.json file in this release. - **Changed** - Changed dataset names in the ingestion container to facilitate Azure Data Explorer ingestion. > [!IMPORTANT] diff --git a/docs-mslearn/toolkit/hubs/deploy.md b/docs-mslearn/toolkit/hubs/deploy.md index 4c7760ef0..eaae43be3 100644 --- a/docs-mslearn/toolkit/hubs/deploy.md +++ b/docs-mslearn/toolkit/hubs/deploy.md @@ -3,7 +3,7 @@ title: How to create and update FinOps hubs description: This tutorial helps you create a new or update an existing FinOps hubs instance in Azure or Microsoft Fabric. author: flanakin ms.author: micflan -ms.date: 04/21/2026 +ms.date: 05/12/2026 ms.topic: tutorial ms.service: finops ms.subservice: finops-toolkit @@ -560,7 +560,7 @@ For more information, see [Configure Data Explorer dashboards](configure-dashboa - **Azure Data Explorer (Kusto)** – Use an account that has at least viewer access to the Hub and Ingestion databases. - **Azure Resource Graph** – Use an account that has direct access to any subscriptions you would like to report on. - **(your storage account)** – Use a SAS token or an account that has Storage Blob Data Reader or greater access. - - **...** – Anonymous access. This URL is used for reservation size flexibility data. + - **** – Anonymous access. This URL is used for reservation size flexibility data. - **...** – Anonymous access. This URL is used for FinOps toolkit open data files. For more information, see [Set up Power BI reports](../power-bi/setup.md). diff --git a/docs-mslearn/toolkit/power-bi/setup.md b/docs-mslearn/toolkit/power-bi/setup.md index 6aeae6653..7121162f8 100644 --- a/docs-mslearn/toolkit/power-bi/setup.md +++ b/docs-mslearn/toolkit/power-bi/setup.md @@ -3,7 +3,7 @@ title: Set up Power BI reports description: Learn how to set up Power BI FinOps reports using the FinOps toolkit, customize visuals, and connect to your cost data for detailed analysis. author: flanakin ms.author: micflan -ms.date: 04/01/2026 +ms.date: 05/12/2026 ms.topic: how-to ms.service: finops ms.subservice: finops-toolkit @@ -115,7 +115,7 @@ The FinOps toolkit Power BI reports include preconfigured visuals, but aren't co - **Azure Data Explorer (Kusto)** – Use an account that has at least viewer access to the Hub database. - **Azure Resource Graph** – Use an account that has direct access to any subscriptions you would like to report on. - **(your storage account)** – Use a SAS token or an account that has Storage Blob Data Reader or greater access. - - **...** – Anonymous access. This URL is used for reservation size flexibility data. + - **** – Anonymous access. This URL is used for reservation size flexibility data. - **...** – Anonymous access. This URL is used for FinOps toolkit open data files. If you run into any issues syncing your data, see [Troubleshooting Power BI reports](../help/troubleshooting.md). diff --git a/src/powershell/Tests/Unit/DocsLinks.Tests.ps1 b/src/powershell/Tests/Unit/DocsLinks.Tests.ps1 index 5415919a6..5d92fa414 100644 --- a/src/powershell/Tests/Unit/DocsLinks.Tests.ps1 +++ b/src/powershell/Tests/Unit/DocsLinks.Tests.ps1 @@ -102,6 +102,46 @@ BeforeDiscovery { $mslearnFiles = Get-MarkdownFiles $mslearnRoot $mslearnRoot $mslearnInternalLinks = Get-InternalMdLinks $mslearnFiles $mslearnUrls = Get-MarkdownUrls $mslearnFiles + $knownBrokenExternalUrls = @( + 'https://azure.microsoft.com/products/managed-disks', + 'https://www.finops.org/framework/capabilities/onboarding-workloads/', + 'https://www.finops.org/framework/capabilities/benchmarking', + 'https://aka.ms/finops/hubs/settings-schema' + ) + # Match incomplete ccmstorageprod URLs (no domain suffix), while allowing valid hosts like ccmstorageprod.blob.core.windows.net. + $incompletePlaceholderUrlPattern = 'https://ccmstorageprod(?!\.)' + $knownBrokenExternalUrlMatches = @() + $incompleteExternalUrlMatches = @() + foreach ($file in $mslearnFiles) + { + $cleanContent = Remove-HtmlComments $file.Content + foreach ($url in $knownBrokenExternalUrls) + { + $urlMatches = [regex]::Matches($cleanContent, [regex]::Escape($url)) + foreach ($match in $urlMatches) + { + $knownBrokenExternalUrlMatches += @{ + SourceFile = $file.FullName + SourceRel = $file.RelativePath + Url = $url + Pattern = "^$([regex]::Escape($url))$" + LineNumber = ($cleanContent.Substring(0, $match.Index) -split "`n").Count + } + } + } + + $placeholderMatches = [regex]::Matches($cleanContent, $incompletePlaceholderUrlPattern) + foreach ($match in $placeholderMatches) + { + $incompleteExternalUrlMatches += @{ + SourceFile = $file.FullName + SourceRel = $file.RelativePath + Url = $match.Value + Pattern = $incompletePlaceholderUrlPattern + LineNumber = ($cleanContent.Substring(0, $match.Index) -split "`n").Count + } + } + } #endregion #region docs (Jekyll site) @@ -259,6 +299,20 @@ Describe 'Documentation links' { } } + Context 'docs-mslearn: No known broken external URLs' { + + It 'Should not contain known broken external URL: : ' -ForEach $knownBrokenExternalUrlMatches { + $Url | Should -Not -Match $Pattern -Because "known broken external URLs should not appear in docs-mslearn content (${SourceRel}:${LineNumber})" + } + } + + Context 'docs-mslearn: No incomplete placeholder external URLs' { + + It 'Should not contain incomplete placeholder URL: : ' -ForEach $incompleteExternalUrlMatches { + $Url | Should -Not -Match $Pattern -Because "incomplete placeholder URLs should not appear in docs-mslearn content (${SourceRel}:${LineNumber})" + } + } + #endregion #region docs (Jekyll site)