Skip to content

feat: add duration and traceId to degraded events#8455

Open
cryptodev-2s wants to merge 16 commits intomainfrom
feat/degraded-event-duration-traceid
Open

feat: add duration and traceId to degraded events#8455
cryptodev-2s wants to merge 16 commits intomainfrom
feat/degraded-event-duration-traceid

Conversation

@cryptodev-2s
Copy link
Copy Markdown
Contributor

@cryptodev-2s cryptodev-2s commented Apr 14, 2026

Explanation

RPC endpoint degraded events (NetworkController:rpcEndpointDegraded and NetworkController:rpcEndpointChainDegraded) now include two new optional properties in their payloads:

  • duration (number | undefined): The policy execution time in milliseconds when the request succeeded but was slow (i.e., exceeded the degradedThreshold). This is undefined when the degraded event was caused by retries being exhausted.

  • traceId (string | undefined): The value of the x-trace-id response header from the last request attempt. This enables correlating degraded events with backend traces for debugging RPC health issues. It is undefined when no response was received or the header was not present.

How it works

The duration value originates from Cockatiel's retryPolicy.onSuccess callback in createServicePolicy. Previously, it was only used for the threshold comparison — now it is also emitted as part of the degraded event data.

The traceId is captured in RpcService from response.headers.get('x-trace-id') in the same finally block that tracks rpcMethodName, ensuring it reflects the last completed request attempt (handling concurrent request race conditions correctly).

Both values are threaded through the event chain: createServicePolicyRpcServiceRpcServiceChaincreateNetworkClient → messenger events.

Breaking change

The RpcServiceRequestable type's onDegraded listener signature now includes duration?: number and traceId?: string in its data parameter. Implementors of this interface will need to accept the new fields in their onDegraded callback signature.

References

Checklist

  • I've updated the test suite for new or updated code as appropriate
  • I've updated documentation (JSDoc, Markdown, etc.) for new or updated code as appropriate
  • I've communicated my changes to consumers by updating changelogs for packages I've changed
  • I've introduced breaking changes in this PR and have prepared draft pull requests for clients and consumer packages to resolve them

Note

Medium Risk
Introduces a breaking change to ServicePolicy.onDegraded/RpcServiceRequestable.onDegraded payload shapes and threads new fields through RPC service event plumbing, which may break downstream listeners and requires careful validation of event data in degraded scenarios.

Overview
Degraded service events now include timing metadata: createServicePolicy emits { duration } for slow-success cases (removing the previous void payload) while still emitting FailureReason when retries are exhausted.

Network degraded messenger events (NetworkController:rpcEndpointDegraded and NetworkController:rpcEndpointChainDegraded) now include optional duration and traceId fields, with traceId captured from the x-trace-id response header in RpcService and forwarded through RpcServiceChain/createNetworkClient.

Updates types, changelogs, and tests to reflect the new payload shapes (breaking for onDegraded listener signatures).

Reviewed by Cursor Bugbot for commit e61cfa5. Bugbot is set up for automated code reviews on this repo. Configure here.

@cryptodev-2s cryptodev-2s force-pushed the feat/degraded-event-duration-traceid branch from e3eb1a1 to c4cf4d5 Compare April 14, 2026 19:03
@cryptodev-2s
Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-preview

@github-actions
Copy link
Copy Markdown
Contributor

Preview builds have been published. Learn how to use preview builds in other projects.

