Skip to content

Add download/apply timing to Expo Updates listener integration #6337

Description

@antonis

expoUpdatesListenerIntegration listens to the expo-updates state machine and emits breadcrumbs for transitions (checking, downloading, update pending, errors, rollback, restart). However, it captures zero timestamps and zero durations — you can see that a download happened but not how long it took.

Feasibility Assessment (Jul 2026)

Not yet covered — the integration is breadcrumbs-only. No timing, no spans.

Cross-SDK alignment: No other Sentry SDK has OTA update timing spans. This would be RN-first (Expo-specific). Flutter/Shorebird has no equivalent in sentry-dart.

Spec: No develop.sentry.dev spec exists for OTA update span ops. New op names (e.g., app.update.check, app.update.download) should be proposed before implementation.

Prior discussion: Closed issue #5425 (#5425) previously proposed monitoring OTA download/install performance.

Dashboard visibility: Spans would appear in Traces/Explore views.

Measurable durations from expo-updates state machine:

  • Check duration: isChecking=trueisUpdateAvailable=true or checkError — derivable
  • Download duration: isDownloading=trueisUpdatePending=true or downloadError — derivable
  • Apply/restart duration: isRestarting=true has no end signal (process terminates) — not cleanly measurable

Implementation

Add a downloadSpan variable to the integration closure:

  1. Start a span (startInactiveSpan({ name: 'expo.updates.download' })) when isDownloading transitions to true
  2. End the span when isUpdatePending transitions to true or on downloadError
  3. Similarly for check duration with isCheckingisUpdateAvailable/checkError
  4. Consider forceTransaction: true since OTA checks typically happen outside user-interaction transactions

Metadata

Metadata

Assignees

Fields

No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions