Expose per-endpoint dead-letter destination as a queryable contract (#3104)#3107
Merged
Merged
Conversation
…3104) Adds a transport-agnostic DeadLetterStorageMode enum { Durable, Native, NativeWithRecovery } and a virtual Endpoint.DeadLetterStorage (default Durable), surfaced as a first-class typed field on EndpointDescriptor (the GH-3009 pattern CritterWatch reads). Monitoring tools can now introspect where each endpoint's dead letters go — durable store vs native broker DLQ, and whether native->durable recovery is enabled — without transport-specific knowledge, to detect un-bridged native DLQs and recommend recovery. Per-transport reporting: - RabbitMQ: Native (DLX) / NativeWithRecovery when EnableDeadLetterQueueRecovery is set / Durable for WolverineStorage mode. - SQS, Azure Service Bus, Redis, Kafka, GCP Pub/Sub: Native when a native DLQ is configured, Durable when disabled. - Everything else (local, etc.): Durable. The DeadLetterStorage row is dropped from the reflected Properties to avoid double-shipping alongside the typed field (matching Mode/IsListener). Docs: new "Introspecting an Endpoint's Dead Letter Destination" section on the dead-letter-storage page. Tests: core descriptor tests (default Durable + no Properties duplication) and per-transport contract tests for SQS, Azure Service Bus, and RabbitMQ. Closes #3104. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This was referenced Jun 15, 2026
This was referenced Jun 17, 2026
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #3104.
Summary
There was no transport-agnostic way to ask "where do this endpoint's dead letters go?" — it was encoded in per-transport config (
DeadLetterQueueName,DeadLetterQueueMode, the ASB$DeadLetterQueuesub-queue, …). This adds a uniform, queryable contract so a monitor like CritterWatch can detect endpoints that dead-letter natively without recovery to durable storage and recommend the fix — without leaking transport-specific knowledge.The contract
A transport-agnostic enum:
exposed two ways:
Endpoint.DeadLetterStorage(virtual, defaultDurable) on the endpoint model.EndpointDescriptor.DeadLetterStorageas a first-class typed field on the diagnostic descriptor surface monitoring tools read (the Promote Mode + IsListener to typed fields on EndpointDescriptor; drop Wolverine.Http capability's redundant Sets.Routes #3009 pattern; the reflectedPropertiesrow is dropped so it isn't double-shipped).Per-transport reporting
Native(DLX) ·NativeWithRecoverywhenEnableDeadLetterQueueRecovery()is set ·DurableforWolverineStoragemodeNativewhen a DLQ is configured ·Durablewhen disabledNative(managed DLQ queue / native sub-queue) ·Durablewhen disabledNativewhen a native DLQ is configured ·DurableotherwiseDurableDocumentation
New "Introspecting an Endpoint's Dead Letter Destination" section on the Dead Letter Storage page, with the enum semantics table and how to read the contract.
Tests
Durableand doesn't duplicate the value inProperties.Verification
wolverine.slnxRelease build clean (0 warnings / 0 errors).Pairs with
#3103 — together a monitor can (a) detect un-bridged native DLQs via this contract and (b) point users at the one-call
EnableDeadLetterQueueRecovery()fix.🤖 Generated with Claude Code