Expand for full list of packages and versions.
@metamask-previews/account-tree-controller@7.0.0-preview-c4cf4d5
@metamask-previews/accounts-controller@37.2.0-preview-c4cf4d5
@metamask-previews/address-book-controller@7.1.1-preview-c4cf4d5
@metamask-previews/ai-controllers@0.6.3-preview-c4cf4d5
@metamask-previews/analytics-controller@1.0.1-preview-c4cf4d5
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-c4cf4d5
@metamask-previews/announcement-controller@8.1.0-preview-c4cf4d5
@metamask-previews/app-metadata-controller@2.0.1-preview-c4cf4d5
@metamask-previews/approval-controller@9.0.1-preview-c4cf4d5
@metamask-previews/assets-controller@5.0.0-preview-c4cf4d5
@metamask-previews/assets-controllers@103.1.1-preview-c4cf4d5
@metamask-previews/base-controller@9.1.0-preview-c4cf4d5
@metamask-previews/base-data-service@0.1.1-preview-c4cf4d5
@metamask-previews/bridge-controller@70.0.1-preview-c4cf4d5
@metamask-previews/bridge-status-controller@70.0.5-preview-c4cf4d5
@metamask-previews/build-utils@3.0.4-preview-c4cf4d5
@metamask-previews/chain-agnostic-permission@1.5.0-preview-c4cf4d5
@metamask-previews/claims-controller@0.5.0-preview-c4cf4d5
@metamask-previews/client-controller@1.0.1-preview-c4cf4d5
@metamask-previews/compliance-controller@2.0.0-preview-c4cf4d5
@metamask-previews/composable-controller@12.0.1-preview-c4cf4d5
@metamask-previews/config-registry-controller@0.2.0-preview-c4cf4d5
@metamask-previews/connectivity-controller@0.2.0-preview-c4cf4d5
@metamask-previews/controller-utils@11.20.0-preview-c4cf4d5
@metamask-previews/core-backend@6.2.1-preview-c4cf4d5
@metamask-previews/delegation-controller@3.0.0-preview-c4cf4d5
@metamask-previews/earn-controller@12.0.0-preview-c4cf4d5
@metamask-previews/eip-5792-middleware@3.0.3-preview-c4cf4d5
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.0-preview-c4cf4d5
@metamask-previews/eip1193-permission-middleware@1.0.3-preview-c4cf4d5
@metamask-previews/ens-controller@19.1.1-preview-c4cf4d5
@metamask-previews/eth-block-tracker@15.0.1-preview-c4cf4d5
@metamask-previews/eth-json-rpc-middleware@23.1.1-preview-c4cf4d5
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-c4cf4d5
@metamask-previews/foundryup@1.0.1-preview-c4cf4d5
@metamask-previews/gas-fee-controller@26.1.1-preview-c4cf4d5
@metamask-previews/gator-permissions-controller@3.0.1-preview-c4cf4d5
@metamask-previews/geolocation-controller@0.1.2-preview-c4cf4d5
@metamask-previews/json-rpc-engine@10.2.4-preview-c4cf4d5
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-c4cf4d5
@metamask-previews/keyring-controller@25.2.0-preview-c4cf4d5
@metamask-previews/logging-controller@8.0.1-preview-c4cf4d5
@metamask-previews/message-manager@14.1.1-preview-c4cf4d5
@metamask-previews/messenger@1.1.1-preview-c4cf4d5
@metamask-previews/messenger-cli@0.1.0-preview-c4cf4d5
@metamask-previews/money-account-controller@0.1.0-preview-c4cf4d5
@metamask-previews/multichain-account-service@8.0.1-preview-c4cf4d5
@metamask-previews/multichain-api-middleware@2.0.0-preview-c4cf4d5
@metamask-previews/multichain-network-controller@3.0.6-preview-c4cf4d5
@metamask-previews/multichain-transactions-controller@7.0.4-preview-c4cf4d5
@metamask-previews/name-controller@9.1.1-preview-c4cf4d5
@metamask-previews/network-controller@30.0.1-preview-c4cf4d5
@metamask-previews/network-enablement-controller@5.0.2-preview-c4cf4d5
@metamask-previews/notification-services-controller@23.1.0-preview-c4cf4d5
@metamask-previews/permission-controller@12.3.0-preview-c4cf4d5
@metamask-previews/permission-log-controller@5.1.0-preview-c4cf4d5
@metamask-previews/perps-controller@3.0.0-preview-c4cf4d5
@metamask-previews/phishing-controller@17.1.1-preview-c4cf4d5
@metamask-previews/polling-controller@16.0.4-preview-c4cf4d5
@metamask-previews/preferences-controller@23.1.0-preview-c4cf4d5
@metamask-previews/profile-metrics-controller@3.1.3-preview-c4cf4d5
@metamask-previews/profile-sync-controller@28.0.2-preview-c4cf4d5
@metamask-previews/ramps-controller@13.1.0-preview-c4cf4d5
@metamask-previews/rate-limit-controller@7.0.1-preview-c4cf4d5
@metamask-previews/react-data-query@0.2.0-preview-c4cf4d5
@metamask-previews/remote-feature-flag-controller@4.2.0-preview-c4cf4d5
@metamask-previews/sample-controllers@4.0.4-preview-c4cf4d5
@metamask-previews/seedless-onboarding-controller@9.1.0-preview-c4cf4d5
@metamask-previews/selected-network-controller@26.1.0-preview-c4cf4d5
@metamask-previews/shield-controller@5.1.1-preview-c4cf4d5
@metamask-previews/signature-controller@39.1.2-preview-c4cf4d5
@metamask-previews/social-controllers@0.1.0-preview-c4cf4d5
@metamask-previews/storage-service@1.0.1-preview-c4cf4d5
@metamask-previews/subscription-controller@6.1.2-preview-c4cf4d5
@metamask-previews/transaction-controller@64.2.0-preview-c4cf4d5
@metamask-previews/transaction-pay-controller@19.1.1-preview-c4cf4d5
@metamask-previews/user-operation-controller@41.2.0-preview-c4cf4d5

