feat(android): Add queryable getFramesDelay API to SpanFrameMetricsCollector#5248
feat(android): Add queryable getFramesDelay API to SpanFrameMetricsCollector#5248
Conversation
…llector Expose a getFramesDelay(startNanos, endNanos) method that allows external consumers (e.g. React Native SDK) to query frame delay for arbitrary time ranges without registering a duplicate frame listener. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Semver Impact of This PR🟡 Minor (new features) 📋 Changelog PreviewThis is how your changes will appear in the changelog. This PR will not appear in the changelog. 🤖 This preview updates automatically when you update the PR. |
|
Sentry Build Distribution
|
antonis
left a comment
There was a problem hiding this comment.
I removed the changelog since I guess this is only useful for our own SDKs
Performance metrics 🚀
|
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| dc4cc7a | 361.10 ms | 439.53 ms | 78.43 ms |
| 6ea4329 | 309.06 ms | 353.48 ms | 44.42 ms |
| b193867 | 331.08 ms | 397.06 ms | 65.98 ms |
| abfcc92 | 337.38 ms | 427.39 ms | 90.00 ms |
| d15471f | 342.08 ms | 415.44 ms | 73.35 ms |
| d501a7e | 348.06 ms | 431.42 ms | 83.36 ms |
| 6405ec5 | 310.88 ms | 354.56 ms | 43.69 ms |
| 22f4345 | 307.87 ms | 354.51 ms | 46.64 ms |
| 37ec571 | 366.04 ms | 424.28 ms | 58.23 ms |
| d364ace | 411.72 ms | 430.81 ms | 19.10 ms |
App size
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| dc4cc7a | 1.58 MiB | 2.19 MiB | 619.28 KiB |
| 6ea4329 | 1.58 MiB | 2.29 MiB | 719.82 KiB |
| b193867 | 1.58 MiB | 2.19 MiB | 620.00 KiB |
| abfcc92 | 1.58 MiB | 2.13 MiB | 557.31 KiB |
| d15471f | 1.58 MiB | 2.13 MiB | 559.54 KiB |
| d501a7e | 0 B | 0 B | 0 B |
| 6405ec5 | 1.58 MiB | 2.12 MiB | 552.23 KiB |
| 22f4345 | 1.58 MiB | 2.29 MiB | 719.83 KiB |
| 37ec571 | 0 B | 0 B | 0 B |
| d364ace | 1.58 MiB | 2.11 MiB | 539.75 KiB |
|
@antonis this looks very promising! Before diving any further: The Android SDK only collects frame metrics when there's a span active (see e.g. onSpanStarted), will the RN side take care of calling those APIs? |
Thank you for raising this @markushi 🙇 This indeed complicates things since the whole point of this PR was to simplify the RN implementation in getsentry/sentry-react-native#5907 I'll convert this back to draft to revist and iterate back. Thank you for having a first look. |
|
@antonis I just had another look and I think if we have two options here:
I think 1. should be simpler and cleaner to implement, so I'd go for that. |
Thank you for looking into this @markushi 🙇 That makes sense 👍 I'll iterate on this. |
Moves the queryable frames delay API from SpanFrameMetricsCollector to SentryFrameMetricsCollector per review feedback. This avoids coupling the API to span lifecycle, making it directly usable by hybrid SDKs via the already-accessible options.getFrameMetricsCollector(). Reverts changes to SpanFrameMetricsCollector, SentryAndroidOptions, and AndroidOptionsInitializer from the previous approach. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
📜 Description
Add a queryable
getFramesDelay(startSystemNanos, endSystemNanos)API toSentryFrameMetricsCollectorthat returns aSentryFramesDelayResultcontaining the total frame delay (in seconds) and the number of frames contributing to the delay for a given time range.This mirrors iOS's existing
SentryFramesTracker.getFramesDelaySPIand allows external consumers to query frame delay without registering a duplicate frame listener.Changes:
SentryFramesDelayResultdata class withdelaySecondsandframesContributingToDelayCountgetFramesDelay()method onSentryFrameMetricsCollectorwith frame buffer, 5-minute auto-pruning, and partial overlap handlingoptions.getFrameMetricsCollector().getFramesDelay(...)— no new getters needed💡 Motivation and Context
The React Native SDK needs to query frame delay for arbitrary time ranges (see getsentry/sentry-react-native#5908). Currently it registers its own
RNSentryFrameDelayCollectoras a listener onSentryFrameMetricsCollector, duplicating the work already done internally — double listener callbacks, double storage, and redundant computation on the UI thread.With this API, the RN SDK can delete
RNSentryFrameDelayCollector(~130 lines) and replace it with a singlegetFramesDelay()call, keeping only thestartCollection/stopCollectionlifecycle it already manages.💚 How did you test it?
SentryFrameMetricsCollectorTestcovering: unavailable state, invalid ranges, zero delay, slow/frozen frame delay, partial frame overlap, and automatic pruning of old frames📝 Checklist
sendDefaultPIIis enabled.🔮 Next steps
RNSentryFrameDelayCollectorwith a call togetFramesDelay()#skip-changelog