Skip to content

Automatically capture a warning event when Expo Updates performs an emergency launch#5794

Open
alwx wants to merge 5 commits intomainfrom
alwx/feature/capture-emergency-launch-event
Open

Automatically capture a warning event when Expo Updates performs an emergency launch#5794
alwx wants to merge 5 commits intomainfrom
alwx/feature/capture-emergency-launch-event

Conversation

@alwx
Copy link
Contributor

@alwx alwx commented Mar 10, 2026

📢 Type of change

  • Bugfix
  • New feature
  • Enhancement
  • Refactoring

📜 Description

Another relatively low effort improvement to Expo Updates support — when isEmergencyLaunch is set to true, automatically capture a Sentry event (not just context). The current approach only adds is_emergency_launch: true as context on future errors. But if the app recovers gracefully after an emergency launch, the team never knows it happened. An emergency launch is significant enough to spawn its own event.

📝 Checklist

  • I added tests to verify changes
  • No new PII added or SDK only sends newly added PII if sendDefaultPII is enabled
  • I updated the docs if needed.
  • I updated the wizard if needed.
  • All tests passing
  • No breaking changes

🔮 Next steps

@alwx alwx self-assigned this Mar 10, 2026
@github-actions
Copy link
Contributor

github-actions bot commented Mar 10, 2026

Semver Impact of This PR

None (no version bump detected)

📋 Changelog Preview

This is how your changes will appear in the changelog.
Entries from this PR are highlighted with a left border (blockquote style).


  • Automatically capture a warning event when Expo Updates performs an emergency launch by alwx in #5794
  • chore(deps): update CLI to v3.3.2 by github-actions in #5799
  • chore(deps): update Maestro to v2.3.0 by github-actions in #5790
  • chore(deps): update JavaScript SDK to v10.43.0 by github-actions in #5791
  • chore(deps): update CLI to v3.3.1 by github-actions in #5793
  • fix(core): Defer initial navigation span creation until navigation container is registered by antonis in #5789
  • Ref(Sample): Add existing bundled playgroundscreen into sample app by lucas-zimerman in #5778
  • Auto tracing for expo-image and expo-asset by alwx in #5718
  • Expo Updates: add tags with Expo Updates context vars to make them searchable/filterable by alwx in #5788
  • chore(deps): bump actions/setup-node from 6.2.0 to 6.3.0 by dependabot in #5784
  • chore(deps): bump github/codeql-action from 4.32.4 to 4.32.6 by dependabot in #5781
  • chore(deps): bump getsentry/craft/.github/workflows/changelog-preview.yml from 2.23.1 to 2.23.2 by dependabot in #5782
  • chore(deps): bump getsentry/craft from 2.21.7 to 2.23.2 by dependabot in #5783
  • chore(deps): bump tar to ^7.5.10 by antonis in #5777

🤖 This preview updates automatically when you update the PR.

@alwx alwx marked this pull request as ready for review March 10, 2026 11:56
@lucas-zimerman
Copy link
Collaborator

Q: Do you have any events that were captured on an emergency update?
I am asking because When I was testing this feature I was unable to trigger it/ mark it as true, so I didn't open a PR for it.

@alwx
Copy link
Contributor Author

alwx commented Mar 11, 2026

@lucas-zimerman technically that's considered as an "emergency" mechanism and shouldn't happen often — that's why I'm not surprised you didn't see it being marked as true.
I was able to reproduce it by simulating poor network conditions since isEmergencyLaunch along with emergencyLaunchReason gets populated when there is any exception being thrown during the update: https://github.com/expo/expo/blob/6878a766887031d762bd0220e5bbdd3bdce86d61/packages/expo-updates/android/src/main/java/expo/modules/updates/procedures/StartupProcedure.kt#L270C8-L270C35

@alwx
Copy link
Contributor Author

alwx commented Mar 11, 2026

@lucas-zimerman #4493 this is related, right?

@lucas-zimerman
Copy link
Collaborator

@lucas-zimerman technically that's considered as an "emergency" mechanism and shouldn't happen often — that's why I'm not surprised you didn't see it being marked as true. I was able to reproduce it by simulating poor network conditions since isEmergencyLaunch along with emergencyLaunchReason gets populated when there is any exception being thrown during the update: https://github.com/expo/expo/blob/6878a766887031d762bd0220e5bbdd3bdce86d61/packages/expo-updates/android/src/main/java/expo/modules/updates/procedures/StartupProcedure.kt#L270C8-L270C35

The way I was trying to simulate was by making an app update that throws an error when the app started. The expo app would download the update and once the app was restarted it would rollback to the previous version due to the error.

@lucas-zimerman
Copy link
Collaborator

@lucas-zimerman #4493 this is related, right?

Correct

@lucas-zimerman
Copy link
Collaborator