@cryptodev-2s cryptodev-2s force-pushed the feat/degraded-event-duration-traceid branch from b9ab587 to e8262db Compare April 14, 2026 20:14
@cryptodev-2s cryptodev-2s marked this pull request as ready for review April 14, 2026 20:50
@cryptodev-2s cryptodev-2s requested review from a team as code owners April 14, 2026 20:50
@cryptodev-2s cryptodev-2s self-assigned this Apr 14, 2026
Copy link
Copy Markdown

@cursor cursor bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 4fd9aed. Configure here.

@cryptodev-2s
Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-preview

@cryptodev-2s
Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-preview

@github-actions
Copy link
Copy Markdown
Contributor

Preview builds have been published. Learn how to use preview builds in other projects.

Expand for full list of packages and versions.
@metamask-previews/account-tree-controller@7.0.0-preview-e61cfa5
@metamask-previews/accounts-controller@37.2.0-preview-e61cfa5
@metamask-previews/address-book-controller@7.1.1-preview-e61cfa5
@metamask-previews/ai-controllers@0.6.3-preview-e61cfa5
@metamask-previews/analytics-controller@1.0.1-preview-e61cfa5
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-e61cfa5
@metamask-previews/announcement-controller@8.1.0-preview-e61cfa5
@metamask-previews/app-metadata-controller@2.0.1-preview-e61cfa5
@metamask-previews/approval-controller@9.0.1-preview-e61cfa5
@metamask-previews/assets-controller@5.0.0-preview-e61cfa5
@metamask-previews/assets-controllers@103.1.1-preview-e61cfa5
@metamask-previews/base-controller@9.0.1-preview-e61cfa5
@metamask-previews/base-data-service@0.1.1-preview-e61cfa5
@metamask-previews/bridge-controller@70.0.1-preview-e61cfa5
@metamask-previews/bridge-status-controller@70.0.5-preview-e61cfa5
@metamask-previews/build-utils@3.0.4-preview-e61cfa5
@metamask-previews/chain-agnostic-permission@1.5.0-preview-e61cfa5
@metamask-previews/claims-controller@0.5.0-preview-e61cfa5
@metamask-previews/client-controller@1.0.1-preview-e61cfa5
@metamask-previews/compliance-controller@2.0.0-preview-e61cfa5
@metamask-previews/composable-controller@12.0.1-preview-e61cfa5
@metamask-previews/config-registry-controller@0.2.0-preview-e61cfa5
@metamask-previews/connectivity-controller@0.2.0-preview-e61cfa5
@metamask-previews/controller-utils@11.20.0-preview-e61cfa5
@metamask-previews/core-backend@6.2.1-preview-e61cfa5
@metamask-previews/delegation-controller@3.0.0-preview-e61cfa5
@metamask-previews/earn-controller@12.0.0-preview-e61cfa5
@metamask-previews/eip-5792-middleware@3.0.3-preview-e61cfa5
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.0-preview-e61cfa5
@metamask-previews/eip1193-permission-middleware@1.0.3-preview-e61cfa5
@metamask-previews/ens-controller@19.1.1-preview-e61cfa5
@metamask-previews/eth-block-tracker@15.0.1-preview-e61cfa5
@metamask-previews/eth-json-rpc-middleware@23.1.1-preview-e61cfa5
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-e61cfa5
@metamask-previews/foundryup@1.0.1-preview-e61cfa5
@metamask-previews/gas-fee-controller@26.1.1-preview-e61cfa5
@metamask-previews/gator-permissions-controller@3.0.1-preview-e61cfa5
@metamask-previews/geolocation-controller@0.1.2-preview-e61cfa5
@metamask-previews/json-rpc-engine@10.2.4-preview-e61cfa5
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-e61cfa5
@metamask-previews/keyring-controller@25.2.0-preview-e61cfa5
@metamask-previews/logging-controller@8.0.1-preview-e61cfa5
@metamask-previews/message-manager@14.1.1-preview-e61cfa5
@metamask-previews/messenger@1.1.1-preview-e61cfa5
@metamask-previews/messenger-cli@0.1.0-preview-e61cfa5
@metamask-previews/money-account-controller@0.1.0-preview-e61cfa5
@metamask-previews/multichain-account-service@8.0.1-preview-e61cfa5
@metamask-previews/multichain-api-middleware@2.0.0-preview-e61cfa5
@metamask-previews/multichain-network-controller@3.0.6-preview-e61cfa5
@metamask-previews/multichain-transactions-controller@7.0.4-preview-e61cfa5
@metamask-previews/name-controller@9.1.1-preview-e61cfa5
@metamask-previews/network-controller@30.0.1-preview-e61cfa5
@metamask-previews/network-enablement-controller@5.0.2-preview-e61cfa5
@metamask-previews/notification-services-controller@23.1.0-preview-e61cfa5
@metamask-previews/permission-controller@12.3.0-preview-e61cfa5
@metamask-previews/permission-log-controller@5.1.0-preview-e61cfa5
@metamask-previews/perps-controller@3.0.0-preview-e61cfa5
@metamask-previews/phishing-controller@17.1.1-preview-e61cfa5
@metamask-previews/polling-controller@16.0.4-preview-e61cfa5
@metamask-previews/preferences-controller@23.1.0-preview-e61cfa5
@metamask-previews/profile-metrics-controller@3.1.3-preview-e61cfa5
@metamask-previews/profile-sync-controller@28.0.2-preview-e61cfa5
@metamask-previews/ramps-controller@13.1.0-preview-e61cfa5
@metamask-previews/rate-limit-controller@7.0.1-preview-e61cfa5
@metamask-previews/react-data-query@0.2.0-preview-e61cfa5
@metamask-previews/remote-feature-flag-controller@4.2.0-preview-e61cfa5
@metamask-previews/sample-controllers@4.0.4-preview-e61cfa5
@metamask-previews/seedless-onboarding-controller@9.1.0-preview-e61cfa5
@metamask-previews/selected-network-controller@26.1.0-preview-e61cfa5
@metamask-previews/shield-controller@5.1.1-preview-e61cfa5
@metamask-previews/signature-controller@39.1.2-preview-e61cfa5
@metamask-previews/social-controllers@0.1.0-preview-e61cfa5
@metamask-previews/storage-service@1.0.1-preview-e61cfa5
@metamask-previews/subscription-controller@6.1.2-preview-e61cfa5
@metamask-previews/transaction-controller@64.2.0-preview-e61cfa5
@metamask-previews/transaction-pay-controller@19.1.1-preview-e61cfa5
@metamask-previews/user-operation-controller@41.2.0-preview-e61cfa5

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant