Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
82 commits
Select commit Hold shift + click to select a range
2c7e32c
feat(finops-hub-local): two-DB ftklocal foundation (T-5000.1 + T-5000.2)
Jun 17, 2026
a01cebe
Merge T-5000.1+T-5000.2: ftklocal two-DB foundation into features/ftk…
Jun 17, 2026
f6108e8
fix(finops-hub-local): make kql defaults to Hub; split KQL_DB/PARITY_DB
Jun 17, 2026
5bbf5c3
Merge T-5000.2 fix: make kql defaults to Hub (KQL_DB/PARITY_DB split)
Jun 17, 2026
0fa2a96
docs(finops-hub-local): export-config + manual staging contract (T-50…
Jun 17, 2026
98ebb14
Merge T-5000.4: export-config + staging contract into features/ftklocal
Jun 17, 2026
a4f6106
feat(finops-hub-local): local settings.json + config-container decisi…
Jun 17, 2026
01e5e42
Merge T-5000.10: settings.json + config-container decision into featu…
Jun 17, 2026
1f90c55
feat(finops-hub-local): add localized ADX dashboard artifact (T-5000.5)
Jun 17, 2026
f554584
merge(T-5000.5): integrate localized ADX dashboard into features/ftkl…
Jun 17, 2026
a5342c3
merge(features/ftklocal): sync .8 worktree to resolve notes/ references
Jun 17, 2026
bb422ad
feat(finops-hub-local): proactive backfill chunking + fail-fast doubl…
Jun 17, 2026
abf9d0d
merge(features/ftklocal): sync .3 worktree (brings in .5 dashboard)
Jun 17, 2026
8be8346
chore(finops-hub-local): genericize EXPORT_DIR example path (avoid /U…
Jun 17, 2026
e3b13ee
feat(agent-skills): add finops-hub-local skill + fix ftk.ps1 catalog …
Jun 17, 2026
e264089
fix(finops-hub-local): guard git fallback in ftk.ps1 Get-FtkRepo
Jun 17, 2026
2d8a2ff
merge(T-5000.8): integrate finops-hub-local agent skill + ftk.ps1 cat…
Jun 17, 2026
1614eb1
Merge branch 'features/ftklocal' into features/ftklocal-t5000.3
Jun 17, 2026
20fd3d3
refactor(finops-hub-local): gate chunked backfill on row count alone …
Jun 18, 2026
a9471b6
merge(T-5000.3): integrate ingest reliability (row-gated chunking, do…
Jun 18, 2026
f574559
docs(finops-hub-local): README + adapter/parity notes; drop stale cro…
Jun 18, 2026
e474163
merge(T-5000.7): integrate finops-hub-local docs + ftk.ps1 cross-db s…
Jun 18, 2026
7a615f7
docs(finops-hub-local): measured performance + limits (T-5000.6)
Jun 18, 2026
2fe9be7
merge(T-5000.6): integrate measured performance + limits doc
Jun 18, 2026
5ec214c
docs(finops-hub-local): correct ADX dashboard connectivity (UAT-measu…
Jun 18, 2026
801981e
docs(finops-hub-local): Windows-primary + macOS install/deploy guides…
Jun 18, 2026
69912ba
style(finops-hub-local): apply Prettier formatting to docs
Jun 18, 2026
91899bd
chore(finops-hub-local): pin .md to LF in .gitattributes
Jun 18, 2026
c4a3908
docs(finops-hub-local): add 'build by hand' runbook
Jun 18, 2026
41abdd4
refactor(finops-hub-local): load each schema bundle in one call
Jun 18, 2026
ed1f4ca
fix(finops-hub-local): correct the by-hand ingest steps (update polic…
Jun 18, 2026
a961d73
docs(finops-hub-local): align README by-hand summary with the update-…
Jun 18, 2026
421b9a7
fix(finops-hub-local): add .build.config to keep runtime data out of …
Jun 18, 2026
5278e2f
Revert "refactor(finops-hub-local): load each schema bundle in one call"
Jun 18, 2026
e016dc3
fix(finops-hub-local): fix single-element-array unwrap in ingest back…
Jun 18, 2026
4ef6457
docs(hubs): add Run hubs locally guide; remove finops-hub-local template
Jun 18, 2026
bce7f65
docs: clarify local hub prerequisites
MSBrett Jun 18, 2026
96bd183
docs: improve local hub ingestion guidance
MSBrett Jun 19, 2026
7aee803
docs: broaden local hub positioning
MSBrett Jun 19, 2026
7e951a8
docs: remove unused local ingest helper
MSBrett Jun 19, 2026
a32f12b
docs: update mslearn dates
MSBrett Jun 19, 2026
3fc373f
docs: add ftklocal agent skill
MSBrett Jun 19, 2026
195869d
feat(finops-hub): build-generated local open-data loader, Initialize-…
MSBrett Jun 21, 2026
66b66be
Merge remote-tracking branch 'origin/dev' into features/ftklocal
MSBrett Jun 21, 2026
b3c40a2
feat(hubs): add ftk-local-dashboard canvas extension
Jun 25, 2026
a133f66
feat(dashboard): add KPI interpretive annotations (T-5001.1)
Jun 25, 2026
13b389c
feat(dashboard): add triage framing to Overview tab (T-5001.4)
Jun 25, 2026
435bc00
fix(dashboard): correct Overspend tab target and null guards in triag…
Jun 25, 2026
7f627ca
feat(dashboard): elevate source line to diagnostic rail (T-5001.2)
Jun 25, 2026
807c02c
feat(dashboard): add open KQL escape hatch per chart (T-5001.5)
Jun 25, 2026
4ebc90e
fix(dashboard): wire Run button to chart re-render and add HTTP error…
Jun 25, 2026
4e23bce
feat(dashboard): introduce visual hierarchy between primary and refer…
Jun 25, 2026
db3531f
fix(dashboard): fix KPI ordering, grid span, and border stacking (T-5…
Jun 25, 2026
64dddf7
fix(dashboard): fix reference KPI shadow cascade and remove dead font…
Jun 25, 2026
2fa1846
fix(dashboard): reset row count on error state and fix orphaned separ…
Jun 25, 2026
db01317
feat(dashboard): add /api/kql endpoint, refactor error handling (T-50…
Jun 25, 2026
bce4ee4
fix(dashboard): fix tainted format string in logError (CodeQL js/tain…
Jun 25, 2026
b60441d
feat(dashboard): add CUS, MACC, top-txns, AI-by-app from INDEX.md cat…
Jun 25, 2026
c5a23e1
feat(canvas): add interactive click-to-filter to dashboard
Jun 25, 2026
c215872
chore: add PRODUCT.md and ignore impeccable cache
Jun 25, 2026
b1b6654
feat(dashboard): impeccable polish β€” P1-P3 design fixes
Jun 25, 2026
6f1366c
feat(dashboard): harden β€” abort races, error boundary, a11y, null guards
Jun 25, 2026
ef634f4
feat(dashboard): P1+P2 UX polish β€” KPI tooltips, triage callouts, ari…
Jun 25, 2026
bfd2d81
fix(docs): mount kustodata volume in docker run so databases survive …
Jun 29, 2026
c12b8a5
harden(powershell): validate params, thread TimeoutSec, wrap release …
Jul 7, 2026
4ddb10c
fix(dashboard): correct KQL metric semantics and finish cross-tab lay…
Jul 7, 2026
6f9a5fb
Merge remote-tracking branch 'origin/dev' into features/ftklocal
MSBrett Jul 8, 2026
549a6d0
chore: update ms.date in docs-mslearn files
MSBrett Jul 8, 2026
a91c072
test: fix Pester 6 Discovery-phase and mock-assertion bugs
MSBrett Jul 8, 2026
98aa69c
feat(ftk-local-dashboard): make Kusto emulator port/database configur…
MSBrett Jul 21, 2026
9104089
feat(ftklocal-dashboard): add experimental Monaco KQL and ADX Web UI …
MSBrett Jul 21, 2026
0e6177b
fix(ftklocal-dashboard): correct ADX iframe status copy per iframe em…
MSBrett Jul 21, 2026
c0cbdc4
fix(ftklocal-dashboard): give tool tabs real vertical space, cut clutter
MSBrett Jul 21, 2026
8397775
fix(ftk-local-dashboard): remove ADX tab, fix KQL query editor
MSBrett Jul 21, 2026
7041399
fix(ftk-local-dashboard): survive host restarts without losing state
MSBrett Jul 22, 2026
0376bac
chore: update ms.date in docs-mslearn files
MSBrett Jul 29, 2026
3e77651
harden(powershell): guard blank error payload in Invoke-FinOpsHubLoca…
MSBrett Jul 29, 2026
9149de7
Merge remote-tracking branch 'origin/dev' into features/ftklocal
MSBrett Jul 30, 2026
b7fd743
chore: update ms.date in docs-mslearn files
MSBrett Jul 30, 2026
b4d5eb2
Address review feedback: remove undisclosed dashboard extension, fix …
MSBrett Jul 31, 2026
3b6d1b3
chore: Update ms.date in docs-mslearn files
MSBrett Jul 31, 2026
91d73e5
Merge remote-tracking branch 'origin/dev' into features/ftklocal
MSBrett Jul 31, 2026
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
4 changes: 4 additions & 0 deletions docs-mslearn/TOC.yml
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,8 @@
href: toolkit/hubs/finops-hubs-overview.md
- name: Create or upgrade hubs
href: toolkit/hubs/deploy.md
- name: Run hubs locally
href: toolkit/hubs/run-hubs-locally.md
- name: Configure private networking
href: toolkit/hubs/private-networking.md
- name: Configure scopes
Expand Down Expand Up @@ -246,6 +248,8 @@
href: toolkit/powershell/hubs/deploy-finopshub.md
- name: Initialize-FinOpsHubDeployment
href: toolkit/powershell/hubs/initialize-finopshubdeployment.md
- name: Initialize-FinOpsHubLocal
href: toolkit/powershell/hubs/initialize-finopshublocal.md
- name: Register-FinOpsHubProviders
href: toolkit/powershell/hubs/register-finopshubproviders.md
- name: Remove-FinOpsHub
Expand Down
7 changes: 6 additions & 1 deletion docs-mslearn/toolkit/changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -74,6 +74,9 @@ _Released June 2026_

### [FinOps hubs](hubs/finops-hubs-overview.md) v15

- **Added**
- Added a [Run hubs locally](hubs/run-hubs-locally.md) guide to stand up a FinOps hub in a local Kusto emulator container and ingest cost data using the same KQL, transforms, and open data as a deployed hub.
Comment thread
MSBrett marked this conversation as resolved.
- Added a build-generated `finops-hub-local-opendata.kql` release artifact that loads the open data reference tables from CSV, so the local hub guide stays in sync with published open data instead of hard-coding schemas.
- **Changed**
- Added a callout to the `config_RunBackfillJob` backfill option clarifying that it isn't supported on Microsoft Customer Agreement (MCA) billing accounts or billing profiles ([#2113](https://github.com/microsoft/finops-toolkit/issues/2113)).
- **Fixed**
Expand All @@ -100,6 +103,8 @@ _Released June 2026_

### [PowerShell module](powershell/powershell-commands.md) v15

- **Added**
- Added [Initialize-FinOpsHubLocal](powershell/hubs/initialize-finopshublocal.md) to set up a local FinOps hub in a running Kusto emulator with one command.
- **Changed**
- Updated PowerShell test compatibility with Pester 6 ([#2204](https://github.com/microsoft/finops-toolkit/pull/2204)).
- **Fixed**
Expand Down
289 changes: 289 additions & 0 deletions docs-mslearn/toolkit/hubs/run-hubs-locally.md

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
---
title: Initialize-FinOpsHubLocal command
description: Set up a local FinOps hub in a running Kusto emulator using the Initialize-FinOpsHubLocal command in the FinOpsToolkit module.
author: MSBrett
ms.author: brettwil
ms.date: 07/31/2026
ms.topic: reference
ms.service: finops
ms.subservice: finops-toolkit
ms.reviewer: brettwil
#customer intent: As a FinOps user, I want to set up a local FinOps hub with one command so I can explore my cost data without deploying Azure resources.
---

# Initialize-FinOpsHubLocal command

The **Initialize-FinOpsHubLocal** command sets up a local FinOps hub in a running [Kusto emulator](/azure/data-explorer/kusto-emulator-overview). It creates the `Ingestion` and `Hub` databases, then downloads and applies the released FinOps hub setup scripts and open data load script, so the local hub uses the same KQL, transforms, and open data as a deployed hub.

The command doesn't install Docker or manage the emulator container, and it doesn't ingest cost data. Start the emulator first, then run this command against its endpoint. For the full walkthrough, see [Run FinOps hubs locally](../../hubs/run-hubs-locally.md).

<br>

## Syntax

```powershell
Initialize-FinOpsHubLocal `
[-ClusterUri <string>] `
[-ReleaseUri <string>] `
[-RawRetentionInDays <int>] `
[-OpenDataPath <string>] `
[-SkipOpenData] `
[-Destination <string>] `
[-WhatIf]
```

<br>

## Parameters

| Name | Description |
| --------------------- | --------------------------------------------------------------------------------------------------------------- |
| `‑ClusterUri` | Optional. Base URI of the running Kusto emulator. Default = `http://localhost:8082`. |
| `‑ReleaseUri` | Optional. Base URI to download the setup scripts and open data load script from. Default = the latest FinOps toolkit GitHub release. Point this at a local file server or a specific release to run offline or pin a version. |
| `‑RawRetentionInDays` | Optional. Number of days to keep raw data in the `Ingestion` database. Default = `90`. |
| `‑OpenDataPath` | Optional. Path, as seen by the emulator, to the folder that holds the open data CSV files. Default = `/data/export/open-data`. |
| `‑SkipOpenData` | Optional. Skips loading the open data reference tables. Default = `false`. |
| `‑Destination` | Optional. Local folder used to download the setup scripts. Default = temp folder. |
| `‑WhatIf` | Optional. Shows what would happen if the command runs without actually running it. |

<br>

## Examples

### Set up a local hub

```powershell
Initialize-FinOpsHubLocal
```

Sets up a local FinOps hub in the emulator at `http://localhost:8082` using the latest release.

### Set up the schema only

```powershell
Initialize-FinOpsHubLocal `
-RawRetentionInDays 30 `
-SkipOpenData
```

Creates the databases and applies the schema with 30-day raw retention, and skips loading open data.

<br>

## Related content

Related solutions:

- [Run FinOps hubs locally](../../hubs/run-hubs-locally.md)
- [FinOps hubs](../../hubs/finops-hubs-overview.md)

<br>
3 changes: 2 additions & 1 deletion docs-mslearn/toolkit/powershell/powershell-commands.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ title: FinOps toolkit PowerShell module
description: Automate and scale your FinOps efforts using the FinOps toolkit PowerShell module, which includes commands to manage FinOps solutions.
author: flanakin
ms.author: micflan
ms.date: 04/01/2026
ms.date: 07/31/2026
ms.topic: reference
ms.service: finops
ms.subservice: finops-toolkit
Expand Down Expand Up @@ -64,6 +64,7 @@ The FinOps toolkit PowerShell module includes commands to manage FinOps solution
- [Deploy-FinOpsHub](hubs/Deploy-FinOpsHub.md) – Deploy your first hub or update to the latest version.
- [Get-FinOpsHub](hubs/Get-FinOpsHub.md) – Get details about your FinOps hub instance.
- [Initialize-FinOpsHubDeployment](hubs/Initialize-FinOpsHubDeployment.md) – Initializes the deployment for FinOps hubs.
- [Initialize-FinOpsHubLocal](hubs/initialize-finopshublocal.md) – Set up a local FinOps hub in a running Kusto emulator.
- [Register-FinOpsHubProviders](hubs/Register-FinOpsHubProviders.md) – Registers resource providers for FinOps hubs.
- [Remove-FinOpsHub](hubs/Remove-FinOpsHub.md) – Deletes a FinOps hub instance.

Expand Down
87 changes: 87 additions & 0 deletions src/powershell/Private/Invoke-FinOpsHubLocalCommand.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
# Copyright (c) Microsoft Corporation.
# Licensed under the MIT License.

<#
.SYNOPSIS
Sends a single command or query to a local FinOps hub (Kusto emulator) HTTP endpoint.

.DESCRIPTION
Posts a management command or query to a running Kusto emulator over its REST API. Used by Initialize-FinOpsHubLocal to set up a local FinOps hub. This command does not manage the container; the emulator must already be running.

.PARAMETER ClusterUri
Required. Base URI of the running Kusto emulator (for example, http://localhost:8082).

.PARAMETER Database
Required. Name of the database to run the command against.

.PARAMETER Command
Required. The management command (starting with '.') or query to run.

.PARAMETER Endpoint
Optional. The REST endpoint to use: 'mgmt' for management commands (default) or 'query' for queries.

.PARAMETER TimeoutSec
Optional. Maximum number of seconds to wait for a response. Default = 0 (wait indefinitely).
#>
function Invoke-FinOpsHubLocalCommand
{
[Diagnostics.CodeAnalysis.SuppressMessage("PSAvoidUsingEmptyCatchBlock", "", Justification="Not all failures have a JSON error body (for example, a connection failure); ignore parse errors and fall through to rethrow the original exception.")]
[CmdletBinding()]
param
(
[Parameter(Mandatory)]
[ValidateNotNullOrEmpty()]
[string]
$ClusterUri,

[Parameter(Mandatory)]
[ValidateNotNullOrEmpty()]
[string]
$Database,

[Parameter(Mandatory)]
[ValidateNotNullOrEmpty()]
[string]
$Command,

[Parameter()]
[ValidateSet('mgmt', 'query')]
[string]
$Endpoint = 'mgmt',

[Parameter()]
[ValidateRange(0, [int]::MaxValue)]
[int]
$TimeoutSec = 0
)

$uri = '{0}/v1/rest/{1}' -f $ClusterUri.TrimEnd('/'), $Endpoint
$body = @{ db = $Database; csl = $Command } | ConvertTo-Json -Compress

try
{
return Invoke-RestMethod -Uri $uri -Method 'Post' -ContentType 'application/json' -Body $body -TimeoutSec $TimeoutSec -ErrorAction 'Stop'
}
catch
{
# Kusto returns a structured JSON error body. Surface its message/code when present;
# otherwise rethrow the original exception (for example, a connection failure) as-is.
$content = $null
if ($null -ne $_.ErrorDetails -and -not [string]::IsNullOrWhiteSpace($_.ErrorDetails.Message))
{
try
{
$content = $_.ErrorDetails.Message | ConvertFrom-Json -Depth 10
}
catch {}
}

if ($null -ne $content -and $content.PSObject.Properties['error'])
{
$errorBody = $content.error
throw ($script:LocalizedData.Common_ErrorResponse -f $errorBody.message, $errorBody.code)
}

throw
}
}
Loading
Loading