After cloning expo code locally I got this output from claude

  ┌────────────────────────────────────┬─────────────────────────────┐                                                                  
  │              Scenario              │ Triggers isEmergencyLaunch? │                                                                  
  ├────────────────────────────────────┼─────────────────────────────┤                                                                  
  │ Broken JavaScript code in update   │ ❌ No                       │                                                                  
  ├────────────────────────────────────┼─────────────────────────────┤                                                                  
  │ Failed to download update from EAS │ ❌ No                       │                                                                  
  ├────────────────────────────────────┼─────────────────────────────┤                                                                  
  │ Network timeout during download    │ ❌ No                       │                                                                  
  ├────────────────────────────────────┼─────────────────────────────┤                                                                  
  │ Update download corrupted          │ ❌ No                       │                                                                  
  ├────────────────────────────────────┼─────────────────────────────┤                                                                  
  │ SQLite database corrupt            │ ✅ Yes                      │                                                                  
  ├────────────────────────────────────┼─────────────────────────────┤                                                                  
  │ Updates directory inaccessible     │ ✅ Yes                      │                                                                  
  ├────────────────────────────────────┼─────────────────────────────┤                                                                  
  │ File system read failure           │ ✅ Yes                      │                                                                  
  └────────────────────────────────────┴─────────────────────────────┘                                                                  

Indeed the way I was testing would never trigger it (inserting errors on the newer build)

@lucas-zimerman lucas-zimerman added the ready-to-merge Triggers the full CI test suite label Mar 11, 2026
Copy link
Collaborator

@lucas-zimerman lucas-zimerman left a comment

Choose a reason for hiding this comment

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

Looking good! thank you for the PR!

@github-actions
Copy link
Contributor

Android (legacy) Performance metrics 🚀

  Plain With Sentry Diff
Startup time 418.91 ms 443.71 ms 24.79 ms
Size 43.75 MiB 48.50 MiB 4.75 MiB

Baseline results on branch: main

Startup times

Revision Plain With Sentry Diff
86584b7+dirty 463.83 ms 500.31 ms 36.48 ms
9a81842+dirty 412.23 ms 416.56 ms 4.33 ms
c637fc7+dirty 433.70 ms 467.76 ms 34.06 ms
d73150f+dirty 411.21 ms 465.86 ms 54.65 ms
fa7bb7e+dirty 350.37 ms 377.02 ms 26.65 ms
3bd3f0d+dirty 447.21 ms 472.31 ms 25.10 ms
88890fe+dirty 350.94 ms 365.74 ms 14.80 ms
95aaf8a 437.89 ms 419.45 ms -18.44 ms
c0842e7+dirty 527.76 ms 566.69 ms 38.93 ms
1e7a472+dirty 348.80 ms 362.55 ms 13.75 ms

App size

Revision Plain With Sentry Diff
86584b7+dirty 43.75 MiB 48.08 MiB 4.33 MiB
9a81842+dirty 43.75 MiB 48.08 MiB 4.33 MiB
c637fc7+dirty 43.75 MiB 48.40 MiB 4.64 MiB
d73150f+dirty 43.75 MiB 48.55 MiB 4.80 MiB
fa7bb7e+dirty 17.75 MiB 19.75 MiB 2.00 MiB
3bd3f0d+dirty 17.75 MiB 19.70 MiB 1.95 MiB
88890fe+dirty 17.75 MiB 19.71 MiB 1.96 MiB
95aaf8a 17.75 MiB 19.68 MiB 1.93 MiB
c0842e7+dirty 43.75 MiB 48.41 MiB 4.66 MiB
1e7a472+dirty 17.75 MiB 19.70 MiB 1.96 MiB

@github-actions
Copy link
Contributor

iOS (legacy) Performance metrics 🚀

  Plain With Sentry Diff
Startup time 1213.29 ms 1214.64 ms 1.35 ms
Size 3.38 MiB 4.81 MiB 1.43 MiB

Baseline results on branch: main

Startup times

Revision Plain With Sentry Diff
ea3e26e+dirty 1229.13 ms 1228.46 ms -0.67 ms
80e4616+dirty 1221.32 ms 1225.64 ms 4.32 ms
818a608+dirty 1205.76 ms 1208.00 ms 2.24 ms
77061ed+dirty 1233.16 ms 1234.88 ms 1.71 ms
bef3709+dirty 1222.07 ms 1220.24 ms -1.83 ms
a206511+dirty 1185.00 ms 1186.35 ms 1.35 ms
74979ac+dirty 1210.49 ms 1213.31 ms 2.82 ms
a2bb688+dirty 1223.53 ms 1232.90 ms 9.37 ms
8a868fe+dirty 1221.50 ms 1230.78 ms 9.28 ms
d590428+dirty 1211.77 ms 1220.51 ms 8.75 ms

App size

