fix(profiling): Fix app start transaction profile timestamp offset#5962
fix(profiling): Fix app start transaction profile timestamp offset#5962
Conversation
Use the actual profiling start timestamp for the profile's timestamp field instead of the adjusted transaction start_timestamp. For app start transactions, the transaction start is adjusted backward to the app start time, but the profile samples are relative to when profiling actually started (JS VM start). This caused a misalignment in the Sentry UI. Fixes #4511 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Semver Impact of This PR⚪ None (no version bump detected) 📋 Changelog PreviewThis is how your changes will appear in the changelog.
🤖 This preview updates automatically when you update the PR. |
Add unit tests for enrichCombinedProfileWithEventContext and enrichAndroidProfileWithEventContext verifying that: - profilingStartTimestampNs is used for the profile timestamp when set - Falls back to event.start_timestamp when not set - profilingStartTimestampNs is stripped from serialized output Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sentry Build Distribution
|
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Android (legacy) Performance metrics 🚀
|
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| df5d108+dirty | 527.06 ms | 603.58 ms | 76.52 ms |
| 2c735cc+dirty | 414.09 ms | 438.47 ms | 24.38 ms |
| a50b33d+dirty | 500.81 ms | 532.11 ms | 31.30 ms |
| 3817909+dirty | 406.67 ms | 416.58 ms | 9.91 ms |
| 5c1e987+dirty | 423.52 ms | 471.64 ms | 48.12 ms |
| 4953e94+dirty | 442.02 ms | 456.52 ms | 14.50 ms |
App size
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| df5d108+dirty | 43.75 MiB | 48.08 MiB | 4.33 MiB |
| 2c735cc+dirty | 43.75 MiB | 48.08 MiB | 4.33 MiB |
| a50b33d+dirty | 43.75 MiB | 48.08 MiB | 4.33 MiB |
| 3817909+dirty | 43.75 MiB | 48.08 MiB | 4.33 MiB |
| 5c1e987+dirty | 43.75 MiB | 48.08 MiB | 4.33 MiB |
| 4953e94+dirty | 43.75 MiB | 48.08 MiB | 4.33 MiB |
iOS (legacy) Performance metrics 🚀
|
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| a50b33d+dirty | 1197.74 ms | 1197.17 ms | -0.57 ms |
| 3817909+dirty | 1183.90 ms | 1187.50 ms | 3.60 ms |
| 5c1e987+dirty | 1204.30 ms | 1222.15 ms | 17.85 ms |
| 2c735cc+dirty | 1229.67 ms | 1221.50 ms | -8.17 ms |
| 4953e94+dirty | 1212.06 ms | 1214.83 ms | 2.77 ms |
| df5d108+dirty | 1225.90 ms | 1220.14 ms | -5.76 ms |
App size
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| a50b33d+dirty | 3.38 MiB | 4.73 MiB | 1.35 MiB |
| 3817909+dirty | 3.38 MiB | 4.73 MiB | 1.35 MiB |
| 5c1e987+dirty | 3.38 MiB | 4.73 MiB | 1.35 MiB |
| 2c735cc+dirty | 3.38 MiB | 4.74 MiB | 1.35 MiB |
| 4953e94+dirty | 3.38 MiB | 4.73 MiB | 1.35 MiB |
| df5d108+dirty | 3.38 MiB | 4.73 MiB | 1.35 MiB |
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 73ea8a5. Configure here.
| - Fix app start transaction profile offset by using the actual profiling start timestamp instead of the adjusted app start time ([#5962](https://github.com/getsentry/sentry-react-native/issues/5962)) | ||
| ======= | ||
| - Use React `componentStack` as fallback when error has no stack trace on Android ([#5965](https://github.com/getsentry/sentry-react-native/pull/5965) | ||
| >>>>>>> main |
There was a problem hiding this comment.
Unresolved merge conflict markers in CHANGELOG
High Severity
Unresolved git merge conflict markers (<<<<<<<, =======, >>>>>>>) were accidentally committed in CHANGELOG.md. This breaks the Markdown rendering and drops the existing componentStack changelog entry from its proper location, as both changelog entries need to appear without conflict markers.
Triggered by project rule: PR Review Guidelines for Cursor Bot
Reviewed by Cursor Bugbot for commit 73ea8a5. Configure here.
| <<<<<<< fix/profile-app-start-timestamp-offset | ||
| - Fix app start transaction profile offset by using the actual profiling start timestamp instead of the adjusted app start time ([#5962](https://github.com/getsentry/sentry-react-native/issues/5962)) | ||
| ======= | ||
| - Use React `componentStack` as fallback when error has no stack trace on Android ([#5965](https://github.com/getsentry/sentry-react-native/pull/5965) | ||
| >>>>>>> main |
There was a problem hiding this comment.
Bug: The CHANGELOG.md file contains unresolved git merge conflict markers, which will break the release process.
Severity: HIGH
Suggested Fix
Resolve the merge conflict in CHANGELOG.md. Remove the git conflict markers (<<<<<<<, =======, >>>>>>>) and combine the changelog entries from both branches correctly.
Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent.
Verify if this is a real issue. If it is, propose a fix; if not, explain why it's not
valid.
Location: CHANGELOG.md#L13-L17
Potential issue: The `CHANGELOG.md` file contains unresolved git merge conflict markers
(`<<<<<<<`, `=======`, `>>>>>>>`) that were committed to the codebase. While this does
not cause a runtime error in the application, it will break the release tooling which
automatically parses the changelog. This failure in the release automation will prevent
new versions of the software from being released.
Did we get this right? 👍 / 👎 to inform future reviews.
iOS (new) Performance metrics 🚀
|
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| a50b33d+dirty | 1207.11 ms | 1212.10 ms | 5.00 ms |
| 3817909+dirty | 1210.76 ms | 1215.64 ms | 4.89 ms |
| 5c1e987+dirty | 1208.43 ms | 1220.72 ms | 12.29 ms |
| 2c735cc+dirty | 1223.33 ms | 1224.38 ms | 1.04 ms |
| 4953e94+dirty | 1217.41 ms | 1223.53 ms | 6.12 ms |
| df5d108+dirty | 1207.34 ms | 1210.50 ms | 3.16 ms |
App size
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| a50b33d+dirty | 3.38 MiB | 4.73 MiB | 1.35 MiB |
| 3817909+dirty | 3.38 MiB | 4.73 MiB | 1.35 MiB |
| 5c1e987+dirty | 3.38 MiB | 4.73 MiB | 1.35 MiB |
| 2c735cc+dirty | 3.38 MiB | 4.74 MiB | 1.35 MiB |
| 4953e94+dirty | 3.38 MiB | 4.73 MiB | 1.35 MiB |
| df5d108+dirty | 3.38 MiB | 4.73 MiB | 1.35 MiB |
Android (new) Performance metrics 🚀
|
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| df5d108+dirty | 434.82 ms | 447.39 ms | 12.57 ms |
| 2c735cc+dirty | 435.20 ms | 459.48 ms | 24.28 ms |
| a50b33d+dirty | 353.21 ms | 398.48 ms | 45.27 ms |
| 3817909+dirty | 357.52 ms | 391.52 ms | 34.00 ms |
| 5c1e987+dirty | 444.71 ms | 475.13 ms | 30.42 ms |
| 4953e94+dirty | 398.80 ms | 431.81 ms | 33.01 ms |
App size
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| df5d108+dirty | 43.94 MiB | 48.94 MiB | 5.00 MiB |
| 2c735cc+dirty | 43.94 MiB | 48.94 MiB | 5.00 MiB |
| a50b33d+dirty | 43.94 MiB | 48.94 MiB | 5.00 MiB |
| 3817909+dirty | 43.94 MiB | 48.94 MiB | 5.00 MiB |
| 5c1e987+dirty | 43.94 MiB | 48.94 MiB | 5.00 MiB |
| 4953e94+dirty | 43.94 MiB | 48.94 MiB | 5.00 MiB |


📢 Type of change
📜 Description
Uses the actual profiling start timestamp for the profile's
timestampfield instead of the adjustedevent.start_timestamp.For app start transactions, the SDK adjusts the transaction's
start_timestampbackward to the app start time. However, profile samples useelapsed_since_start_nsrelative to when profiling actually started (JS VM start), not the app start time. This mismatch caused the profile to appear misaligned in the Sentry UI.Changes:
profilingStartTimestampNsfield toHermesProfileEventandAndroidCombinedProfileEventtypesstopProfilingnow stores the profiling start timestamp on the returned profile eventenrichCombinedProfileWithEventContextandenrichAndroidProfileWithEventContextprefer the stored profiling start timestamp overevent.start_timestamp💡 Motivation and Context
Fixes #4511
When an app start transaction has its start time adjusted, the profile timestamp was incorrectly set to the app start time, while profile samples were relative to the JS VM start. This caused a visual offset in the Sentry profiling UI.
Relay does not validate the profile
timestampagainst the transactionstart_timestamp, so this change is safe from the ingestion side.💚 How did you test it?
📝 Checklist
sendDefaultPIIis enabled🔮 Next steps