Repository navigation
Fix Kafka AppHost health-check producer lifetime - #20092
Conversation
|
🚀 Dogfood this PR with:
curl -fsSL https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.sh | bash -s -- 20092Or
iex "& { $(irm https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.ps1) } 20092" |
This comment has been minimized.
This comment has been minimized.
There was a problem hiding this comment.
Copilot review overview
Review tier: Balanced
Findings: None
💡 Add a code-review agent skill for context-aware, tailored reviews. Learn more in the docs.
|
Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt. |
|
Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt. |
|
Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt. |
PR Testing ReportPR Information
Artifact Version Verification
Changes Analyzed
Test Scenario ExecutedFresh packaged AppHost lifecycle, including outage and recoveryObjective: Validate the shipped PR artifacts, real resource orchestration, dashboard state, health-check reuse, and disposal without private reflection. Status: Passed. Created a fresh file-based C# AppHost using the installed PR CLI and the explicit PR template hive: "$cli" new aspire-empty --name KafkaPrSmoke --output "$temp/KafkaPrSmoke" \
--source "$hive" --version 13.6.0-pr.20092.g15c2c650 \
--language csharp --localhost-tld false --suppress-agent-init --non-interactiveAdded the PR-version Kafka package and two "$cli" start --apphost "$apphost" --launch-profile http --isolated --format Json --non-interactiveThe temporary harness observed public health-check factory results and captured managed stacks using All phases deliberately used the same fresh AppHost so reuse could be verified across failure and recovery:
All CLI follow-up commands supplied the explicit Lifetime observationsCounts include normal background monitoring as well as explicit probe rounds.
The captured thread stacks contain EvidencePreserved under the session's
Installation, template creation, broker lifecycle, and Summary
Overall ResultPR Kafka behavior verified against the packaged artifacts. At the end of this test run, CI had failed VS Code browser-debugger E2E jobs on Linux and Windows, with the aggregate test/final checks consequently failed. Those jobs are outside the changed Kafka area and were not diagnosed by this focused run; their cause is not established here. CleanupThe AppHost and detached CLI processes exited; both owned broker containers were removed; the isolated headless browser was closed. The temporary project and PR installation were deleted. Evidence and the harness were retained in session artifacts. The repository working tree remained clean. |
|
/backport to release/13.5 |
|
Started backporting to |
Register a DI-owned keyed singleton per Kafka resource so repeated health checks reuse their producer and AppHost disposal releases it. Add public-API coverage for singleton ownership, resource isolation, and deferred connection-string availability. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
15c2c65 to
f1aa806
Compare
Tests selector2 / 99 PR test projects · 2 PR jobs · 0 advisory-only targets, from 2 changed files. Selected PR test projects (2 / 99)
Selected PR jobs (2)
Advisory workflow impact (0)none How these were chosen — grouped by what changed🔧 🧪 Job reasons
Selection computed for commit |
|
Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt. |
|
Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt. |
James Newton-King (JamesNK)
left a comment
There was a problem hiding this comment.
Reviewed the Kafka health-check lifetime change and regression coverage. 0 issues found.
Updated [Aspire.Hosting.JavaScript](https://github.com/microsoft/aspire) from 13.5.3 to 13.6.1. <details> <summary>Release notes</summary> _Sourced from [Aspire.Hosting.JavaScript's releases](https://github.com/microsoft/aspire/releases)._ ## 13.6.1 ## What's New in Aspire 13.6.1 Patch release for Aspire 13.6 that reduces dashboard CPU usage during sustained metric ingestion, restores scrolling in the Metrics tree, improves dashboard navigation, fixes container exec watch failures, and ensures session-scoped containers are cleaned up when stopping .NET AppHosts on Windows. ### 🐛 Fixes - 📊 **Dashboard CPU usage could increase during long-running metric ingestion** — Metric retention repeatedly scanned retained history on every insertion, causing steadily increasing CPU usage even with a fixed workload. Cleanup now skips dimensions below capacity and removes only the oldest surplus points when needed. Existing retention limits and exemplar behavior are unchanged, and no configuration changes are required. Regression introduced in 13.6. Fixes [#20725](https://github.com/microsoft/aspire/issues/20725). ([#20747](https://github.com/microsoft/aspire/pull/20747), backport of [#20736](https://github.com/microsoft/aspire/pull/20736), @JamesNK) - 📈 **The Metrics tree could not be scrolled** — The meter and instrument tree now scrolls when it exceeds the viewport, allowing you to reach and select instruments below the fold. Regression introduced in 13.6. Fixes [#20728](https://github.com/microsoft/aspire/issues/20728). ([#20762](https://github.com/microsoft/aspire/pull/20762), backport of [#20758](https://github.com/microsoft/aspire/pull/20758), @heyysiri) - 🧭 **Dashboard navigation could fail after a browser disconnect** — Pending page-state updates now persist session state before navigating and skip navigation when the browser has disconnected, avoiding an unhandled navigation failure. The navigation rail's overflow button also has consistent sizing, icon alignment, and hover styling in expanded and collapsed layouts and both light and dark themes. ([#20545](https://github.com/microsoft/aspire/pull/20545), backport of [#20527](https://github.com/microsoft/aspire/pull/20527), @JamesNK) - 🖥️ **Container exec watches could terminate shortly after AppHost startup** — A stalled DCP watch connection could produce a critical `Watch task over Kubernetes ContainerExec resources terminated unexpectedly` error and stop subsequent terminal state and log updates from being observed. Watch connection attempts now retry after timeouts, and periodic restarts correctly recreate connections without swallowing unrelated cancellation. Regression introduced in 13.6.0. ([#20664](https://github.com/microsoft/aspire/pull/20664), backport of [#20466](https://github.com/microsoft/aspire/pull/20466), @radical) - 🪟 **Session-scoped containers could remain running after stopping a .NET AppHost on Windows** — AppHosts launched through `dotnet run` or `dotnet watch` now allow DCP to finish resource cleanup during shutdown, including existing Ctrl+C and `aspire stop` flows. Persistent resources remain unaffected, while direct .NET launches and TypeScript/polyglot AppHosts retain their existing process protection. Fixes [#20495](https://github.com/microsoft/aspire/issues/20495). ([#20514](https://github.com/microsoft/aspire/pull/20514), backport of [#20494](https://github.com/microsoft/aspire/pull/20494), @danegsta) --- *Full Changelog: [v13.6.0...v13.6.1](https://github.com/microsoft/aspire/compare/v13.6.0...v13.6.1)* *Full commit: [3751e615ad660621f2a7aa4c390ef48e08a0eed8](https://github.com/microsoft/aspire/commit/3751e615ad660621f2a7aa4c390ef48e08a0eed8)* ## 13.6.0 # Aspire 13.6.0 Aspire 13.6 brings persistent application history, a refreshed and more interactive dashboard, first-party Java and Rust hosting, and new Azure deployment options. Coordinated .NET builds, portable volume paths, sharper CLI workflows, and more capable editor tooling make it easier to build, debug, and deploy applications across languages. ## Highlights - 🗃️ **Persistent, refreshed dashboard** — SQLite-backed telemetry and resource snapshots let you revisit up to ten application runs, with read-only access to completed runs and default retention limits of 100,000 console log messages, structured logs, and traces each. The dashboard now ships as Native AOT and adopts Fluent UI v5 with a collapsible navigation rail. - 🖥️ **AppHost-owned terminals and database REPLs** — Experimental terminal APIs let AppHosts create interactive sessions in a dashboard dock, dialog, or separate window. Opt-in `WithRepl()` commands open bundled clients for PostgreSQL, MySQL, MongoDB, SQL Server, Redis, and Valkey, while `aspire terminal ps` and `aspire terminal tape play` support discovery and repeatable terminal interactions. - 🌐 **First-party Java and Rust hosting** — New `Aspire.Hosting.Java` and `Aspire.Hosting.Rust` packages bring Maven, Gradle, Spring Boot, Quarkus, and Cargo applications into the app model, with generated container builds and VS Code debugging. These integrations build on work that originated in the Aspire Community Toolkit. - 🛠️ **More flexible AppHosts** — The prerelease `Aspire.Hosting.Dotnet` integration coordinates compatible projects into shared restore and build groups and supports .NET SDK container publishing. Portable volume-path environment variables work across local execution and deployment, while TypeScript AppHosts gain standard `appsettings.json` configuration and Deno runtime support. - ⌨️ **Sharper CLI workflows** — Select launch profiles with `aspire run` and `aspire start`, update repository-local CLI manifests with `aspire update`, create file-based C# AppHosts with `aspire init --language csharp --file-based`, and export TypeScript API data with `aspire sdk export`. Terminal commands no longer need a feature flag, Linux certificate trust includes Firefox NSS databases, and `aspire stop --force --volumes` adds explicit cleanup of Aspire-owned volumes. - 💻 **More capable VS Code tooling** — Coding agents can start and stop AppHosts through the extension, and the Aspire pane exposes deploy, publish, and pipeline actions. Multi-root discovery, worktree-scoped lifecycle operations, preserved launch arguments, clearer debug logs, and missing-debugger guidance make complex workspaces more predictable. - ☁️ **New Azure options in preview** — Azure Connector Namespace models external-service connections and managed MCP server configurations. Azure Container Apps Sandboxes adds isolated sandbox deployments with configurable resource tiers and lifecycle policies, while Azure Container Apps Express offers a simplified environment option for rapid provisioning. - ☸️ **More expressive, reliable deployments** — Experimental Azure Provisioning SDK proxies let polyglot AppHosts customize infrastructure. Deployment state is isolated under `ASPIRE_HOME`, Kubernetes preserves inherited hostnames and embedded parameter values, and AKS gains persistent-volume provisioning and more reliable cleanup. - 🔌 **Expanded integrations** — Experimental Deno hosting and MongoDB replica sets join Foundry Toolboxes, remote Foundry Local endpoints, Blazor WebAssembly debugging, and configurable Dev Tunnel expiration. Azure Cosmos DB and AI Inference client integrations gain health checks, and the vNext Cosmos DB emulator sends its own telemetry to the dashboard. ## ⚠️ Breaking changes Notable changes include automatic TLS for local MongoDB servers when a certificate is available, the Linux-based vNext Cosmos DB emulator becoming the default, new Azure Front Door origin names that can require cleanup of existing origins, portable connection-string environment-variable aliases on stricter deployment targets, and experimental terminal types moving from `Aspire.Hosting.Terminals` to `Aspire.Hosting.ApplicationModel`. See the full list and migration guidance in the [Aspire 13.6 breaking changes](https://aspire.dev/whats-new/aspire-13-6/#breaking-changes). ## 📖 Learn more For complete details, examples, migration guidance, and everything new in this release, read [What's new in Aspire 13.6](https://aspire.dev/whats-new/aspire-13-6/). Thank you to all the community contributors who helped make Aspire 13.6 possible! 💜 --- _Full Changelog: [v13.5.4...v13.6.0](https://github.com/microsoft/aspire/compare/v13.5.4...v13.6.0)_ _Full commit: [56f3e9c0d216c0c7069dabb49dd0464e4827744f](https://github.com/microsoft/aspire/commit/56f3e9c0d216c0c7069dabb49dd0464e4827744f)_ ## 13.5.4 ## What's New in Aspire 13.5.4 Patch release for Aspire 13.5 that fixes Kafka health-check resource leaks, DevTunnel errors with automatically selected regions, misleading Azure emulator dashboard entries, and unintended changes to generated starter apps, plus Homebrew compatibility and Radius API diagnostic updates. ### 🐛 Fixes - 📨 **Kafka health checks leaked producers and polling threads** — Each AppHost health-check execution created a new Kafka producer without disposing it, accumulating background threads over time. Health checks now reuse a producer per Kafka resource and dispose it with the AppHost, while keeping multiple Kafka resources independently configured. Fixes [#20091](https://github.com/microsoft/aspire/issues/20091). ([#20094](https://github.com/microsoft/aspire/pull/20094), backport of [#20092](https://github.com/microsoft/aspire/pull/20092), @davidfowl) - 🌐 **DevTunnels could fail when the region was selected automatically** — Tunnel setup and health checks now use the cluster-qualified tunnel ID returned by the DevTunnel CLI for port operations and access queries. This fixes failures when a bare tunnel ID cannot be resolved for those operations. Regression introduced in 13.3. Fixes [#18790](https://github.com/microsoft/aspire/issues/18790). ([#19853](https://github.com/microsoft/aspire/pull/19853), backport of [#19230](https://github.com/microsoft/aspire/pull/19230), @Vladipz) - ☁️ **Emulator-only AppHosts showed an unused Azure environment** — The dashboard now hides the `azure-environment` resource when no Azure resources require cloud provisioning, instead of leaving it visible in **Not started**. It remains visible for apps that combine local emulators with resources requiring Azure provisioning. No AppHost changes are needed. Fixes [#19617](https://github.com/microsoft/aspire/issues/19617). ([#19998](https://github.com/microsoft/aspire/pull/19998), backport of [#19843](https://github.com/microsoft/aspire/pull/19843), @eerhardt) - 🧩 **Starter app generation could alter unrelated JavaScript values** — Dynamic port replacement could also replace matching numeric literals in bundled JavaScript, including Bootstrap timing values. Port substitutions are now restricted to `localhost:` URLs, preserving the original library files while still configuring the requested ports. Fixes [#20030](https://github.com/microsoft/aspire/issues/20030). ([#20110](https://github.com/microsoft/aspire/pull/20110), backport of [#20031](https://github.com/microsoft/aspire/pull/20031), @bart-vmware, @JamesNK) - 🍎 **Updated the Aspire Homebrew cask for Homebrew 6.x** — Replaced deprecated cask URL and post-install syntax with the supported equivalents, resolving compatibility issues with current Homebrew while preserving install-channel metadata. ([#20119](https://github.com/microsoft/aspire/pull/20119), backport of [#19965](https://github.com/microsoft/aspire/pull/19965), @askpt, @joperezr) - 🧪 **Radius cloud-provider callback interfaces now carry the experimental diagnostic** — `IAwsRadiusProviderBuilder` and `IAzureRadiusProviderBuilder` are now marked with `ASPIRERADIUS003`, matching the existing `WithAwsProvider` and `WithAzureProvider` methods. Code referencing these interfaces directly must now acknowledge the same experimental API diagnostic. ([#19874](https://github.com/microsoft/aspire/pull/19874), @sebastienros) --- *Full Changelog: [v13.5.3...v13.5.4](https://github.com/microsoft/aspire/compare/v13.5.3...v13.5.4)* *Full commit: [9c1b401dd67746739044f68959cbf4d3d7af93a6](https://github.com/microsoft/aspire/commit/9c1b401dd67746739044f68959cbf4d3d7af93a6)* Commits viewable in [compare view](https://github.com/microsoft/aspire/compare/v13.5.3...v13.6.1). </details> Updated [Aspire.Hosting.PostgreSQL](https://github.com/microsoft/aspire) from 13.5.3 to 13.6.1. <details> <summary>Release notes</summary> _Sourced from [Aspire.Hosting.PostgreSQL's releases](https://github.com/microsoft/aspire/releases)._ ## 13.6.1 ## What's New in Aspire 13.6.1 Patch release for Aspire 13.6 that reduces dashboard CPU usage during sustained metric ingestion, restores scrolling in the Metrics tree, improves dashboard navigation, fixes container exec watch failures, and ensures session-scoped containers are cleaned up when stopping .NET AppHosts on Windows. ### 🐛 Fixes - 📊 **Dashboard CPU usage could increase during long-running metric ingestion** — Metric retention repeatedly scanned retained history on every insertion, causing steadily increasing CPU usage even with a fixed workload. Cleanup now skips dimensions below capacity and removes only the oldest surplus points when needed. Existing retention limits and exemplar behavior are unchanged, and no configuration changes are required. Regression introduced in 13.6. Fixes [#20725](https://github.com/microsoft/aspire/issues/20725). ([#20747](https://github.com/microsoft/aspire/pull/20747), backport of [#20736](https://github.com/microsoft/aspire/pull/20736), @JamesNK) - 📈 **The Metrics tree could not be scrolled** — The meter and instrument tree now scrolls when it exceeds the viewport, allowing you to reach and select instruments below the fold. Regression introduced in 13.6. Fixes [#20728](https://github.com/microsoft/aspire/issues/20728). ([#20762](https://github.com/microsoft/aspire/pull/20762), backport of [#20758](https://github.com/microsoft/aspire/pull/20758), @heyysiri) - 🧭 **Dashboard navigation could fail after a browser disconnect** — Pending page-state updates now persist session state before navigating and skip navigation when the browser has disconnected, avoiding an unhandled navigation failure. The navigation rail's overflow button also has consistent sizing, icon alignment, and hover styling in expanded and collapsed layouts and both light and dark themes. ([#20545](https://github.com/microsoft/aspire/pull/20545), backport of [#20527](https://github.com/microsoft/aspire/pull/20527), @JamesNK) - 🖥️ **Container exec watches could terminate shortly after AppHost startup** — A stalled DCP watch connection could produce a critical `Watch task over Kubernetes ContainerExec resources terminated unexpectedly` error and stop subsequent terminal state and log updates from being observed. Watch connection attempts now retry after timeouts, and periodic restarts correctly recreate connections without swallowing unrelated cancellation. Regression introduced in 13.6.0. ([#20664](https://github.com/microsoft/aspire/pull/20664), backport of [#20466](https://github.com/microsoft/aspire/pull/20466), @radical) - 🪟 **Session-scoped containers could remain running after stopping a .NET AppHost on Windows** — AppHosts launched through `dotnet run` or `dotnet watch` now allow DCP to finish resource cleanup during shutdown, including existing Ctrl+C and `aspire stop` flows. Persistent resources remain unaffected, while direct .NET launches and TypeScript/polyglot AppHosts retain their existing process protection. Fixes [#20495](https://github.com/microsoft/aspire/issues/20495). ([#20514](https://github.com/microsoft/aspire/pull/20514), backport of [#20494](https://github.com/microsoft/aspire/pull/20494), @danegsta) --- *Full Changelog: [v13.6.0...v13.6.1](https://github.com/microsoft/aspire/compare/v13.6.0...v13.6.1)* *Full commit: [3751e615ad660621f2a7aa4c390ef48e08a0eed8](https://github.com/microsoft/aspire/commit/3751e615ad660621f2a7aa4c390ef48e08a0eed8)* ## 13.6.0 # Aspire 13.6.0 Aspire 13.6 brings persistent application history, a refreshed and more interactive dashboard, first-party Java and Rust hosting, and new Azure deployment options. Coordinated .NET builds, portable volume paths, sharper CLI workflows, and more capable editor tooling make it easier to build, debug, and deploy applications across languages. ## Highlights - 🗃️ **Persistent, refreshed dashboard** — SQLite-backed telemetry and resource snapshots let you revisit up to ten application runs, with read-only access to completed runs and default retention limits of 100,000 console log messages, structured logs, and traces each. The dashboard now ships as Native AOT and adopts Fluent UI v5 with a collapsible navigation rail. - 🖥️ **AppHost-owned terminals and database REPLs** — Experimental terminal APIs let AppHosts create interactive sessions in a dashboard dock, dialog, or separate window. Opt-in `WithRepl()` commands open bundled clients for PostgreSQL, MySQL, MongoDB, SQL Server, Redis, and Valkey, while `aspire terminal ps` and `aspire terminal tape play` support discovery and repeatable terminal interactions. - 🌐 **First-party Java and Rust hosting** — New `Aspire.Hosting.Java` and `Aspire.Hosting.Rust` packages bring Maven, Gradle, Spring Boot, Quarkus, and Cargo applications into the app model, with generated container builds and VS Code debugging. These integrations build on work that originated in the Aspire Community Toolkit. - 🛠️ **More flexible AppHosts** — The prerelease `Aspire.Hosting.Dotnet` integration coordinates compatible projects into shared restore and build groups and supports .NET SDK container publishing. Portable volume-path environment variables work across local execution and deployment, while TypeScript AppHosts gain standard `appsettings.json` configuration and Deno runtime support. - ⌨️ **Sharper CLI workflows** — Select launch profiles with `aspire run` and `aspire start`, update repository-local CLI manifests with `aspire update`, create file-based C# AppHosts with `aspire init --language csharp --file-based`, and export TypeScript API data with `aspire sdk export`. Terminal commands no longer need a feature flag, Linux certificate trust includes Firefox NSS databases, and `aspire stop --force --volumes` adds explicit cleanup of Aspire-owned volumes. - 💻 **More capable VS Code tooling** — Coding agents can start and stop AppHosts through the extension, and the Aspire pane exposes deploy, publish, and pipeline actions. Multi-root discovery, worktree-scoped lifecycle operations, preserved launch arguments, clearer debug logs, and missing-debugger guidance make complex workspaces more predictable. - ☁️ **New Azure options in preview** — Azure Connector Namespace models external-service connections and managed MCP server configurations. Azure Container Apps Sandboxes adds isolated sandbox deployments with configurable resource tiers and lifecycle policies, while Azure Container Apps Express offers a simplified environment option for rapid provisioning. - ☸️ **More expressive, reliable deployments** — Experimental Azure Provisioning SDK proxies let polyglot AppHosts customize infrastructure. Deployment state is isolated under `ASPIRE_HOME`, Kubernetes preserves inherited hostnames and embedded parameter values, and AKS gains persistent-volume provisioning and more reliable cleanup. - 🔌 **Expanded integrations** — Experimental Deno hosting and MongoDB replica sets join Foundry Toolboxes, remote Foundry Local endpoints, Blazor WebAssembly debugging, and configurable Dev Tunnel expiration. Azure Cosmos DB and AI Inference client integrations gain health checks, and the vNext Cosmos DB emulator sends its own telemetry to the dashboard. ## ⚠️ Breaking changes Notable changes include automatic TLS for local MongoDB servers when a certificate is available, the Linux-based vNext Cosmos DB emulator becoming the default, new Azure Front Door origin names that can require cleanup of existing origins, portable connection-string environment-variable aliases on stricter deployment targets, and experimental terminal types moving from `Aspire.Hosting.Terminals` to `Aspire.Hosting.ApplicationModel`. See the full list and migration guidance in the [Aspire 13.6 breaking changes](https://aspire.dev/whats-new/aspire-13-6/#breaking-changes). ## 📖 Learn more For complete details, examples, migration guidance, and everything new in this release, read [What's new in Aspire 13.6](https://aspire.dev/whats-new/aspire-13-6/). Thank you to all the community contributors who helped make Aspire 13.6 possible! 💜 --- _Full Changelog: [v13.5.4...v13.6.0](https://github.com/microsoft/aspire/compare/v13.5.4...v13.6.0)_ _Full commit: [56f3e9c0d216c0c7069dabb49dd0464e4827744f](https://github.com/microsoft/aspire/commit/56f3e9c0d216c0c7069dabb49dd0464e4827744f)_ ## 13.5.4 ## What's New in Aspire 13.5.4 Patch release for Aspire 13.5 that fixes Kafka health-check resource leaks, DevTunnel errors with automatically selected regions, misleading Azure emulator dashboard entries, and unintended changes to generated starter apps, plus Homebrew compatibility and Radius API diagnostic updates. ### 🐛 Fixes - 📨 **Kafka health checks leaked producers and polling threads** — Each AppHost health-check execution created a new Kafka producer without disposing it, accumulating background threads over time. Health checks now reuse a producer per Kafka resource and dispose it with the AppHost, while keeping multiple Kafka resources independently configured. Fixes [#20091](https://github.com/microsoft/aspire/issues/20091). ([#20094](https://github.com/microsoft/aspire/pull/20094), backport of [#20092](https://github.com/microsoft/aspire/pull/20092), @davidfowl) - 🌐 **DevTunnels could fail when the region was selected automatically** — Tunnel setup and health checks now use the cluster-qualified tunnel ID returned by the DevTunnel CLI for port operations and access queries. This fixes failures when a bare tunnel ID cannot be resolved for those operations. Regression introduced in 13.3. Fixes [#18790](https://github.com/microsoft/aspire/issues/18790). ([#19853](https://github.com/microsoft/aspire/pull/19853), backport of [#19230](https://github.com/microsoft/aspire/pull/19230), @Vladipz) - ☁️ **Emulator-only AppHosts showed an unused Azure environment** — The dashboard now hides the `azure-environment` resource when no Azure resources require cloud provisioning, instead of leaving it visible in **Not started**. It remains visible for apps that combine local emulators with resources requiring Azure provisioning. No AppHost changes are needed. Fixes [#19617](https://github.com/microsoft/aspire/issues/19617). ([#19998](https://github.com/microsoft/aspire/pull/19998), backport of [#19843](https://github.com/microsoft/aspire/pull/19843), @eerhardt) - 🧩 **Starter app generation could alter unrelated JavaScript values** — Dynamic port replacement could also replace matching numeric literals in bundled JavaScript, including Bootstrap timing values. Port substitutions are now restricted to `localhost:` URLs, preserving the original library files while still configuring the requested ports. Fixes [#20030](https://github.com/microsoft/aspire/issues/20030). ([#20110](https://github.com/microsoft/aspire/pull/20110), backport of [#20031](https://github.com/microsoft/aspire/pull/20031), @bart-vmware, @JamesNK) - 🍎 **Updated the Aspire Homebrew cask for Homebrew 6.x** — Replaced deprecated cask URL and post-install syntax with the supported equivalents, resolving compatibility issues with current Homebrew while preserving install-channel metadata. ([#20119](https://github.com/microsoft/aspire/pull/20119), backport of [#19965](https://github.com/microsoft/aspire/pull/19965), @askpt, @joperezr) - 🧪 **Radius cloud-provider callback interfaces now carry the experimental diagnostic** — `IAwsRadiusProviderBuilder` and `IAzureRadiusProviderBuilder` are now marked with `ASPIRERADIUS003`, matching the existing `WithAwsProvider` and `WithAzureProvider` methods. Code referencing these interfaces directly must now acknowledge the same experimental API diagnostic. ([#19874](https://github.com/microsoft/aspire/pull/19874), @sebastienros) --- *Full Changelog: [v13.5.3...v13.5.4](https://github.com/microsoft/aspire/compare/v13.5.3...v13.5.4)* *Full commit: [9c1b401dd67746739044f68959cbf4d3d7af93a6](https://github.com/microsoft/aspire/commit/9c1b401dd67746739044f68959cbf4d3d7af93a6)* Commits viewable in [compare view](https://github.com/microsoft/aspire/compare/v13.5.3...v13.6.1). </details> Updated [Aspire.Hosting.RabbitMQ](https://github.com/microsoft/aspire) from 13.5.3 to 13.6.1. <details> <summary>Release notes</summary> _Sourced from [Aspire.Hosting.RabbitMQ's releases](https://github.com/microsoft/aspire/releases)._ ## 13.6.1 ## What's New in Aspire 13.6.1 Patch release for Aspire 13.6 that reduces dashboard CPU usage during sustained metric ingestion, restores scrolling in the Metrics tree, improves dashboard navigation, fixes container exec watch failures, and ensures session-scoped containers are cleaned up when stopping .NET AppHosts on Windows. ### 🐛 Fixes - 📊 **Dashboard CPU usage could increase during long-running metric ingestion** — Metric retention repeatedly scanned retained history on every insertion, causing steadily increasing CPU usage even with a fixed workload. Cleanup now skips dimensions below capacity and removes only the oldest surplus points when needed. Existing retention limits and exemplar behavior are unchanged, and no configuration changes are required. Regression introduced in 13.6. Fixes [#20725](https://github.com/microsoft/aspire/issues/20725). ([#20747](https://github.com/microsoft/aspire/pull/20747), backport of [#20736](https://github.com/microsoft/aspire/pull/20736), @JamesNK) - 📈 **The Metrics tree could not be scrolled** — The meter and instrument tree now scrolls when it exceeds the viewport, allowing you to reach and select instruments below the fold. Regression introduced in 13.6. Fixes [#20728](https://github.com/microsoft/aspire/issues/20728). ([#20762](https://github.com/microsoft/aspire/pull/20762), backport of [#20758](https://github.com/microsoft/aspire/pull/20758), @heyysiri) - 🧭 **Dashboard navigation could fail after a browser disconnect** — Pending page-state updates now persist session state before navigating and skip navigation when the browser has disconnected, avoiding an unhandled navigation failure. The navigation rail's overflow button also has consistent sizing, icon alignment, and hover styling in expanded and collapsed layouts and both light and dark themes. ([#20545](https://github.com/microsoft/aspire/pull/20545), backport of [#20527](https://github.com/microsoft/aspire/pull/20527), @JamesNK) - 🖥️ **Container exec watches could terminate shortly after AppHost startup** — A stalled DCP watch connection could produce a critical `Watch task over Kubernetes ContainerExec resources terminated unexpectedly` error and stop subsequent terminal state and log updates from being observed. Watch connection attempts now retry after timeouts, and periodic restarts correctly recreate connections without swallowing unrelated cancellation. Regression introduced in 13.6.0. ([#20664](https://github.com/microsoft/aspire/pull/20664), backport of [#20466](https://github.com/microsoft/aspire/pull/20466), @radical) - 🪟 **Session-scoped containers could remain running after stopping a .NET AppHost on Windows** — AppHosts launched through `dotnet run` or `dotnet watch` now allow DCP to finish resource cleanup during shutdown, including existing Ctrl+C and `aspire stop` flows. Persistent resources remain unaffected, while direct .NET launches and TypeScript/polyglot AppHosts retain their existing process protection. Fixes [#20495](https://github.com/microsoft/aspire/issues/20495). ([#20514](https://github.com/microsoft/aspire/pull/20514), backport of [#20494](https://github.com/microsoft/aspire/pull/20494), @danegsta) --- *Full Changelog: [v13.6.0...v13.6.1](https://github.com/microsoft/aspire/compare/v13.6.0...v13.6.1)* *Full commit: [3751e615ad660621f2a7aa4c390ef48e08a0eed8](https://github.com/microsoft/aspire/commit/3751e615ad660621f2a7aa4c390ef48e08a0eed8)* ## 13.6.0 # Aspire 13.6.0 Aspire 13.6 brings persistent application history, a refreshed and more interactive dashboard, first-party Java and Rust hosting, and new Azure deployment options. Coordinated .NET builds, portable volume paths, sharper CLI workflows, and more capable editor tooling make it easier to build, debug, and deploy applications across languages. ## Highlights - 🗃️ **Persistent, refreshed dashboard** — SQLite-backed telemetry and resource snapshots let you revisit up to ten application runs, with read-only access to completed runs and default retention limits of 100,000 console log messages, structured logs, and traces each. The dashboard now ships as Native AOT and adopts Fluent UI v5 with a collapsible navigation rail. - 🖥️ **AppHost-owned terminals and database REPLs** — Experimental terminal APIs let AppHosts create interactive sessions in a dashboard dock, dialog, or separate window. Opt-in `WithRepl()` commands open bundled clients for PostgreSQL, MySQL, MongoDB, SQL Server, Redis, and Valkey, while `aspire terminal ps` and `aspire terminal tape play` support discovery and repeatable terminal interactions. - 🌐 **First-party Java and Rust hosting** — New `Aspire.Hosting.Java` and `Aspire.Hosting.Rust` packages bring Maven, Gradle, Spring Boot, Quarkus, and Cargo applications into the app model, with generated container builds and VS Code debugging. These integrations build on work that originated in the Aspire Community Toolkit. - 🛠️ **More flexible AppHosts** — The prerelease `Aspire.Hosting.Dotnet` integration coordinates compatible projects into shared restore and build groups and supports .NET SDK container publishing. Portable volume-path environment variables work across local execution and deployment, while TypeScript AppHosts gain standard `appsettings.json` configuration and Deno runtime support. - ⌨️ **Sharper CLI workflows** — Select launch profiles with `aspire run` and `aspire start`, update repository-local CLI manifests with `aspire update`, create file-based C# AppHosts with `aspire init --language csharp --file-based`, and export TypeScript API data with `aspire sdk export`. Terminal commands no longer need a feature flag, Linux certificate trust includes Firefox NSS databases, and `aspire stop --force --volumes` adds explicit cleanup of Aspire-owned volumes. - 💻 **More capable VS Code tooling** — Coding agents can start and stop AppHosts through the extension, and the Aspire pane exposes deploy, publish, and pipeline actions. Multi-root discovery, worktree-scoped lifecycle operations, preserved launch arguments, clearer debug logs, and missing-debugger guidance make complex workspaces more predictable. - ☁️ **New Azure options in preview** — Azure Connector Namespace models external-service connections and managed MCP server configurations. Azure Container Apps Sandboxes adds isolated sandbox deployments with configurable resource tiers and lifecycle policies, while Azure Container Apps Express offers a simplified environment option for rapid provisioning. - ☸️ **More expressive, reliable deployments** — Experimental Azure Provisioning SDK proxies let polyglot AppHosts customize infrastructure. Deployment state is isolated under `ASPIRE_HOME`, Kubernetes preserves inherited hostnames and embedded parameter values, and AKS gains persistent-volume provisioning and more reliable cleanup. - 🔌 **Expanded integrations** — Experimental Deno hosting and MongoDB replica sets join Foundry Toolboxes, remote Foundry Local endpoints, Blazor WebAssembly debugging, and configurable Dev Tunnel expiration. Azure Cosmos DB and AI Inference client integrations gain health checks, and the vNext Cosmos DB emulator sends its own telemetry to the dashboard. ## ⚠️ Breaking changes Notable changes include automatic TLS for local MongoDB servers when a certificate is available, the Linux-based vNext Cosmos DB emulator becoming the default, new Azure Front Door origin names that can require cleanup of existing origins, portable connection-string environment-variable aliases on stricter deployment targets, and experimental terminal types moving from `Aspire.Hosting.Terminals` to `Aspire.Hosting.ApplicationModel`. See the full list and migration guidance in the [Aspire 13.6 breaking changes](https://aspire.dev/whats-new/aspire-13-6/#breaking-changes). ## 📖 Learn more For complete details, examples, migration guidance, and everything new in this release, read [What's new in Aspire 13.6](https://aspire.dev/whats-new/aspire-13-6/). Thank you to all the community contributors who helped make Aspire 13.6 possible! 💜 --- _Full Changelog: [v13.5.4...v13.6.0](https://github.com/microsoft/aspire/compare/v13.5.4...v13.6.0)_ _Full commit: [56f3e9c0d216c0c7069dabb49dd0464e4827744f](https://github.com/microsoft/aspire/commit/56f3e9c0d216c0c7069dabb49dd0464e4827744f)_ ## 13.5.4 ## What's New in Aspire 13.5.4 Patch release for Aspire 13.5 that fixes Kafka health-check resource leaks, DevTunnel errors with automatically selected regions, misleading Azure emulator dashboard entries, and unintended changes to generated starter apps, plus Homebrew compatibility and Radius API diagnostic updates. ### 🐛 Fixes - 📨 **Kafka health checks leaked producers and polling threads** — Each AppHost health-check execution created a new Kafka producer without disposing it, accumulating background threads over time. Health checks now reuse a producer per Kafka resource and dispose it with the AppHost, while keeping multiple Kafka resources independently configured. Fixes [#20091](https://github.com/microsoft/aspire/issues/20091). ([#20094](https://github.com/microsoft/aspire/pull/20094), backport of [#20092](https://github.com/microsoft/aspire/pull/20092), @davidfowl) - 🌐 **DevTunnels could fail when the region was selected automatically** — Tunnel setup and health checks now use the cluster-qualified tunnel ID returned by the DevTunnel CLI for port operations and access queries. This fixes failures when a bare tunnel ID cannot be resolved for those operations. Regression introduced in 13.3. Fixes [#18790](https://github.com/microsoft/aspire/issues/18790). ([#19853](https://github.com/microsoft/aspire/pull/19853), backport of [#19230](https://github.com/microsoft/aspire/pull/19230), @Vladipz) - ☁️ **Emulator-only AppHosts showed an unused Azure environment** — The dashboard now hides the `azure-environment` resource when no Azure resources require cloud provisioning, instead of leaving it visible in **Not started**. It remains visible for apps that combine local emulators with resources requiring Azure provisioning. No AppHost changes are needed. Fixes [#19617](https://github.com/microsoft/aspire/issues/19617). ([#19998](https://github.com/microsoft/aspire/pull/19998), backport of [#19843](https://github.com/microsoft/aspire/pull/19843), @eerhardt) - 🧩 **Starter app generation could alter unrelated JavaScript values** — Dynamic port replacement could also replace matching numeric literals in bundled JavaScript, including Bootstrap timing values. Port substitutions are now restricted to `localhost:` URLs, preserving the original library files while still configuring the requested ports. Fixes [#20030](https://github.com/microsoft/aspire/issues/20030). ([#20110](https://github.com/microsoft/aspire/pull/20110), backport of [#20031](https://github.com/microsoft/aspire/pull/20031), @bart-vmware, @JamesNK) - 🍎 **Updated the Aspire Homebrew cask for Homebrew 6.x** — Replaced deprecated cask URL and post-install syntax with the supported equivalents, resolving compatibility issues with current Homebrew while preserving install-channel metadata. ([#20119](https://github.com/microsoft/aspire/pull/20119), backport of [#19965](https://github.com/microsoft/aspire/pull/19965), @askpt, @joperezr) - 🧪 **Radius cloud-provider callback interfaces now carry the experimental diagnostic** — `IAwsRadiusProviderBuilder` and `IAzureRadiusProviderBuilder` are now marked with `ASPIRERADIUS003`, matching the existing `WithAwsProvider` and `WithAzureProvider` methods. Code referencing these interfaces directly must now acknowledge the same experimental API diagnostic. ([#19874](https://github.com/microsoft/aspire/pull/19874), @sebastienros) --- *Full Changelog: [v13.5.3...v13.5.4](https://github.com/microsoft/aspire/compare/v13.5.3...v13.5.4)* *Full commit: [9c1b401dd67746739044f68959cbf4d3d7af93a6](https://github.com/microsoft/aspire/commit/9c1b401dd67746739044f68959cbf4d3d7af93a6)* Commits viewable in [compare view](https://github.com/microsoft/aspire/compare/v13.5.3...v13.6.1). </details> Updated [Aspire.Hosting.Redis](https://github.com/microsoft/aspire) from 13.5.3 to 13.6.1. <details> <summary>Release notes</summary> _Sourced from [Aspire.Hosting.Redis's releases](https://github.com/microsoft/aspire/releases)._ ## 13.6.1 ## What's New in Aspire 13.6.1 Patch release for Aspire 13.6 that reduces dashboard CPU usage during sustained metric ingestion, restores scrolling in the Metrics tree, improves dashboard navigation, fixes container exec watch failures, and ensures session-scoped containers are cleaned up when stopping .NET AppHosts on Windows. ### 🐛 Fixes - 📊 **Dashboard CPU usage could increase during long-running metric ingestion** — Metric retention repeatedly scanned retained history on every insertion, causing steadily increasing CPU usage even with a fixed workload. Cleanup now skips dimensions below capacity and removes only the oldest surplus points when needed. Existing retention limits and exemplar behavior are unchanged, and no configuration changes are required. Regression introduced in 13.6. Fixes [#20725](https://github.com/microsoft/aspire/issues/20725). ([#20747](https://github.com/microsoft/aspire/pull/20747), backport of [#20736](https://github.com/microsoft/aspire/pull/20736), @JamesNK) - 📈 **The Metrics tree could not be scrolled** — The meter and instrument tree now scrolls when it exceeds the viewport, allowing you to reach and select instruments below the fold. Regression introduced in 13.6. Fixes [#20728](https://github.com/microsoft/aspire/issues/20728). ([#20762](https://github.com/microsoft/aspire/pull/20762), backport of [#20758](https://github.com/microsoft/aspire/pull/20758), @heyysiri) - 🧭 **Dashboard navigation could fail after a browser disconnect** — Pending page-state updates now persist session state before navigating and skip navigation when the browser has disconnected, avoiding an unhandled navigation failure. The navigation rail's overflow button also has consistent sizing, icon alignment, and hover styling in expanded and collapsed layouts and both light and dark themes. ([#20545](https://github.com/microsoft/aspire/pull/20545), backport of [#20527](https://github.com/microsoft/aspire/pull/20527), @JamesNK) - 🖥️ **Container exec watches could terminate shortly after AppHost startup** — A stalled DCP watch connection could produce a critical `Watch task over Kubernetes ContainerExec resources terminated unexpectedly` error and stop subsequent terminal state and log updates from being observed. Watch connection attempts now retry after timeouts, and periodic restarts correctly recreate connections without swallowing unrelated cancellation. Regression introduced in 13.6.0. ([#20664](https://github.com/microsoft/aspire/pull/20664), backport of [#20466](https://github.com/microsoft/aspire/pull/20466), @radical) - 🪟 **Session-scoped containers could remain running after stopping a .NET AppHost on Windows** — AppHosts launched through `dotnet run` or `dotnet watch` now allow DCP to finish resource cleanup during shutdown, including existing Ctrl+C and `aspire stop` flows. Persistent resources remain unaffected, while direct .NET launches and TypeScript/polyglot AppHosts retain their existing process protection. Fixes [#20495](https://github.com/microsoft/aspire/issues/20495). ([#20514](https://github.com/microsoft/aspire/pull/20514), backport of [#20494](https://github.com/microsoft/aspire/pull/20494), @danegsta) --- *Full Changelog: [v13.6.0...v13.6.1](https://github.com/microsoft/aspire/compare/v13.6.0...v13.6.1)* *Full commit: [3751e615ad660621f2a7aa4c390ef48e08a0eed8](https://github.com/microsoft/aspire/commit/3751e615ad660621f2a7aa4c390ef48e08a0eed8)* ## 13.6.0 # Aspire 13.6.0 Aspire 13.6 brings persistent application history, a refreshed and more interactive dashboard, first-party Java and Rust hosting, and new Azure deployment options. Coordinated .NET builds, portable volume paths, sharper CLI workflows, and more capable editor tooling make it easier to build, debug, and deploy applications across languages. ## Highlights - 🗃️ **Persistent, refreshed dashboard** — SQLite-backed telemetry and resource snapshots let you revisit up to ten application runs, with read-only access to completed runs and default retention limits of 100,000 console log messages, structured logs, and traces each. The dashboard now ships as Native AOT and adopts Fluent UI v5 with a collapsible navigation rail. - 🖥️ **AppHost-owned terminals and database REPLs** — Experimental terminal APIs let AppHosts create interactive sessions in a dashboard dock, dialog, or separate window. Opt-in `WithRepl()` commands open bundled clients for PostgreSQL, MySQL, MongoDB, SQL Server, Redis, and Valkey, while `aspire terminal ps` and `aspire terminal tape play` support discovery and repeatable terminal interactions. - 🌐 **First-party Java and Rust hosting** — New `Aspire.Hosting.Java` and `Aspire.Hosting.Rust` packages bring Maven, Gradle, Spring Boot, Quarkus, and Cargo applications into the app model, with generated container builds and VS Code debugging. These integrations build on work that originated in the Aspire Community Toolkit. - 🛠️ **More flexible AppHosts** — The prerelease `Aspire.Hosting.Dotnet` integration coordinates compatible projects into shared restore and build groups and supports .NET SDK container publishing. Portable volume-path environment variables work across local execution and deployment, while TypeScript AppHosts gain standard `appsettings.json` configuration and Deno runtime support. - ⌨️ **Sharper CLI workflows** — Select launch profiles with `aspire run` and `aspire start`, update repository-local CLI manifests with `aspire update`, create file-based C# AppHosts with `aspire init --language csharp --file-based`, and export TypeScript API data with `aspire sdk export`. Terminal commands no longer need a feature flag, Linux certificate trust includes Firefox NSS databases, and `aspire stop --force --volumes` adds explicit cleanup of Aspire-owned volumes. - 💻 **More capable VS Code tooling** — Coding agents can start and stop AppHosts through the extension, and the Aspire pane exposes deploy, publish, and pipeline actions. Multi-root discovery, worktree-scoped lifecycle operations, preserved launch arguments, clearer debug logs, and missing-debugger guidance make complex workspaces more predictable. - ☁️ **New Azure options in preview** — Azure Connector Namespace models external-service connections and managed MCP server configurations. Azure Container Apps Sandboxes adds isolated sandbox deployments with configurable resource tiers and lifecycle policies, while Azure Container Apps Express offers a simplified environment option for rapid provisioning. - ☸️ **More expressive, reliable deployments** — Experimental Azure Provisioning SDK proxies let polyglot AppHosts customize infrastructure. Deployment state is isolated under `ASPIRE_HOME`, Kubernetes preserves inherited hostnames and embedded parameter values, and AKS gains persistent-volume provisioning and more reliable cleanup. - 🔌 **Expanded integrations** — Experimental Deno hosting and MongoDB replica sets join Foundry Toolboxes, remote Foundry Local endpoints, Blazor WebAssembly debugging, and configurable Dev Tunnel expiration. Azure Cosmos DB and AI Inference client integrations gain health checks, and the vNext Cosmos DB emulator sends its own telemetry to the dashboard. ## ⚠️ Breaking changes Notable changes include automatic TLS for local MongoDB servers when a certificate is available, the Linux-based vNext Cosmos DB emulator becoming the default, new Azure Front Door origin names that can require cleanup of existing origins, portable connection-string environment-variable aliases on stricter deployment targets, and experimental terminal types moving from `Aspire.Hosting.Terminals` to `Aspire.Hosting.ApplicationModel`. See the full list and migration guidance in the [Aspire 13.6 breaking changes](https://aspire.dev/whats-new/aspire-13-6/#breaking-changes). ## 📖 Learn more For complete details, examples, migration guidance, and everything new in this release, read [What's new in Aspire 13.6](https://aspire.dev/whats-new/aspire-13-6/). Thank you to all the community contributors who helped make Aspire 13.6 possible! 💜 --- _Full Changelog: [v13.5.4...v13.6.0](https://github.com/microsoft/aspire/compare/v13.5.4...v13.6.0)_ _Full commit: [56f3e9c0d216c0c7069dabb49dd0464e4827744f](https://github.com/microsoft/aspire/commit/56f3e9c0d216c0c7069dabb49dd0464e4827744f)_ ## 13.5.4 ## What's New in Aspire 13.5.4 Patch release for Aspire 13.5 that fixes Kafka health-check resource leaks, DevTunnel errors with automatically selected regions, misleading Azure emulator dashboard entries, and unintended changes to generated starter apps, plus Homebrew compatibility and Radius API diagnostic updates. ### 🐛 Fixes - 📨 **Kafka health checks leaked producers and polling threads** — Each AppHost health-check execution created a new Kafka producer without disposing it, accumulating background threads over time. Health checks now reuse a producer per Kafka resource and dispose it with the AppHost, while keeping multiple Kafka resources independently configured. Fixes [#20091](https://github.com/microsoft/aspire/issues/20091). ([#20094](https://github.com/microsoft/aspire/pull/20094), backport of [#20092](https://github.com/microsoft/aspire/pull/20092), @davidfowl) - 🌐 **DevTunnels could fail when the region was selected automatically** — Tunnel setup and health checks now use the cluster-qualified tunnel ID returned by the DevTunnel CLI for port operations and access queries. This fixes failures when a bare tunnel ID cannot be resolved for those operations. Regression introduced in 13.3. Fixes [#18790](https://github.com/microsoft/aspire/issues/18790). ([#19853](https://github.com/microsoft/aspire/pull/19853), backport of [#19230](https://github.com/microsoft/aspire/pull/19230), @Vladipz) - ☁️ **Emulator-only AppHosts showed an unused Azure environment** — The dashboard now hides the `azure-environment` resource when no Azure resources require cloud provisioning, instead of leaving it visible in **Not started**. It remains visible for apps that combine local emulators with resources requiring Azure provisioning. No AppHost changes are needed. Fixes [#19617](https://github.com/microsoft/aspire/issues/19617). ([#19998](https://github.com/microsoft/aspire/pull/19998), backport of [#19843](https://github.com/microsoft/aspire/pull/19843), @eerhardt) - 🧩 **Starter app generation could alter unrelated JavaScript values** — Dynamic port replacement could also replace matching numeric literals in bundled JavaScript, including Bootstrap timing values. Port substitutions are now restricted to `localhost:` URLs, preserving the original library files while still configuring the requested ports. Fixes [#20030](https://github.com/microsoft/aspire/issues/20030). ([#20110](https://github.com/microsoft/aspire/pull/20110), backport of [#20031](https://github.com/microsoft/aspire/pull/20031), @bart-vmware, @JamesNK) - 🍎 **Updated the Aspire Homebrew cask for Homebrew 6.x** — Replaced deprecated cask URL and post-install syntax with the supported equivalents, resolving compatibility issues with current Homebrew while preserving install-channel metadata. ([#20119](https://github.com/microsoft/aspire/pull/20119), backport of [#19965](https://github.com/microsoft/aspire/pull/19965), @askpt, @joperezr) - 🧪 **Radius cloud-provider callback interfaces now carry the experimental diagnostic** — `IAwsRadiusProviderBuilder` and `IAzureRadiusProviderBuilder` are now marked with `ASPIRERADIUS003`, matching the existing `WithAwsProvider` and `WithAzureProvider` methods. Code referencing these interfaces directly must now acknowledge the same experimental API diagnostic. ([#19874](https://github.com/microsoft/aspire/pull/19874), @sebastienros) --- *Full Changelog: [v13.5.3...v13.5.4](https://github.com/microsoft/aspire/compare/v13.5.3...v13.5.4)* *Full commit: [9c1b401dd67746739044f68959cbf4d3d7af93a6](https://github.com/microsoft/aspire/commit/9c1b401dd67746739044f68959cbf4d3d7af93a6)* Commits viewable in [compare view](https://github.com/microsoft/aspire/compare/v13.5.3...v13.6.1). </details> Updated [Aspire.Hosting.Testing](https://github.com/microsoft/aspire) from 13.5.3 to 13.6.1. <details> <summary>Release notes</summary> _Sourced from [Aspire.Hosting.Testing's releases](https://github.com/microsoft/aspire/releases)._ ## 13.6.1 ## What's New in Aspire 13.6.1 Patch release for Aspire 13.6 that reduces dashboard CPU usage during sustained metric ingestion, restores scrolling in the Metrics tree, improves dashboard navigation, fixes container exec watch failures, and ensures session-scoped containers are cleaned up when stopping .NET AppHosts on Windows. ### 🐛 Fixes - 📊 **Dashboard CPU usage could increase during long-running metric ingestion** — Metric retention repeatedly scanned retained history on every insertion, causing steadily increasing CPU usage even with a fixed workload. Cleanup now skips dimensions below capacity and removes only the oldest surplus points when needed. Existing retention limits and exemplar behavior are unchanged, and no configuration changes are required. Regression introduced in 13.6. Fixes [#20725](https://github.com/microsoft/aspire/issues/20725). ([#20747](https://github.com/microsoft/aspire/pull/20747), backport of [#20736](https://github.com/microsoft/aspire/pull/20736), @JamesNK) - 📈 **The Metrics tree could not be scrolled** — The meter and instrument tree now scrolls when it exceeds the viewport, allowing you to reach and select instruments below the fold. Regression introduced in 13.6. Fixes [#20728](https://github.com/microsoft/aspire/issues/20728). ([#20762](https://github.com/microsoft/aspire/pull/20762), backport of [#20758](https://github.com/microsoft/aspire/pull/20758), @heyysiri) - 🧭 **Dashboard navigation could fail after a browser disconnect** — Pending page-state updates now persist session state before navigating and skip navigation when the browser has disconnected, avoiding an unhandled navigation failure. The navigation rail's overflow button also has consistent sizing, icon alignment, and hover styling in expanded and collapsed layouts and both light and dark themes. ([#20545](https://github.com/microsoft/aspire/pull/20545), backport of [#20527](https://github.com/microsoft/aspire/pull/20527), @JamesNK) - 🖥️ **Container exec watches could terminate shortly after AppHost startup** — A stalled DCP watch connection could produce a critical `Watch task over Kubernetes ContainerExec resources terminated unexpectedly` error and stop subsequent terminal state and log updates from being observed. Watch connection attempts now retry after timeouts, and periodic restarts correctly recreate connections without swallowing unrelated cancellation. Regression introduced in 13.6.0. ([#20664](https://github.com/microsoft/aspire/pull/20664), backport of [#20466](https://github.com/microsoft/aspire/pull/20466), @radical) - 🪟 **Session-scoped containers could remain running after stopping a .NET AppHost on Windows** — AppHosts launched through `dotnet run` or `dotnet watch` now allow DCP to finish resource cleanup during shutdown, including existing Ctrl+C and `aspire stop` flows. Persistent resources remain unaffected, while direct .NET launches and TypeScript/polyglot AppHosts retain their existing process protection. Fixes [#20495](https://github.com/microsoft/aspire/issues/20495). ([#20514](https://github.com/microsoft/aspire/pull/20514), backport of [#20494](https://github.com/microsoft/aspire/pull/20494), @danegsta) --- *Full Changelog: [v13.6.0...v13.6.1](https://github.com/microsoft/aspire/compare/v13.6.0...v13.6.1)* *Full commit: [3751e615ad660621f2a7aa4c390ef48e08a0eed8](https://github.com/microsoft/aspire/commit/3751e615ad660621f2a7aa4c390ef48e08a0eed8)* ## 13.6.0 # Aspire 13.6.0 Aspire 13.6 brings persistent application history, a refreshed and more interactive dashboard, first-party Java and Rust hosting, and new Azure deployment options. Coordinated .NET builds, portable volume paths, sharper CLI workflows, and more capable editor tooling make it easier to build, debug, and deploy applications across languages. ## Highlights - 🗃️ **Persistent, refreshed dashboard** — SQLite-backed telemetry and resource snapshots let you revisit up to ten application runs, with read-only access to completed runs and default retention limits of 100,000 console log messages, structured logs, and traces each. The dashboard now ships as Native AOT and adopts Fluent UI v5 with a collapsible navigation rail. - 🖥️ **AppHost-owned terminals and database REPLs** — Experimental terminal APIs let AppHosts create interactive sessions in a dashboard dock, dialog, or separate window. Opt-in `WithRepl()` commands open bundled clients for PostgreSQL, MySQL, MongoDB, SQL Server, Redis, and Valkey, while `aspire terminal ps` and `aspire terminal tape play` support discovery and repeatable terminal interactions. - 🌐 **First-party Java and Rust hosting** — New `Aspire.Hosting.Java` and `Aspire.Hosting.Rust` packages bring Maven, Gradle, Spring Boot, Quarkus, and Cargo applications into the app model, with generated container builds and VS Code debugging. These integrations build on work that originated in the Aspire Community Toolkit. - 🛠️ **More flexible AppHosts** — The prerelease `Aspire.Hosting.Dotnet` integration coordinates compatible projects into shared restore and build groups and supports .NET SDK container publishing. Portable volume-path environment variables work across local execution and deployment, while TypeScript AppHosts gain standard `appsettings.json` configuration and Deno runtime support. - ⌨️ **Sharper CLI workflows** — Select launch profiles with `aspire run` and `aspire start`, update repository-local CLI manifests with `aspire update`, create file-based C# AppHosts with `aspire init --language csharp --file-based`, and export TypeScript API data with `aspire sdk export`. Terminal commands no longer need a feature flag, Linux certificate trust includes Firefox NSS databases, and `aspire stop --force --volumes` adds explicit cleanup of Aspire-owned volumes. - 💻 **More capable VS Code tooling** — Coding agents can start and stop AppHosts through the extension, and the Aspire pane exposes deploy, publish, and pipeline actions. Multi-root discovery, worktree-scoped lifecycle operations, preserved launch arguments, clearer debug logs, and missing-debugger guidance make complex workspaces more predictable. - ☁️ **New Azure options in preview** — Azure Connector Namespace models external-service connections and managed MCP server configurations. Azure Container Apps Sandboxes adds isolated sandbox deployments with configurable resource tiers and lifecycle policies, while Azure Container Apps Express offers a simplified environment option for rapid provisioning. - ☸️ **More expressive, reliable deployments** — Experimental Azure Provisioning SDK proxies let polyglot AppHosts customize infrastructure. Deployment state is isolated under `ASPIRE_HOME`, Kubernetes preserves inherited hostnames and embedded parameter values, and AKS gains persistent-volume provisioning and more reliable cleanup. - 🔌 **Expanded integrations** — Experimental Deno hosting and MongoDB replica sets join Foundry Toolboxes, remote Foundry Local endpoints, Blazor WebAssembly debugging, and configurable Dev Tunnel expiration. Azure Cosmos DB and AI Inference client integrations gain health checks, and the vNext Cosmos DB emulator sends its own telemetry to the dashboard. ## ⚠️ Breaking changes Notable changes include automatic TLS for local MongoDB servers when a certificate is available, the Linux-based vNext Cosmos DB emulator becoming the default, new Azure Front Door origin names that can require cleanup of existing origins, portable connection-string environment-variable aliases on stricter deployment targets, and experimental terminal types moving from `Aspire.Hosting.Terminals` to `Aspire.Hosting.ApplicationModel`. See the full list and migration guidance in the [Aspire 13.6 breaking changes](https://aspire.dev/whats-new/aspire-13-6/#breaking-changes). ## 📖 Learn more For complete details, examples, migration guidance, and everything new in this release, read [What's new in Aspire 13.6](https://aspire.dev/whats-new/aspire-13-6/). Thank you to all the community contributors who helped make Aspire 13.6 possible! 💜 --- _Full Changelog: [v13.5.4...v13.6.0](https://github.com/microsoft/aspire/compare/v13.5.4...v13.6.0)_ _Full commit: [56f3e9c0d216c0c7069dabb49dd0464e4827744f](https://github.com/microsoft/aspire/commit/56f3e9c0d216c0c7069dabb49dd0464e4827744f)_ ## 13.5.4 ## What's New in Aspire 13.5.4 Patch release for Aspire 13.5 that fixes Kafka health-check resource leaks, DevTunnel errors with automatically selected regions, misleading Azure emulator dashboard entries, and unintended changes to generated starter apps, plus Homebrew compatibility and Radius API diagnostic updates. ### 🐛 Fixes - 📨 **Kafka health checks leaked producers and polling threads** — Each AppHost health-check execution created a new Kafka producer without disposing it, accumulating background threads over time. Health checks now reuse a producer per Kafka resource and dispose it with the AppHost, while keeping multiple Kafka resources independently configured. Fixes [#20091](https://github.com/microsoft/aspire/issues/20091). ([#20094](https://github.com/microsoft/aspire/pull/20094), backport of [#20092](https://github.com/microsoft/aspire/pull/20092), @davidfowl) - 🌐 **DevTunnels could fail when the region was selected automatically** — Tunnel setup and health checks now use the cluster-qualified tunnel ID returned by the DevTunnel CLI for port operations and access queries. This fixes failures when a bare tunnel ID cannot be resolved for those operations. Regression introduced in 13.3. Fixes [#18790](https://github.com/microsoft/aspire/issues/18790). ([#19853](https://github.com/microsoft/aspire/pull/19853), backport of [#19230](https://github.com/microsoft/aspire/pull/19230), @Vladipz) - ☁️ **Emulator-only AppHosts showed an unused Azure environment** — The dashboard now hides the `azure-environment` resource when no Azure resources require cloud provisioning, instead of leaving it visible in **Not started**. It remains visible for apps that combine local emulators with resources requiring Azure provisioning. No AppHost changes are needed. Fixes [#19617](https://github.com/microsoft/aspire/issues/19617). ([#19998](https://github.com/microsoft/aspire/pull/19998), backport of [#19843](https://github.com/microsoft/aspire/pull/19843), @eerhardt) - 🧩 **Starter app generation could alter unrelated JavaScript values** — Dynamic port replacement could also replace matching numeric literals in bundled JavaScript, including Bootstrap timing values. Port substitutions are now restricted to `localhost:` URLs, preserving the original library files while still configuring the requested ports. Fixes [#20030](https://github.com/microsoft/aspire/issues/20030). ([#20110](https://github.com/microsoft/aspire/pull/20110), backport of [#20031](https://github.com/microsoft/aspire/pull/20031), @bart-vmware, @JamesNK) - 🍎 **Updated the Aspire Homebrew cask for Homebrew 6.x** — Replaced deprecated cask URL and post-install syntax with the supported equivalents, resolving compatibility issues with current Homebrew while preserving install-channel metadata. ([#20119](https://github.com/microsoft/aspire/pull/20119), backport of [#19965](https://github.com/microsoft/aspire/pull/19965), @askpt, @joperezr) - 🧪 **Radius cloud-provider callback interfaces now carry the experimental diagnostic** — `IAwsRadiusProviderBuilder` and `IAzureRadiusProviderBuilder` are now marked with `ASPIRERADIUS003`, matching the existing `WithAwsProvider` and `WithAzureProvider` methods. Code referencing these interfaces directly must now acknowledge the same experimental API diagnostic. ([#19874](https://github.com/microsoft/aspire/pull/19874), @sebastienros) --- *Full Changelog: [v13.5.3...v13.5.4](https://github.com/microsoft/aspire/compare/v13.5.3...v13.5.4)* *Full commit: [9c1b401dd67746739044f68959cbf4d3d7af93a6](https://github.com/microsoft/aspire/commit/9c1b401dd67746739044f68959cbf4d3d7af93a6)* Commits viewable in [compare view](https://github.com/microsoft/aspire/compare/v13.5.3...v13.6.1). </details> Updated [Aspire.Npgsql.EntityFrameworkCore.PostgreSQL](https://github.com/microsoft/aspire) from 13.5.3 to 13.6.1. <details> <summary>Release notes</summary> _Sourced from [Aspire.Npgsql.EntityFrameworkCore.PostgreSQL's releases](https://github.com/microsoft/aspire/releases)._ ## 13.6.1 ## What's New in Aspire 13.6.1 Patch release for Aspire 13.6 that reduces dashboard CPU usage during sustained metric ingestion, restores scrolling in the Metrics tree, improves dashboard navigation, fixes container exec watch failures, and ensures session-scoped containers are cleaned up when stopping .NET AppHosts on Windows. ### 🐛 Fixes - 📊 **Dashboard CPU usage could increase during long-running metric ingestion** — Metric retention repeatedly scanned retained history on every insertion, causing steadily increasing CPU usage even with a fixed workload. Cleanup now skips dimensions below capacity and removes only the oldest surplus points when needed. Existing retention limits and exemplar behavior are unchanged, and no configuration changes are required. Regression introduced in 13.6. Fixes [#20725](https://github.com/microsoft/aspire/issues/20725). ([#20747](https://github.com/microsoft/aspire/pull/20747), backport of [#20736](https://github.com/microsoft/aspire/pull/20736), @JamesNK) - 📈 **The Metrics tree could not be scrolled** — The meter and instrument tree now scrolls when it exceeds the viewport, allowing you to reach and select instruments below the fold. Regression introduced in 13.6. Fixes [#20728](https://github.com/microsoft/aspire/issues/20728). ([#20762](https://github.com/microsoft/aspire/pull/20762), backport of [#20758](https://github.com/microsoft/aspire/pull/20758), @heyysiri) - 🧭 **Dashboard navigation could fail after a browser disconnect** — Pending page-state updates now persist session state before navigating and skip navigation when the browser has disconnected, avoiding an unhandled navigation failure. The navigation rail's overflow button also has consistent sizing, icon alignment, and hover styling in expanded and collapsed layouts and both light and dark themes. ([#20545](https://github.com/microsoft/aspire/pull/20545), backport of [#20527](https://github.com/microsoft/aspire/pull/20527), @JamesNK) - 🖥️ **Container exec watches could terminate shortly after AppHost startup** — A stalled DCP watch connection could produce a critical `Watch task over Kubernetes ContainerExec resources terminated unexpectedly` error and …
Description
Kafka AppHost health checks currently create a new producer on every execution without disposing it, accumulating polling threads over time. Register each resource's
KafkaHealthCheckas a DI-owned keyed singleton so checks reuse their producer and AppHost disposal releases it.This preserves independent configuration for multiple Kafka resources and deferred connection-string initialization, following the existing client integration pattern. No public API, dependency, or producer-default changes are required.
Fixes: #20091
Validation
WaitForreadiness tests.HealthCheckService. All 80 additional probe results were healthy.Polling threads were identified using
dotnet-stackwhile the process remained alive after AppHost disposal. The standalone verification used no private reflection. Detailed evidence is attached to #20091. This verifies the lifetime leak, not the original report's exact CPU percentage.Checklist
<remarks />and<code />elements on your triple slash comments?