Repository navigation
fix(core): Deduplicate native HTTP breadcrumbs for URLs with a query string - #6881
Conversation
…string The native iOS breadcrumb's url is sanitized (query moved to http.query or filtered, percent-decoded, credentials replaced), so the exact url match against the raw JS xhr/fetch url failed. Compare normalized urls instead and ignore the query. Fixes #6872 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Semver Impact of This PR⚪ None (no version bump detected) 📋 Changelog PreviewThis is how your changes will appear in the changelog.
Plus 1 more 🤖 This preview updates automatically when you update the PR. |
There was a problem hiding this comment.
✅ Bugbot reviewed your changes and found no new issues!
Comment @cursor review or bugbot run to trigger another review on this PR
Reviewed by Cursor Bugbot for commit 2de5669. Configure here.
| nativeUrl === jsUrl || | ||
| nativeUrl === `${jsUrl}/` || | ||
| nativeUrl.startsWith(`${jsUrl}?`) || | ||
| nativeUrl.startsWith(`${jsUrl}/?`) |
There was a problem hiding this comment.
Is there a chance the question mark will be %3F?
There was a problem hiding this comment.
I think this is already covered since it is decoded at this point. Also checked with the the path has an encoded question mark test
| /** Matches the native URL to the JS one, with or without a trailing slash or query. */ | ||
| function isSameHttpUrl(nativeUrl: string, jsUrl: string): boolean { | ||
| return ( | ||
| nativeUrl === jsUrl || |
There was a problem hiding this comment.
Isnt this check redundant since we do an equal check on line 139?
There was a problem hiding this comment.
Good question 👍 I rechecked and line 139 compares the raw URLs while this compares the normalised URLs
|
Q: Isn't it possible to know if the request originated from the JavaScript layer? This way we could simply filter out these requests. |
I think this is feasible but would require marking on the JS side (similar to this). |
Android (legacy) Performance metrics 🚀
|
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| 0307fa4+dirty | 454.16 ms | 518.35 ms | 64.18 ms |
| 4953e94+dirty | 442.02 ms | 456.52 ms | 14.50 ms |
| bc8f61e+dirty | 442.98 ms | 506.56 ms | 63.58 ms |
| 3817909+dirty | 406.67 ms | 416.58 ms | 9.91 ms |
| 4b87b12+dirty | 421.82 ms | 413.60 ms | -8.22 ms |
| ef27341+dirty | 412.94 ms | 443.98 ms | 31.04 ms |
| 853723c+dirty | 405.54 ms | 440.08 ms | 34.54 ms |
| 2cac31b+dirty | 440.48 ms | 466.19 ms | 25.71 ms |
| 3b6e9f9+dirty | 442.70 ms | 486.44 ms | 43.74 ms |
| 4e0ba9c+dirty | 452.84 ms | 473.36 ms | 20.52 ms |
App size
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| 0307fa4+dirty | 49.74 MiB | 54.81 MiB | 5.07 MiB |
| 4953e94+dirty | 43.75 MiB | 48.08 MiB | 4.33 MiB |
| bc8f61e+dirty | 49.74 MiB | 55.09 MiB | 5.35 MiB |
| 3817909+dirty | 43.75 MiB | 48.08 MiB | 4.33 MiB |
| 4b87b12+dirty | 43.75 MiB | 48.14 MiB | 4.39 MiB |
| ef27341+dirty | 48.30 MiB | 53.54 MiB | 5.24 MiB |
| 853723c+dirty | 48.30 MiB | 53.58 MiB | 5.28 MiB |
| 2cac31b+dirty | 49.74 MiB | 55.37 MiB | 5.63 MiB |
| 3b6e9f9+dirty | 48.30 MiB | 53.54 MiB | 5.23 MiB |
| 4e0ba9c+dirty | 48.30 MiB | 53.49 MiB | 5.19 MiB |
📲 Install BuildsAndroid
|
iOS (legacy) Performance metrics 🚀
|
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| b04af96+dirty | 3818.92 ms | 1219.76 ms | -2599.16 ms |
| c0bc3e1+dirty | 3862.00 ms | 1228.59 ms | -2633.41 ms |
| 5a316ea+dirty | 3820.11 ms | 1211.28 ms | -2608.83 ms |
| 09a902f+dirty | 3835.67 ms | 1217.11 ms | -2618.57 ms |
| 0a9e622+dirty | 3835.87 ms | 1221.07 ms | -2614.80 ms |
| 64630e5+dirty | 3842.70 ms | 1218.11 ms | -2624.60 ms |
| 032a8bd+dirty | 3865.50 ms | 1227.12 ms | -2638.38 ms |
| 0a147b2+dirty | 3838.15 ms | 1221.94 ms | -2616.21 ms |
| 68672fc+dirty | 3841.58 ms | 1228.89 ms | -2612.69 ms |
| 7ac3378+dirty | 1213.37 ms | 1218.15 ms | 4.78 ms |
App size
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| b04af96+dirty | 4.98 MiB | 6.54 MiB | 1.56 MiB |
| c0bc3e1+dirty | 5.15 MiB | 6.95 MiB | 1.80 MiB |
| 5a316ea+dirty | 4.98 MiB | 6.51 MiB | 1.53 MiB |
| 09a902f+dirty | 4.98 MiB | 6.46 MiB | 1.49 MiB |
| 0a9e622+dirty | 4.98 MiB | 6.51 MiB | 1.53 MiB |
| 64630e5+dirty | 4.98 MiB | 6.46 MiB | 1.49 MiB |
| 032a8bd+dirty | 5.15 MiB | 6.87 MiB | 1.72 MiB |
| 0a147b2+dirty | 4.98 MiB | 6.51 MiB | 1.53 MiB |
| 68672fc+dirty | 5.15 MiB | 6.71 MiB | 1.55 MiB |
| 7ac3378+dirty | 3.38 MiB | 4.76 MiB | 1.38 MiB |
iOS (new) Performance metrics 🚀
|
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| 8448c07+dirty | 3858.49 ms | 1222.12 ms | -2636.36 ms |
| 580fb5c+dirty | 3835.45 ms | 1218.61 ms | -2616.84 ms |
| 44abcc2+dirty | 3841.42 ms | 1214.77 ms | -2626.65 ms |
| c0bc3e1+dirty | 3869.00 ms | 1230.93 ms | -2638.07 ms |
| d2eadf8+dirty | 3841.53 ms | 1216.15 ms | -2625.39 ms |
| a216cb9+dirty | 3853.25 ms | 1224.77 ms | -2628.48 ms |
| c004dae+dirty | 3857.82 ms | 1224.87 ms | -2632.95 ms |
| ef27341+dirty | 3835.20 ms | 1212.23 ms | -2622.97 ms |
| ad66da3+dirty | 3855.02 ms | 1213.43 ms | -2641.59 ms |
| 680f842+dirty | 3874.00 ms | 1229.35 ms | -2644.65 ms |
App size
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| 8448c07+dirty | 4.98 MiB | 6.55 MiB | 1.57 MiB |
| 580fb5c+dirty | 4.98 MiB | 6.46 MiB | 1.48 MiB |
| 44abcc2+dirty | 4.98 MiB | 6.55 MiB | 1.57 MiB |
| c0bc3e1+dirty | 5.15 MiB | 6.95 MiB | 1.80 MiB |
| d2eadf8+dirty | 5.15 MiB | 6.67 MiB | 1.51 MiB |
| a216cb9+dirty | 4.98 MiB | 6.51 MiB | 1.53 MiB |
| c004dae+dirty | 5.15 MiB | 6.67 MiB | 1.51 MiB |
| ef27341+dirty | 5.15 MiB | 6.68 MiB | 1.53 MiB |
| ad66da3+dirty | 5.15 MiB | 6.67 MiB | 1.51 MiB |
| 680f842+dirty | 5.15 MiB | 6.90 MiB | 1.75 MiB |
Android (new) Performance metrics 🚀
|
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| 7ff4d0f+dirty | 403.38 ms | 427.06 ms | 23.68 ms |
| 635676f+dirty | 420.43 ms | 428.23 ms | 7.80 ms |
| ae37560+dirty | 428.96 ms | 456.86 ms | 27.90 ms |
| df5d108+dirty | 434.82 ms | 447.39 ms | 12.57 ms |
| 0b5120f+dirty | 413.75 ms | 468.86 ms | 55.11 ms |
| 6acdf1d+dirty | 417.34 ms | 454.88 ms | 37.54 ms |
| b47fb86+dirty | 440.89 ms | 500.73 ms | 59.84 ms |
| 4966363+dirty | 415.67 ms | 448.60 ms | 32.93 ms |
| a0a3177+dirty | 427.85 ms | 473.94 ms | 46.09 ms |
| c0bc3e1+dirty | 570.52 ms | 632.06 ms | 61.54 ms |
App size
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| 7ff4d0f+dirty | 48.30 MiB | 53.60 MiB | 5.30 MiB |
| 635676f+dirty | 50.56 MiB | 56.46 MiB | 5.90 MiB |
| ae37560+dirty | 48.30 MiB | 53.60 MiB | 5.29 MiB |
| df5d108+dirty | 43.94 MiB | 48.94 MiB | 5.00 MiB |
| 0b5120f+dirty | 48.30 MiB | 53.58 MiB | 5.28 MiB |
| 6acdf1d+dirty | 49.74 MiB | 55.09 MiB | 5.34 MiB |
| b47fb86+dirty | 50.56 MiB | 56.59 MiB | 6.03 MiB |
| 4966363+dirty | 48.30 MiB | 53.54 MiB | 5.24 MiB |
| a0a3177+dirty | 49.74 MiB | 55.37 MiB | 5.63 MiB |
| c0bc3e1+dirty | 50.56 MiB | 56.62 MiB | 6.06 MiB |
alwx
left a comment
There was a problem hiding this comment.
Looks good (especially since you already checked what's written in comments by @lucas-zimerman)
📢 Type of change
📜 Description
URLs are now normalized before comparing:
?, because after decoding a?may belong to the path./,?…or/?…. Identical raw URLs still always match.💡 Motivation and Context
Fixes #6872
💚 How did you test it?
CI, Manual
📝 Checklist
sendDefaultPIIis enabled.🔮 Next steps