Revision Plain With Sentry Diff
ea3e26e+dirty 3.41 MiB 4.58 MiB 1.17 MiB
80e4616+dirty 3.38 MiB 4.60 MiB 1.22 MiB
818a608+dirty 2.63 MiB 3.91 MiB 1.28 MiB
77061ed+dirty 2.63 MiB 3.98 MiB 1.34 MiB
bef3709+dirty 3.38 MiB 4.78 MiB 1.40 MiB
a206511+dirty 3.41 MiB 4.67 MiB 1.25 MiB
74979ac+dirty 3.38 MiB 4.60 MiB 1.22 MiB
a2bb688+dirty 2.63 MiB 3.99 MiB 1.36 MiB
8a868fe+dirty 3.38 MiB 4.60 MiB 1.22 MiB
d590428+dirty 3.38 MiB 4.78 MiB 1.39 MiB

Copy link
Contributor

@antonis antonis left a comment

Choose a reason for hiding this comment

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

LGTM!

@github-actions
Copy link
Contributor

iOS (new) Performance metrics 🚀

  Plain With Sentry Diff
Startup time 1207.71 ms 1215.94 ms 8.22 ms
Size 3.38 MiB 4.81 MiB 1.43 MiB

Baseline results on branch: main

Startup times

Revision Plain With Sentry Diff
ea3e26e+dirty 1216.61 ms 1214.15 ms -2.47 ms
80e4616+dirty 1206.90 ms 1205.94 ms -0.96 ms
818a608+dirty 1218.84 ms 1223.18 ms 4.34 ms
77061ed+dirty 1210.77 ms 1218.45 ms 7.68 ms
bef3709+dirty 1217.79 ms 1225.33 ms 7.54 ms
a206511+dirty 1225.02 ms 1223.74 ms -1.28 ms
74979ac+dirty 1212.33 ms 1212.54 ms 0.21 ms
a2bb688+dirty 1244.82 ms 1238.60 ms -6.22 ms
8a868fe+dirty 1206.85 ms 1215.04 ms 8.19 ms
d590428+dirty 1221.23 ms 1225.27 ms 4.03 ms

App size

Revision Plain With Sentry Diff
ea3e26e+dirty 3.41 MiB 4.58 MiB 1.17 MiB
80e4616+dirty 3.38 MiB 4.60 MiB 1.22 MiB
818a608+dirty 3.19 MiB 4.48 MiB 1.29 MiB
77061ed+dirty 3.19 MiB 4.54 MiB 1.36 MiB
bef3709+dirty 3.38 MiB 4.78 MiB 1.40 MiB
a206511+dirty 3.41 MiB 4.67 MiB 1.25 MiB
74979ac+dirty 3.38 MiB 4.60 MiB 1.22 MiB
a2bb688+dirty 3.19 MiB 4.56 MiB 1.37 MiB
8a868fe+dirty 3.38 MiB 4.60 MiB 1.22 MiB
d590428+dirty 3.38 MiB 4.78 MiB 1.39 MiB

@github-actions
Copy link
Contributor

Android (new) Performance metrics 🚀

  Plain With Sentry Diff
Startup time 441.26 ms 444.39 ms 3.13 ms
Size 43.94 MiB 49.36 MiB 5.42 MiB

Baseline results on branch: main

Startup times

Revision Plain With Sentry Diff
7480abe+dirty 363.80 ms 431.34 ms 67.54 ms
2b89ce9+dirty 372.22 ms 417.06 ms 44.84 ms
170d5ea+dirty 348.79 ms 406.94 ms 58.15 ms
b1579bc+dirty 391.87 ms 456.26 ms 64.39 ms
73f2455+dirty 369.33 ms 398.90 ms 29.57 ms
0b64753+dirty 358.55 ms 429.16 ms 70.61 ms
6a70a7e+dirty 382.45 ms 424.54 ms 42.09 ms
2adbd1e+dirty 366.13 ms 419.49 ms 53.36 ms
f8d19f8+dirty 374.17 ms 383.40 ms 9.23 ms
7be1f99+dirty 369.02 ms 399.60 ms 30.58 ms

App size

Revision Plain With Sentry Diff
7480abe+dirty 7.15 MiB 8.41 MiB 1.26 MiB
2b89ce9+dirty 7.15 MiB 8.41 MiB 1.26 MiB
170d5ea+dirty 7.15 MiB 8.42 MiB 1.27 MiB
b1579bc+dirty 43.94 MiB 49.27 MiB 5.33 MiB
73f2455+dirty 43.94 MiB 48.82 MiB 4.88 MiB
0b64753+dirty 7.15 MiB 8.42 MiB 1.27 MiB
6a70a7e+dirty 7.15 MiB 8.42 MiB 1.26 MiB
2adbd1e+dirty 7.15 MiB 8.43 MiB 1.28 MiB
f8d19f8+dirty 43.94 MiB 48.91 MiB 4.97 MiB
7be1f99+dirty 7.15 MiB 8.42 MiB 1.27 MiB

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

Labels

ready-to-merge Triggers the full CI test suite

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants