Skip to content

fix: nest AssetsController Sentry sub spans under cold-start parents - #9672

Merged
salimtb merged 10 commits into
mainfrom
fix/assets-controller-sentry-subspans
Jul 29, 2026
Merged

fix: nest AssetsController Sentry sub spans under cold-start parents#9672
salimtb merged 10 commits into
mainfrom
fix/assets-controller-sentry-subspans

Conversation

@salimtb

@salimtb salimtb commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Avoid Sentry rate limits by nesting pipeline timings as subspans and emitting them only on the first unlock-session fetch, plus a single AggregatedBalanceSelector span for all wallets.

Explanation

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

Low Risk
Changes are limited to observability wiring and defensive error handling; asset fetch and state-update behavior is unchanged aside from when spans are emitted.

Overview
Reduces Sentry span volume and improves Assets Health dashboard fidelity by restructuring how AssetsController emits traces.

Tracing helpers — Inline #emitTrace is replaced by utils/trace.ts (emitTrace / withTrace). Omitting trace no-ops at call sites; numeric span data (especially duration_ms) is mirrored into tags and used to backdate startTime for p95 charts. withTrace treats Sentry/adapter rejections as best-effort so getAssets force updates and handleAssetsUpdate still complete.

Nested spans & session gating — Fetch and update pipelines wrap work in parent spans (AssetsFetchPipeline, AssetsBackgroundFetch, AssetsUpdateEnrichment); per-source timings and summary spans (AssetsFullFetch, AssetsControllerFirstInitFetch, AssetsUpdatePipeline, etc.) nest via parentContext. Fast and background fetch lanes are sibling withTrace calls, not nested. Pipeline, data-source, and enrichment spans emit only until the first forceUpdate in an unlock session (#firstInitFetchReported); later polls, force refreshes, and subscription enrichment skip those spans (reset on lock/#stop).

Balance selectorcalculateBalanceForAllWallets emits one AggregatedBalance / AggregatedBalanceSelector pair for the full wallet pass instead of a root span per account group.

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

@salimtb
salimtb marked this pull request as ready for review July 28, 2026 08:56
@salimtb
salimtb requested review from a team as code owners July 28, 2026 08:56
@salimtb
salimtb temporarily deployed to default-branch July 28, 2026 08:56 — with GitHub Actions Inactive
@salimtb

salimtb commented Jul 28, 2026

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.5.5-preview-e0f702919
@metamask-previews/accounts-controller@39.0.5-preview-e0f702919
@metamask-previews/address-book-controller@7.1.2-preview-e0f702919
@metamask-previews/ai-controllers@0.8.0-preview-e0f702919
@metamask-previews/analytics-controller@1.2.1-preview-e0f702919
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-e0f702919
@metamask-previews/announcement-controller@8.1.0-preview-e0f702919
@metamask-previews/app-metadata-controller@2.0.1-preview-e0f702919
@metamask-previews/approval-controller@9.0.2-preview-e0f702919
@metamask-previews/assets-controller@11.2.1-preview-e0f702919
@metamask-previews/assets-controllers@110.0.0-preview-e0f702919
@metamask-previews/authenticated-user-storage@3.0.1-preview-e0f702919
@metamask-previews/base-controller@9.1.0-preview-e0f702919
@metamask-previews/base-data-service@0.1.3-preview-e0f702919
@metamask-previews/bitcoin-regtest-up@1.0.0-preview-e0f702919
@metamask-previews/bridge-controller@78.0.0-preview-e0f702919
@metamask-previews/bridge-status-controller@74.5.0-preview-e0f702919
@metamask-previews/build-utils@3.0.4-preview-e0f702919
@metamask-previews/chain-agnostic-permission@1.7.0-preview-e0f702919
@metamask-previews/chomp-api-service@4.0.0-preview-e0f702919
@metamask-previews/claims-controller@0.5.3-preview-e0f702919
@metamask-previews/client-controller@1.0.1-preview-e0f702919
@metamask-previews/client-utils@1.2.1-preview-e0f702919
@metamask-previews/compliance-controller@2.1.0-preview-e0f702919
@metamask-previews/composable-controller@12.0.1-preview-e0f702919
@metamask-previews/config-registry-controller@0.4.1-preview-e0f702919
@metamask-previews/connectivity-controller@0.3.0-preview-e0f702919
@metamask-previews/controller-utils@12.3.0-preview-e0f702919
@metamask-previews/core-backend@7.0.0-preview-e0f702919
@metamask-previews/delegation-controller@3.0.2-preview-e0f702919
@metamask-previews/earn-controller@12.2.2-preview-e0f702919
@metamask-previews/eip-5792-middleware@3.0.5-preview-e0f702919
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.1-preview-e0f702919
@metamask-previews/eip1193-permission-middleware@2.0.1-preview-e0f702919
@metamask-previews/ens-controller@19.1.5-preview-e0f702919
@metamask-previews/eth-block-tracker@15.0.1-preview-e0f702919
@metamask-previews/eth-json-rpc-middleware@23.1.3-preview-e0f702919
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-e0f702919
@metamask-previews/foundryup@1.0.1-preview-e0f702919
@metamask-previews/gas-fee-controller@26.3.0-preview-e0f702919
@metamask-previews/gator-permissions-controller@4.2.3-preview-e0f702919
@metamask-previews/geolocation-controller@0.1.3-preview-e0f702919
@metamask-previews/java-tron-up@1.0.0-preview-e0f702919
@metamask-previews/json-rpc-engine@10.5.0-preview-e0f702919
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-e0f702919
@metamask-previews/keyring-controller@27.1.0-preview-e0f702919
@metamask-previews/local-node-utils@1.0.0-preview-e0f702919
@metamask-previews/logging-controller@8.0.2-preview-e0f702919
@metamask-previews/message-manager@14.1.2-preview-e0f702919
@metamask-previews/messenger@2.0.0-preview-e0f702919
@metamask-previews/messenger-cli@0.2.0-preview-e0f702919
@metamask-previews/money-account-api-data-service@0.3.0-preview-e0f702919
@metamask-previews/money-account-balance-service@2.3.0-preview-e0f702919
@metamask-previews/money-account-controller@0.3.3-preview-e0f702919
@metamask-previews/money-account-upgrade-controller@3.0.0-preview-e0f702919
@metamask-previews/multichain-account-service@13.0.0-preview-e0f702919
@metamask-previews/multichain-api-middleware@4.0.1-preview-e0f702919
@metamask-previews/multichain-network-controller@3.2.1-preview-e0f702919
@metamask-previews/multichain-transactions-controller@7.1.1-preview-e0f702919
@metamask-previews/name-controller@9.1.2-preview-e0f702919
@metamask-previews/network-connection-banner-controller@0.1.0-preview-e0f702919
@metamask-previews/network-controller@34.0.0-preview-e0f702919
@metamask-previews/network-enablement-controller@5.6.0-preview-e0f702919
@metamask-previews/notification-services-controller@26.0.0-preview-e0f702919
@metamask-previews/passkey-controller@3.0.0-preview-e0f702919
@metamask-previews/permission-controller@13.1.1-preview-e0f702919
@metamask-previews/permission-log-controller@5.1.0-preview-e0f702919
@metamask-previews/perps-controller@10.0.0-preview-e0f702919
@metamask-previews/phishing-controller@17.3.0-preview-e0f702919
@metamask-previews/platform-api-docs@0.0.0-preview-e0f702919
@metamask-previews/polling-controller@16.0.8-preview-e0f702919
@metamask-previews/preferences-controller@23.1.0-preview-e0f702919
@metamask-previews/profile-metrics-controller@4.0.2-preview-e0f702919
@metamask-previews/profile-sync-controller@28.3.0-preview-e0f702919
@metamask-previews/ramps-controller@17.2.0-preview-e0f702919
@metamask-previews/rate-limit-controller@7.0.1-preview-e0f702919
@metamask-previews/react-data-query@0.2.2-preview-e0f702919
@metamask-previews/remote-feature-flag-controller@4.2.2-preview-e0f702919
@metamask-previews/sample-controllers@5.0.3-preview-e0f702919
@metamask-previews/seedless-onboarding-controller@10.1.0-preview-e0f702919
@metamask-previews/selected-network-controller@26.1.5-preview-e0f702919
@metamask-previews/sentinel-api-service@1.0.0-preview-e0f702919
@metamask-previews/shield-controller@5.1.3-preview-e0f702919
@metamask-previews/signature-controller@39.2.7-preview-e0f702919
@metamask-previews/smart-transactions-controller@25.0.1-preview-e0f702919
@metamask-previews/snap-account-service@2.0.0-preview-e0f702919
@metamask-previews/social-controllers@2.6.0-preview-e0f702919
@metamask-previews/solana-test-validator-up@1.0.0-preview-e0f702919
@metamask-previews/stellar-quickstart-up@0.0.0-preview-e0f702919
@metamask-previews/storage-service@1.0.2-preview-e0f702919
@metamask-previews/subscription-controller@6.2.1-preview-e0f702919
@metamask-previews/transaction-controller@69.2.1-preview-e0f702919
@metamask-previews/transaction-pay-controller@26.0.0-preview-e0f702919
@metamask-previews/user-operation-controller@41.2.7-preview-e0f702919
@metamask-previews/wallet@8.1.0-preview-e0f702919
@metamask-previews/wallet-cli@0.0.0-preview-e0f702919

2,
expect.objectContaining({
name: 'AggregatedBalanceSelector',
parentContext: parentSpan,

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

this indicate it's a sub span

salimtb added 4 commits July 28, 2026 16:47
Avoid Sentry rate limits by nesting pipeline timings as subspans and emitting them only on the first unlock-session fetch, plus a single AggregatedBalanceSelector span for all wallets.
Comment thread packages/assets-controller/src/AssetsController.ts Outdated
@salimtb
salimtb force-pushed the fix/assets-controller-sentry-subspans branch from 02071e9 to 9a24045 Compare July 28, 2026 15:09
Comment thread packages/assets-controller/src/AssetsController.ts Outdated
Comment thread packages/assets-controller/src/AssetsController.ts Outdated
Comment on lines +1819 to +1825
await this.#executeMiddlewares(
fastSources,
request,
{},
parentContext,
shouldTrace,
);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Huge code smell. Make this an object parameter.

Comment thread packages/assets-controller/src/AssetsController.ts Outdated
Comment thread packages/assets-controller/src/AssetsController.ts Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actually, did some reading and put 2 and 2 together.

Core has upgraded to TS 5.x, meaning decorators are an option 👀. This tracing is a really good potential use-case for a clean decorator approach.

@salimtb
salimtb added this pull request to the merge queue Jul 29, 2026
Merged via the queue into main with commit be5e55a Jul 29, 2026
58 checks passed
@salimtb
salimtb deleted the fix/assets-controller-sentry-subspans branch July 29, 2026 09:09
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.

2 participants