Repository navigation
fix(azure): collect Synapse recommendations in the provider fan-out - #382
Conversation
The Synapse client was complete and tested but never called from GetRecommendations. Search and Managed Redis stay out: Search has no valid Consumption resource type and no reservation prices (#197), and Managed Redis queries the same RedisCache resource type as the cache client, so wiring it would emit the same recommendations twice. Refs #47 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configuration
You can disable this status message by setting the Use the checkbox below for a quick retry:
Comment |
|
Independent review (claude-opus-5-5) of 479eddb: APPROVE Scope: this PR's own diff against its parent #378 (2673415), commits 57168a5 and 479eddb. Review only; no Azure calls were needed for this diff. Evidence (local, fresh clone, macOS, fixture-based):
Non-blocking:
Gate notes (not findings against this diff):
|
…he GetRecommendations doc Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Independent review (claude-opus-5-5) of 87db9c8: APPROVE Re-review against parent #378 (462df7e). Merge-base = 462df7e. Review only.
Non-blocking: if strict isolation is wanted, stubbing Synapse in |
…overs #378, #382) (#400) * fix(azure): surface skipped consumption recommendations as a typed partial-result error A non-USD billing currency or an unpriceable SKU was dropped with only a log line, so an EUR or GBP account looked like it had no savings. The skips are now recorded on a context-carried SkipLog and returned from GetRecommendations as *PartialResultError alongside the recommendations that did succeed. Closes #362 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(azure): derive Advisor recommendation fields from the payload and fail loud on truncation Only subscription-scoped reservation and Savings Plan Advisor recommendations are converted; resize and shutdown recommendations are no longer emitted as RI purchases with count 0. Commitment type, term, SKU and quantity come from the extended properties and a missing or unknown value is skipped with a recorded reason instead of defaulting. A page cap or page error now surfaces as a PartialResultError rather than a silently partial list. Refs #292 Refs #252 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(azure): drop Advisor Savings Plan rows the Benefit Recommendations client covers Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(azure): keep a subscription's recommendations when its error is a partial result PartialResultError was only reachable from the internal package and the multi-subscription merge counted any error as a failed subscription, dropping its recommendations. Export the type and AsPartialResult, give it a Partial() method, and aggregate skips across subscriptions. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(azure): ignore unmapped Advisor reservation types and tidy the Advisor converter Advisor routinely returns reservations for services this collector does not price; recording them as skips made nearly every subscription partial. Savings Plan rows now use ServiceSavingsPlansAll, the savings amount guard tests are restored, and the now-unused extractServiceType is removed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(azure): collect Synapse recommendations in the provider fan-out (#382) * fix(azure): collect Synapse recommendations in the provider fan-out The Synapse client was complete and tested but never called from GetRecommendations. Search and Managed Redis stay out: Search has no valid Consumption resource type and no reservation prices (#197), and Managed Redis queries the same RedisCache resource type as the cache client, so wiring it would emit the same recommendations twice. Refs #47 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(azure): repair merge of the Synapse wiring onto the Advisor branch Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(azure): stub the Synapse client in the adapter fan-out tests Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(azure): satisfy lint in the Advisor converter Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Refs #47 (wires Synapse; Search and Managed Redis are deliberately left out, see below, so #47 stays open until that is decided)
Stacked on #378 (base
fix/292-azure-advisor-derive-fields). Merge order: #366, #378, this.Per-client check
SqlDataWarehouse), pricer,AppendConsumptionVariants, pagination cap, and 50 tests. Wired underServiceDataWarehouse, covered by the new adapter test, and excluded when another service is requested.GetRecommendationsis an intentional no-op.AzureSearchis not a valid Consumption resourceType, and fix(azure/search): Azure Cognitive Search has no reservation rows in the retail catalog, so quotes always error #197 shows the retail catalog has no Cognitive Search reservation rows, so quotes always fail. Wiring it would add nothing.RedisCache, the same resource type the already-wired cache client queries, so wiring it would emit each Redis recommendation twice. NewerAzure_Managed_Redis_*SKUs are also unsupported (feat(azure): define newer Managed Redis SKU support across discovery and quotes #188). It needs a decision on how it splits from the cache client first.Evidence
TestGetRecommendations_CollectsSynapseForDataWarehouseis fixture-based (fake client) and does not compile on the parent, which has no Synapse constructor hook.go test ./...in providers/azure passes; pre-commit gocyclo passes (the Advisor-fn fallback was extracted to keepGetRecommendationsunder the limit).🤖 Generated with Claude Code