From 8db0e971a8aa3748988ef4c41c548f8f1cf32981 Mon Sep 17 00:00:00 2001 From: Nar Saynorath Date: Mon, 22 Apr 2024 23:19:13 -0400 Subject: [PATCH 1/7] feat(mobile-ui): Add slow, frozen, and total frames metrics --- relay-dynamic-config/src/defaults.rs | 96 +++++++++++++++ relay-event-schema/src/protocol/span.rs | 14 ++- relay-server/src/metrics_extraction/event.rs | 7 +- ...t__tests__extract_span_metrics_mobile.snap | 111 +++++++++++++++++- 4 files changed, 225 insertions(+), 3 deletions(-) diff --git a/relay-dynamic-config/src/defaults.rs b/relay-dynamic-config/src/defaults.rs index 179259398b5..a748547669b 100644 --- a/relay-dynamic-config/src/defaults.rs +++ b/relay-dynamic-config/src/defaults.rs @@ -622,6 +622,102 @@ fn span_metrics( .always(), // already guarded by condition on metric ], }, + MetricSpec { + category: DataCategory::Span, + mri: "d:spans/mobile.slow_frames@none".into(), + field: Some("span.data.frames\\.slow".into()), + condition: Some(is_mobile.clone() & duration_condition.clone()), + tags: vec![ + Tag::with_key("transaction") + .from_field("span.sentry_tags.transaction") + .always(), + Tag::with_key("environment") + .from_field("span.sentry_tags.environment") + .always(), + Tag::with_key("release") + .from_field("span.sentry_tags.release") + .always(), + Tag::with_key("span.description") + .from_field("span.sentry_tags.description") + .always(), + Tag::with_key("span.op") + .from_field("span.sentry_tags.op") + .always(), + Tag::with_key("span.group") + .from_field("span.sentry_tags.group") + .always(), + Tag::with_key("device.class") + .from_field("span.sentry_tags.device.class") + .always(), + Tag::with_key("os.name") + .from_field("span.sentry_tags.os.name") + .always(), + ], + }, + MetricSpec { + category: DataCategory::Span, + mri: "d:spans/mobile.frozen_frames@none".into(), + field: Some("span.data.frames\\.frozen".into()), + condition: Some(is_mobile.clone() & duration_condition.clone()), + tags: vec![ + Tag::with_key("transaction") + .from_field("span.sentry_tags.transaction") + .always(), + Tag::with_key("environment") + .from_field("span.sentry_tags.environment") + .always(), + Tag::with_key("release") + .from_field("span.sentry_tags.release") + .always(), + Tag::with_key("span.description") + .from_field("span.sentry_tags.description") + .always(), + Tag::with_key("span.op") + .from_field("span.sentry_tags.op") + .always(), + Tag::with_key("span.group") + .from_field("span.sentry_tags.group") + .always(), + Tag::with_key("device.class") + .from_field("span.sentry_tags.device.class") + .always(), + Tag::with_key("os.name") + .from_field("span.sentry_tags.os.name") + .always(), + ], + }, + MetricSpec { + category: DataCategory::Span, + mri: "d:spans/mobile.total_frames@none".into(), + field: Some("span.data.frames\\.total".into()), + condition: Some(is_mobile.clone() & duration_condition.clone()), + tags: vec![ + Tag::with_key("transaction") + .from_field("span.sentry_tags.transaction") + .always(), + Tag::with_key("environment") + .from_field("span.sentry_tags.environment") + .always(), + Tag::with_key("release") + .from_field("span.sentry_tags.release") + .always(), + Tag::with_key("span.description") + .from_field("span.sentry_tags.description") + .always(), + Tag::with_key("span.op") + .from_field("span.sentry_tags.op") + .always(), + Tag::with_key("span.group") + .from_field("span.sentry_tags.group") + .always(), + Tag::with_key("device.class") + .from_field("span.sentry_tags.device.class") + .always(), + Tag::with_key("os.name") + .from_field("span.sentry_tags.os.name") + .always(), + ], + }, ]; if double_write_distributions_as_gauges { diff --git a/relay-event-schema/src/protocol/span.rs b/relay-event-schema/src/protocol/span.rs index 1e1932f8fd1..80081e6214d 100644 --- a/relay-event-schema/src/protocol/span.rs +++ b/relay-event-schema/src/protocol/span.rs @@ -493,7 +493,10 @@ mod tests { "code.filepath": "task.py", "code.lineno": 123, "code.function": "fn()", - "code.namespace": "ns" + "code.namespace": "ns", + "frames.slow": 1, + "frames.frozen": 2, + "frames.total": 9 }"#; let data = Annotated::::from_json(data) .unwrap() @@ -549,6 +552,15 @@ mod tests { "foo": I64( 2, ), + "frames.frozen": I64( + 2, + ), + "frames.slow": I64( + 1, + ), + "frames.total": I64( + 9, + ), }, } "###); diff --git a/relay-server/src/metrics_extraction/event.rs b/relay-server/src/metrics_extraction/event.rs index 0f08e829cf8..e662c5648d1 100644 --- a/relay-server/src/metrics_extraction/event.rs +++ b/relay-server/src/metrics_extraction/event.rs @@ -1133,7 +1133,12 @@ mod tests { "span_id": "bd429c44b67a3eb2", "start_timestamp": 1597976300.0000000, "timestamp": 1597976303.0000000, - "trace_id": "ff62a8b040f340bda5d830223def1d81" + "trace_id": "ff62a8b040f340bda5d830223def1d81", + "data": { + "frames.slow": 1, + "frames.frozen": 2, + "frames.total": 9 + } }, { "op": "app.start.cold", diff --git a/relay-server/src/metrics_extraction/snapshots/relay_server__metrics_extraction__event__tests__extract_span_metrics_mobile.snap b/relay-server/src/metrics_extraction/snapshots/relay_server__metrics_extraction__event__tests__extract_span_metrics_mobile.snap index 9de0b77f1cb..019502ed819 100644 --- a/relay-server/src/metrics_extraction/snapshots/relay_server__metrics_extraction__event__tests__extract_span_metrics_mobile.snap +++ b/relay-server/src/metrics_extraction/snapshots/relay_server__metrics_extraction__event__tests__extract_span_metrics_mobile.snap @@ -74,7 +74,50 @@ expression: "(&event.value().unwrap().spans, metrics)" tags: ~, origin: ~, profile_id: ~, - data: ~, + data: SpanData { + app_start_type: ~, + browser_name: ~, + code_filepath: ~, + code_lineno: ~, + code_function: ~, + code_namespace: ~, + db_operation: ~, + db_system: ~, + environment: ~, + release: ~, + http_decoded_response_content_length: ~, + http_request_method: ~, + http_response_content_length: ~, + http_response_transfer_size: ~, + resource_render_blocking_status: ~, + server_address: ~, + cache_hit: ~, + cache_item_size: ~, + http_response_status_code: ~, + ai_input_messages: ~, + ai_completion_tokens_used: ~, + ai_prompt_tokens_used: ~, + ai_total_tokens_used: ~, + ai_responses: ~, + thread_name: ~, + segment_name: ~, + ui_component_name: ~, + url_scheme: ~, + user: ~, + replay_id: ~, + sdk_name: ~, + other: { + "frames.frozen": I64( + 2, + ), + "frames.slow": I64( + 1, + ), + "frames.total": I64( + 9, + ), + }, + }, sentry_tags: { "app_start_type": "warm", "device.class": "1", @@ -715,6 +758,72 @@ expression: "(&event.value().unwrap().spans, metrics)" merges: 1, }, }, + Bucket { + timestamp: UnixTimestamp(1597976303), + width: 0, + name: MetricName( + "d:spans/mobile.slow_frames@none", + ), + value: Distribution( + [ + 1.0, + ], + ), + tags: { + "device.class": "1", + "os.name": "iOS", + "release": "1.2.3", + "span.op": "ui.load.initial_display", + "transaction": "gEt /api/:version/users/", + }, + metadata: BucketMetadata { + merges: 1, + }, + }, + Bucket { + timestamp: UnixTimestamp(1597976303), + width: 0, + name: MetricName( + "d:spans/mobile.frozen_frames@none", + ), + value: Distribution( + [ + 2.0, + ], + ), + tags: { + "device.class": "1", + "os.name": "iOS", + "release": "1.2.3", + "span.op": "ui.load.initial_display", + "transaction": "gEt /api/:version/users/", + }, + metadata: BucketMetadata { + merges: 1, + }, + }, + Bucket { + timestamp: UnixTimestamp(1597976303), + width: 0, + name: MetricName( + "d:spans/mobile.total_frames@none", + ), + value: Distribution( + [ + 9.0, + ], + ), + tags: { + "device.class": "1", + "os.name": "iOS", + "release": "1.2.3", + "span.op": "ui.load.initial_display", + "transaction": "gEt /api/:version/users/", + }, + metadata: BucketMetadata { + merges: 1, + }, + }, Bucket { timestamp: UnixTimestamp(1597976303), width: 0, From f5486898efce61998e34ad8441361c5154300ec1 Mon Sep 17 00:00:00 2001 From: Nar Saynorath Date: Mon, 22 Apr 2024 23:28:02 -0400 Subject: [PATCH 2/7] Changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 446a7775354..c071925a9bf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,6 @@ ## Unreleased - **Bug fixes:** - Respect country code TLDs when scrubbing span tags. ([#3458](https://github.com/getsentry/relay/pull/3458)) @@ -11,6 +10,7 @@ - Use same keys for OTel span attributes and Sentry span data. ([#3457](https://github.com/getsentry/relay/pull/3457)) - Support passing owner when upserting Monitors. ([#3468](https://github.com/getsentry/relay/pull/3468)) +- Extract `frames.slow`, `frames.frozen`, and `frames.total` metrics from mobile spans. ([#3473](https://github.com/getsentry/relay/pull/3473)) **Internal**: From 4a83dca0021cac491e6c62caba17092861e91bb7 Mon Sep 17 00:00:00 2001 From: Nar Saynorath Date: Tue, 23 Apr 2024 00:25:33 -0400 Subject: [PATCH 3/7] Add data field definitions for slow, frozen, and total frames --- relay-event-schema/src/protocol/span.rs | 33 ++++++++++++++----- .../src/protocol/span/convert.rs | 3 ++ ...t__tests__extract_span_metrics_mobile.snap | 27 ++++++++------- 3 files changed, 43 insertions(+), 20 deletions(-) diff --git a/relay-event-schema/src/protocol/span.rs b/relay-event-schema/src/protocol/span.rs index 80081e6214d..ab609344edb 100644 --- a/relay-event-schema/src/protocol/span.rs +++ b/relay-event-schema/src/protocol/span.rs @@ -299,6 +299,18 @@ pub struct SpanData { #[metastructure(field = "sentry.sdk.name")] pub sdk_name: Annotated, + /// Slow Frames + #[metastructure(field = "frames.slow")] + pub frames_slow: Annotated, + + /// Frozen Frames + #[metastructure(field = "frames.frozen")] + pub frames_frozen: Annotated, + + /// Total Frames + #[metastructure(field = "frames.total")] + pub frames_total: Annotated, + /// Other fields in `span.data`. #[metastructure(additional_properties, pii = "true", retain = "true")] other: Object, @@ -316,6 +328,9 @@ impl Getter for SpanData { "db.operation" => self.db_operation.value()?.into(), "db\\.system" => self.db_system.value()?.into(), "environment" => self.environment.as_str()?.into(), + "frames\\.frozen" => self.frames_frozen.value()?.into(), + "frames\\.slow" => self.frames_slow.value()?.into(), + "frames\\.total" => self.frames_total.value()?.into(), "http\\.decoded_response_content_length" => { self.http_decoded_response_content_length.value()?.into() } @@ -545,6 +560,15 @@ mod tests { user: ~, replay_id: ~, sdk_name: ~, + frames_slow: I64( + 1, + ), + frames_frozen: I64( + 2, + ), + frames_total: I64( + 9, + ), other: { "bar": String( "3", @@ -552,15 +576,6 @@ mod tests { "foo": I64( 2, ), - "frames.frozen": I64( - 2, - ), - "frames.slow": I64( - 1, - ), - "frames.total": I64( - 9, - ), }, } "###); diff --git a/relay-event-schema/src/protocol/span/convert.rs b/relay-event-schema/src/protocol/span/convert.rs index ecf449d2f71..b7ca652ae34 100644 --- a/relay-event-schema/src/protocol/span/convert.rs +++ b/relay-event-schema/src/protocol/span/convert.rs @@ -287,6 +287,9 @@ mod tests { user: ~, replay_id: ~, sdk_name: "sentry.php", + frames_slow: ~, + frames_frozen: ~, + frames_total: ~, other: {}, }, sentry_tags: ~, diff --git a/relay-server/src/metrics_extraction/snapshots/relay_server__metrics_extraction__event__tests__extract_span_metrics_mobile.snap b/relay-server/src/metrics_extraction/snapshots/relay_server__metrics_extraction__event__tests__extract_span_metrics_mobile.snap index 019502ed819..132f2c3a314 100644 --- a/relay-server/src/metrics_extraction/snapshots/relay_server__metrics_extraction__event__tests__extract_span_metrics_mobile.snap +++ b/relay-server/src/metrics_extraction/snapshots/relay_server__metrics_extraction__event__tests__extract_span_metrics_mobile.snap @@ -106,17 +106,16 @@ expression: "(&event.value().unwrap().spans, metrics)" user: ~, replay_id: ~, sdk_name: ~, - other: { - "frames.frozen": I64( - 2, - ), - "frames.slow": I64( - 1, - ), - "frames.total": I64( - 9, - ), - }, + frames_slow: I64( + 1, + ), + frames_frozen: I64( + 2, + ), + frames_total: I64( + 9, + ), + other: {}, }, sentry_tags: { "app_start_type": "warm", @@ -388,6 +387,9 @@ expression: "(&event.value().unwrap().spans, metrics)" user: ~, replay_id: ~, sdk_name: ~, + frames_slow: ~, + frames_frozen: ~, + frames_total: ~, other: {}, }, sentry_tags: { @@ -471,6 +473,9 @@ expression: "(&event.value().unwrap().spans, metrics)" user: ~, replay_id: ~, sdk_name: ~, + frames_slow: ~, + frames_frozen: ~, + frames_total: ~, other: {}, }, sentry_tags: { From 20c05a77a62229d5e451a7f078f47ad4a23cd44c Mon Sep 17 00:00:00 2001 From: Nar Saynorath Date: Tue, 23 Apr 2024 09:36:23 -0400 Subject: [PATCH 4/7] Use gauge and prefix span data with `sentry.` --- relay-dynamic-config/src/defaults.rs | 6 +-- relay-event-schema/src/protocol/span.rs | 27 +++++++----- ...t__tests__extract_span_metrics_mobile.snap | 44 ++++++++++++------- relay-spans/src/span.rs | 3 ++ 4 files changed, 49 insertions(+), 31 deletions(-) diff --git a/relay-dynamic-config/src/defaults.rs b/relay-dynamic-config/src/defaults.rs index a748547669b..e77ede84db9 100644 --- a/relay-dynamic-config/src/defaults.rs +++ b/relay-dynamic-config/src/defaults.rs @@ -624,7 +624,7 @@ fn span_metrics( }, MetricSpec { category: DataCategory::Span, - mri: "d:spans/mobile.slow_frames@none".into(), + mri: "g:spans/mobile.slow_frames@none".into(), field: Some("span.data.frames\\.slow".into()), condition: Some(is_mobile.clone() & duration_condition.clone()), tags: vec![ @@ -656,7 +656,7 @@ fn span_metrics( }, MetricSpec { category: DataCategory::Span, - mri: "d:spans/mobile.frozen_frames@none".into(), + mri: "g:spans/mobile.frozen_frames@none".into(), field: Some("span.data.frames\\.frozen".into()), condition: Some(is_mobile.clone() & duration_condition.clone()), tags: vec![ @@ -688,7 +688,7 @@ fn span_metrics( }, MetricSpec { category: DataCategory::Span, - mri: "d:spans/mobile.total_frames@none".into(), + mri: "g:spans/mobile.total_frames@none".into(), field: Some("span.data.frames\\.total".into()), condition: Some(is_mobile.clone() & duration_condition.clone()), tags: vec![ diff --git a/relay-event-schema/src/protocol/span.rs b/relay-event-schema/src/protocol/span.rs index ab609344edb..b9774de61c2 100644 --- a/relay-event-schema/src/protocol/span.rs +++ b/relay-event-schema/src/protocol/span.rs @@ -300,15 +300,15 @@ pub struct SpanData { pub sdk_name: Annotated, /// Slow Frames - #[metastructure(field = "frames.slow")] + #[metastructure(field = "sentry.frames.slow")] pub frames_slow: Annotated, /// Frozen Frames - #[metastructure(field = "frames.frozen")] + #[metastructure(field = "sentry.frames.frozen")] pub frames_frozen: Annotated, /// Total Frames - #[metastructure(field = "frames.total")] + #[metastructure(field = "sentry.frames.total")] pub frames_total: Annotated, /// Other fields in `span.data`. @@ -560,15 +560,9 @@ mod tests { user: ~, replay_id: ~, sdk_name: ~, - frames_slow: I64( - 1, - ), - frames_frozen: I64( - 2, - ), - frames_total: I64( - 9, - ), + frames_slow: ~, + frames_frozen: ~, + frames_total: ~, other: { "bar": String( "3", @@ -576,6 +570,15 @@ mod tests { "foo": I64( 2, ), + "frames.frozen": I64( + 2, + ), + "frames.slow": I64( + 1, + ), + "frames.total": I64( + 9, + ), }, } "###); diff --git a/relay-server/src/metrics_extraction/snapshots/relay_server__metrics_extraction__event__tests__extract_span_metrics_mobile.snap b/relay-server/src/metrics_extraction/snapshots/relay_server__metrics_extraction__event__tests__extract_span_metrics_mobile.snap index 132f2c3a314..7297093d37a 100644 --- a/relay-server/src/metrics_extraction/snapshots/relay_server__metrics_extraction__event__tests__extract_span_metrics_mobile.snap +++ b/relay-server/src/metrics_extraction/snapshots/relay_server__metrics_extraction__event__tests__extract_span_metrics_mobile.snap @@ -767,12 +767,16 @@ expression: "(&event.value().unwrap().spans, metrics)" timestamp: UnixTimestamp(1597976303), width: 0, name: MetricName( - "d:spans/mobile.slow_frames@none", + "g:spans/mobile.slow_frames@none", ), - value: Distribution( - [ - 1.0, - ], + value: Gauge( + GaugeValue { + last: 1.0, + min: 1.0, + max: 1.0, + sum: 1.0, + count: 1, + }, ), tags: { "device.class": "1", @@ -789,12 +793,16 @@ expression: "(&event.value().unwrap().spans, metrics)" timestamp: UnixTimestamp(1597976303), width: 0, name: MetricName( - "d:spans/mobile.frozen_frames@none", + "g:spans/mobile.frozen_frames@none", ), - value: Distribution( - [ - 2.0, - ], + value: Gauge( + GaugeValue { + last: 2.0, + min: 2.0, + max: 2.0, + sum: 2.0, + count: 1, + }, ), tags: { "device.class": "1", @@ -811,12 +819,16 @@ expression: "(&event.value().unwrap().spans, metrics)" timestamp: UnixTimestamp(1597976303), width: 0, name: MetricName( - "d:spans/mobile.total_frames@none", - ), - value: Distribution( - [ - 9.0, - ], + "g:spans/mobile.total_frames@none", + ), + value: Gauge( + GaugeValue { + last: 9.0, + min: 9.0, + max: 9.0, + sum: 9.0, + count: 1, + }, ), tags: { "device.class": "1", diff --git a/relay-spans/src/span.rs b/relay-spans/src/span.rs index 723f85cd795..1482cf56ef3 100644 --- a/relay-spans/src/span.rs +++ b/relay-spans/src/span.rs @@ -545,6 +545,9 @@ mod tests { user: ~, replay_id: ~, sdk_name: "sentry.php", + frames_slow: ~, + frames_frozen: ~, + frames_total: ~, other: {}, }, sentry_tags: ~, From 4318bdaaff0eeed01588b91b5c6a0a3988dd1c04 Mon Sep 17 00:00:00 2001 From: Nar Saynorath Date: Tue, 23 Apr 2024 10:00:01 -0400 Subject: [PATCH 5/7] Fix span data property definitions --- relay-event-schema/src/protocol/span.rs | 27 +++++++++++-------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/relay-event-schema/src/protocol/span.rs b/relay-event-schema/src/protocol/span.rs index b9774de61c2..6ec089912f5 100644 --- a/relay-event-schema/src/protocol/span.rs +++ b/relay-event-schema/src/protocol/span.rs @@ -300,15 +300,15 @@ pub struct SpanData { pub sdk_name: Annotated, /// Slow Frames - #[metastructure(field = "sentry.frames.slow")] + #[metastructure(field = "sentry.frames.slow", legacy_alias = "frames.slow")] pub frames_slow: Annotated, /// Frozen Frames - #[metastructure(field = "sentry.frames.frozen")] + #[metastructure(field = "sentry.frames.frozen", legacy_alias = "frames.frozen")] pub frames_frozen: Annotated, /// Total Frames - #[metastructure(field = "sentry.frames.total")] + #[metastructure(field = "sentry.frames.total", legacy_alias = "frames.total")] pub frames_total: Annotated, /// Other fields in `span.data`. @@ -560,9 +560,15 @@ mod tests { user: ~, replay_id: ~, sdk_name: ~, - frames_slow: ~, - frames_frozen: ~, - frames_total: ~, + frames_slow: I64( + 1, + ), + frames_frozen: I64( + 2, + ), + frames_total: I64( + 9, + ), other: { "bar": String( "3", @@ -570,15 +576,6 @@ mod tests { "foo": I64( 2, ), - "frames.frozen": I64( - 2, - ), - "frames.slow": I64( - 1, - ), - "frames.total": I64( - 9, - ), }, } "###); From 1a6c159e2f70dc95e9c3f6c3c4a96abb6444b7d8 Mon Sep 17 00:00:00 2001 From: Nar Saynorath Date: Tue, 23 Apr 2024 13:44:31 -0400 Subject: [PATCH 6/7] Extract span data fields into span measurements --- relay-dynamic-config/src/defaults.rs | 6 ++-- .../src/normalize/span/tag_extraction.rs | 31 +++++++++++++++++-- relay-event-schema/src/protocol/span.rs | 3 -- ...t__tests__extract_span_metrics_mobile.snap | 17 +++++++++- .../src/services/processor/span/processing.rs | 2 +- 5 files changed, 49 insertions(+), 10 deletions(-) diff --git a/relay-dynamic-config/src/defaults.rs b/relay-dynamic-config/src/defaults.rs index e77ede84db9..3ba062e2e99 100644 --- a/relay-dynamic-config/src/defaults.rs +++ b/relay-dynamic-config/src/defaults.rs @@ -625,7 +625,7 @@ fn span_metrics( MetricSpec { category: DataCategory::Span, mri: "g:spans/mobile.slow_frames@none".into(), - field: Some("span.data.frames\\.slow".into()), + field: Some("span.measurements.frames.slow.value".into()), condition: Some(is_mobile.clone() & duration_condition.clone()), tags: vec![ Tag::with_key("transaction") @@ -657,7 +657,7 @@ fn span_metrics( MetricSpec { category: DataCategory::Span, mri: "g:spans/mobile.frozen_frames@none".into(), - field: Some("span.data.frames\\.frozen".into()), + field: Some("span.measurements.frames.frozen.value".into()), condition: Some(is_mobile.clone() & duration_condition.clone()), tags: vec![ Tag::with_key("transaction") @@ -689,7 +689,7 @@ fn span_metrics( MetricSpec { category: DataCategory::Span, mri: "g:spans/mobile.total_frames@none".into(), - field: Some("span.data.frames\\.total".into()), + field: Some("span.measurements.frames.total.value".into()), condition: Some(is_mobile.clone() & duration_condition.clone()), tags: vec![ Tag::with_key("transaction") diff --git a/relay-event-normalization/src/normalize/span/tag_extraction.rs b/relay-event-normalization/src/normalize/span/tag_extraction.rs index b389c1eae47..ca892b936c7 100644 --- a/relay-event-normalization/src/normalize/span/tag_extraction.rs +++ b/relay-event-normalization/src/normalize/span/tag_extraction.rs @@ -194,7 +194,7 @@ pub fn extract_span_tags(event: &Event, spans: &mut [Annotated], max_tag_v .collect(), ); - extract_measurements(span); + extract_measurements(span, is_mobile); } } @@ -582,7 +582,7 @@ pub fn extract_tags( } /// Copies specific numeric values from span data to span measurements. -pub fn extract_measurements(span: &mut Span) { +pub fn extract_measurements(span: &mut Span, is_mobile: bool) { let Some(span_op) = span.op.as_str() else { return; }; @@ -643,6 +643,33 @@ pub fn extract_measurements(span: &mut Span) { } } } + + if is_mobile { + if let Some(data) = span.data.value() { + for (field, key) in [ + (&data.frames_frozen, "frames.frozen"), + (&data.frames_slow, "frames.slow"), + (&data.frames_total, "frames.total"), + ] { + if let Some(value) = match field.value() { + Some(Value::F64(f)) => Some(*f), + Some(Value::I64(i)) => Some(*i as f64), + Some(Value::U64(u)) => Some(*u as f64), + _ => None, + } { + let measurements = span.measurements.get_or_insert_with(Default::default); + measurements.insert( + key.into(), + Measurement { + value: value.into(), + unit: MetricUnit::None.into(), + } + .into(), + ); + } + } + } + } } /// Finds first matching span and get its timestamp. diff --git a/relay-event-schema/src/protocol/span.rs b/relay-event-schema/src/protocol/span.rs index 6ec089912f5..e790200bc56 100644 --- a/relay-event-schema/src/protocol/span.rs +++ b/relay-event-schema/src/protocol/span.rs @@ -328,9 +328,6 @@ impl Getter for SpanData { "db.operation" => self.db_operation.value()?.into(), "db\\.system" => self.db_system.value()?.into(), "environment" => self.environment.as_str()?.into(), - "frames\\.frozen" => self.frames_frozen.value()?.into(), - "frames\\.slow" => self.frames_slow.value()?.into(), - "frames\\.total" => self.frames_total.value()?.into(), "http\\.decoded_response_content_length" => { self.http_decoded_response_content_length.value()?.into() } diff --git a/relay-server/src/metrics_extraction/snapshots/relay_server__metrics_extraction__event__tests__extract_span_metrics_mobile.snap b/relay-server/src/metrics_extraction/snapshots/relay_server__metrics_extraction__event__tests__extract_span_metrics_mobile.snap index 7297093d37a..718515ca7c3 100644 --- a/relay-server/src/metrics_extraction/snapshots/relay_server__metrics_extraction__event__tests__extract_span_metrics_mobile.snap +++ b/relay-server/src/metrics_extraction/snapshots/relay_server__metrics_extraction__event__tests__extract_span_metrics_mobile.snap @@ -133,7 +133,22 @@ expression: "(&event.value().unwrap().spans, metrics)" "ttid": "ttid", }, received: ~, - measurements: ~, + measurements: Measurements( + { + "frames.frozen": Measurement { + value: 2.0, + unit: None, + }, + "frames.slow": Measurement { + value: 1.0, + unit: None, + }, + "frames.total": Measurement { + value: 9.0, + unit: None, + }, + }, + ), _metrics_summary: ~, platform: ~, was_transaction: ~, diff --git a/relay-server/src/services/processor/span/processing.rs b/relay-server/src/services/processor/span/processing.rs index f8b80f1d293..7699c238796 100644 --- a/relay-server/src/services/processor/span/processing.rs +++ b/relay-server/src/services/processor/span/processing.rs @@ -527,7 +527,7 @@ fn normalize( normalize_performance_score(&mut event, performance_score); span.measurements = event.measurements; - tag_extraction::extract_measurements(span); + tag_extraction::extract_measurements(span, is_mobile); process_value( annotated_span, From 7f8d81666a65b6a0535ea7cd38b7376158f8f926 Mon Sep 17 00:00:00 2001 From: Nar Saynorath Date: Tue, 23 Apr 2024 13:52:09 -0400 Subject: [PATCH 7/7] Fix snapshot --- ...cs_extraction__event__tests__extract_span_metrics_mobile.snap | 1 + 1 file changed, 1 insertion(+) diff --git a/relay-server/src/metrics_extraction/snapshots/relay_server__metrics_extraction__event__tests__extract_span_metrics_mobile.snap b/relay-server/src/metrics_extraction/snapshots/relay_server__metrics_extraction__event__tests__extract_span_metrics_mobile.snap index 4ec185db82f..fdcfec4593f 100644 --- a/relay-server/src/metrics_extraction/snapshots/relay_server__metrics_extraction__event__tests__extract_span_metrics_mobile.snap +++ b/relay-server/src/metrics_extraction/snapshots/relay_server__metrics_extraction__event__tests__extract_span_metrics_mobile.snap @@ -94,6 +94,7 @@ expression: "(&event.value().unwrap().spans, metrics)" cache_hit: ~, cache_item_size: ~, http_response_status_code: ~, + ai_pipeline_name: ~, ai_input_messages: ~, ai_completion_tokens_used: ~, ai_prompt_tokens_used: ~,