Fix health check query not executed#4927
Conversation
* Health check can falsely return OK even if Cosmos is down or inaccessible. ([microsoft#4926](microsoft#4926))
There was a problem hiding this comment.
Pull request overview
This pull request fixes the Cosmos DB health check so it actually executes a query (preventing false “OK” results when Cosmos is unreachable), and updates the API’s unit tests, changelog, and version accordingly.
Changes:
- Execute the Cosmos query by iterating the async result (
async for ... break) withmax_item_count=1. - Add unit tests covering Cosmos HTTP errors and query-time request errors.
- Update
CHANGELOG.mdand bumpapi_appversion.
Reviewed changes
Copilot reviewed 4 out of 4 changed files in this pull request and generated 1 comment.
| File | Description |
|---|---|
api_app/services/health_checker.py |
Forces Cosmos query execution during health check and maps CosmosHttpResponseError to “not accessible”. |
api_app/tests_ma/test_services/test_health_checker.py |
Adds tests for Cosmos HTTP/query-time failures (but one existing “responding” test needs updating to reflect the new iteration behavior). |
CHANGELOG.md |
Documents the bug fix under Unreleased “BUG FIXES”. |
api_app/_version.py |
Bumps API version from 0.25.16 to 0.25.17. |
Unit Test Results683 tests 683 ✅ 8s ⏱️ Results for commit 0009c90. ♻️ This comment has been updated with latest results. |
api.dependencies.database.Database.
get_container_proxy instead of azure.cosmos.aio.ContainerProxy.query_items .
• Configured the return value of get_container_proxy_mock to be a mock container whose
query_items function returns a real async iterator: AsyncIterator([{"id": "item"}]) .
• Verified that all unit tests pass, and successfully ran the entire test suite (all 675 tests
passed).
|
/test |
|
🤖 pr-bot 🤖 🏃 Running tests: https://github.com/microsoft/AzureTRE/actions/runs/28439249321 (with refid (in response to this comment from @rudolphjacksonm) |
marrobi
left a comment
There was a problem hiding this comment.
From Opus 4.8:
Blocking concerns: (1) create_state_store_status() still has ambiguous success semantics—ok is returned whenever iteration does not raise, including the zero-result path, which can mask real Cosmos connectivity/auth/partition misconfiguration depending on SDK behavior; please make success depend on a definitive successful probe operation (not just “no exception while iterating”) and add an explicit test for empty results.
(2) The new tests rely on custom async iterator doubles + MagicMock that may drift from actual azure.cosmos.aio.ContainerProxy.query_items behavior and create false confidence across SDK changes; please tighten fidelity (e.g., AsyncMock/shared fixture with realistic async iterable behavior) and assert the exact query_items call contract ("SELECT TOP 1 * FROM c", max_item_count=1) so regressions are caught.
In health_checker.py: • Added an explicit await container.read() call before iterating over container.query_items . 2. High-Fidelity Mocking & Exact Call Contract AssertionsIn test_health_checker.py: • Replaced the custom class-based async iterator double ( AsyncIteratorWithError ) with Python's built-in AsyncMock to configure asynchronous iteration. This uses native mocking behavior ( |
| await container.read() | ||
| async for _ in container.query_items("SELECT TOP 1 * FROM c", max_item_count=1): | ||
| break |
There was a problem hiding this comment.
This extra read was added in response to opus feedback to "make success depend on a definitive successful probe operation".
implementation with await container.read() + query_items("SELECT TOP 1 * FROM c") is the only approach that fully satisfies the Opus 4.8 code review. It ensures we have a definitive probe that prevents masked failures, while still allowing the health check to succeed on an, empty database.
Resolves #4926
What is being addressed
The existing code
container.query_items("SELECT TOP 1 * FROM c")does not actually execute the query so the health check can falsely return OK even if Cosmos is down or inaccessible.How is this addressed