The V2 span processing pipeline has no mobile-specific normalizations. All mobile logic lives in the V1 path (Event + Span types).
Mobile specific normalization for span v2
- Outlier filtering: Remove
app.start.value, app.ttid.value, app.ttfd.value exceeding 180s
- Main thread tag: Derive
sentry.main_thread: "true" from thread.name == "main"
- Device class: Derive
device.class (LOW/MEDIUM/HIGH) from device attributes. Reuse existing classification logic from device_class.rs
- Mobile tag: Derive
sentry.mobile: "true" from sentry.sdk.name
~~Frame rate calculation: Derive ~~frames.frozen_rate~~ and ~~frames.slow_rate~~ from ~~frames.frozen / frames.total~~ and ~~frames.slow / frames.total~~ and ~~~~stall_percentage~~ -> done in Frontend instead on-demand
Additionally for v1 pipeline add:
- App start: add
app.start and app.start.type attributes if app start measurements exist. These are the new attributes that will be used in the mobile vitals dashboard (since they cannot be deprecated directly in sentry-conventions we need to add them here)
The V2 span processing pipeline has no mobile-specific normalizations. All mobile logic lives in the V1 path (Event + Span types).
Mobile specific normalization for span v2
app.start.value,app.ttid.value,app.ttfd.valueexceeding 180ssentry.main_thread: "true"fromthread.name == "main"device.class(LOW/MEDIUM/HIGH) from device attributes. Reuse existing classification logic fromdevice_class.rssentry.mobile: "true"fromsentry.sdk.name~~Frame rate calculation: Derive
and~~frames.frozen_rate~~from~~frames.slow_rate~~and~~frames.frozen / frames.total~~and ~~~~frames.slow / frames.total~~~~stall_percentage~~-> done in Frontend instead on-demandAdditionally for v1 pipeline add:
app.startandapp.start.typeattributes if app start measurements exist. These are the new attributes that will be used in the mobile vitals dashboard (since they cannot be deprecated directly in sentry-conventions we need to add them here)