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.
|
I think this PR may also fixes this issue |
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?