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=true → isUpdateAvailable=true or checkError — derivable
- Download duration:
isDownloading=true → isUpdatePending=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:
- Start a span (
startInactiveSpan({ name: 'expo.updates.download' })) when isDownloading transitions to true
- End the span when
isUpdatePending transitions to true or on downloadError
- Similarly for check duration with
isChecking → isUpdateAvailable/checkError
- Consider
forceTransaction: true since OTA checks typically happen outside user-interaction transactions
expoUpdatesListenerIntegrationlistens to theexpo-updatesstate 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:
isChecking=true→isUpdateAvailable=trueorcheckError— derivableisDownloading=true→isUpdatePending=trueordownloadError— derivableisRestarting=truehas no end signal (process terminates) — not cleanly measurableImplementation
Add a
downloadSpanvariable to the integration closure:startInactiveSpan({ name: 'expo.updates.download' })) whenisDownloadingtransitions to trueisUpdatePendingtransitions to true or ondownloadErrorisChecking→isUpdateAvailable/checkErrorforceTransaction: truesince OTA checks typically happen outside user-interaction transactions