Skip to content

Commit e9dec94

Browse files
committed
ref(store): Reduce owned deserialization
Some fields of `SpanKafkaMessage` were previously deserialized as `serde_json::Value`, which was partly caused by having to parse and validate `f64` values in `measurements`. As of #4828 that validation is no longer necessary. Consequently, we can now use `RawValue` everywhere. The `inner_produce_protobuf_span` function needs to match on `serde_json::Value`, but we can deserialize the raw values there. The same applies for setting the sample rates in `backfill_data`. This change also removes some unnecessary `Cow`s in `SpanKafkaMessage` where nothing was ever changed or inserted.
1 parent d5fc631 commit e9dec94

File tree

1 file changed

+28
-27
lines changed

1 file changed

+28
-27
lines changed

relay-server/src/services/store.rs

Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -914,11 +914,6 @@ impl StoreService {
914914
}
915915
};
916916

917-
if let Some(measurements) = &mut span.measurements {
918-
measurements
919-
.retain(|_, v| v.as_ref().and_then(|v| v.value).is_some_and(f64::is_finite));
920-
}
921-
922917
span.backfill_data();
923918
span.duration_ms =
924919
((span.end_timestamp_precise - span.start_timestamp_precise) * 1e3) as u32;
@@ -1007,7 +1002,8 @@ impl StoreService {
10071002

10081003
if let Some(data) = span.data {
10091004
for (key, raw_value) in data {
1010-
let Some(json_value) = raw_value else {
1005+
let Some(json_value) = raw_value.and_then(|raw| Deserialize::deserialize(raw).ok())
1006+
else {
10111007
continue;
10121008
};
10131009
let any_value = match json_value {
@@ -1051,7 +1047,7 @@ impl StoreService {
10511047
trace_item.attributes.insert(
10521048
"sentry.raw_description".into(),
10531049
AnyValue {
1054-
value: Some(Value::StringValue(description)),
1050+
value: Some(Value::StringValue(description.to_owned())),
10551051
},
10561052
);
10571053
}
@@ -1624,15 +1620,15 @@ struct SpanLink<'a> {
16241620
}
16251621

16261622
#[derive(Debug, Deserialize, Serialize, Clone)]
1627-
struct SpanMeasurement {
1628-
#[serde(default, skip_serializing_if = "Option::is_none")]
1629-
value: Option<f64>,
1623+
struct SpanMeasurement<'a> {
1624+
#[serde(skip_serializing_if = "Option::is_none", borrow)]
1625+
value: Option<&'a RawValue>,
16301626
}
16311627

16321628
#[derive(Debug, Deserialize, Serialize, Clone)]
16331629
struct SpanKafkaMessage<'a> {
16341630
#[serde(default, skip_serializing_if = "Option::is_none")]
1635-
description: Option<String>,
1631+
description: Option<&'a str>,
16361632
#[serde(default)]
16371633
duration_ms: u32,
16381634
/// The ID of the transaction event associated to this span, if any.
@@ -1646,17 +1642,17 @@ struct SpanKafkaMessage<'a> {
16461642
is_remote: bool,
16471643

16481644
#[serde(skip_serializing_if = "none_or_empty_map", borrow)]
1649-
data: Option<BTreeMap<Cow<'a, str>, Option<serde_json::Value>>>,
1645+
data: Option<BTreeMap<Cow<'a, str>, Option<&'a RawValue>>>,
16501646
#[serde(default, skip_serializing_if = "Option::is_none")]
16511647
kind: Option<&'a str>,
16521648
#[serde(default, skip_serializing_if = "none_or_empty_vec")]
16531649
links: Option<Vec<SpanLink<'a>>>,
16541650
#[serde(borrow, default, skip_serializing_if = "Option::is_none")]
1655-
measurements: Option<BTreeMap<Cow<'a, str>, Option<SpanMeasurement>>>,
1651+
measurements: Option<BTreeMap<&'a str, Option<SpanMeasurement<'a>>>>,
16561652
#[serde(default)]
16571653
organization_id: u64,
16581654
#[serde(borrow, default, skip_serializing_if = "Option::is_none")]
1659-
origin: Option<Cow<'a, str>>,
1655+
origin: Option<&'a str>,
16601656
#[serde(default, skip_serializing_if = "Option::is_none")]
16611657
parent_span_id: Option<&'a str>,
16621658
#[serde(default, skip_serializing_if = "Option::is_none")]
@@ -1677,10 +1673,10 @@ struct SpanKafkaMessage<'a> {
16771673
serialize_with = "serialize_btreemap_skip_nulls"
16781674
)]
16791675
#[serde(borrow)]
1680-
sentry_tags: Option<BTreeMap<&'a str, Option<serde_json::Value>>>,
1676+
sentry_tags: Option<BTreeMap<&'a str, Option<&'a RawValue>>>,
16811677
span_id: &'a str,
16821678
#[serde(skip_serializing_if = "none_or_empty_map", borrow)]
1683-
tags: Option<BTreeMap<&'a str, Option<serde_json::Value>>>,
1679+
tags: Option<BTreeMap<&'a str, Option<&'a RawValue>>>,
16841680
trace_id: EventId,
16851681

16861682
#[serde(default)]
@@ -1691,7 +1687,7 @@ struct SpanKafkaMessage<'a> {
16911687
end_timestamp_precise: f64,
16921688

16931689
#[serde(borrow, default, skip_serializing)]
1694-
platform: Cow<'a, str>, // We only use this for logging for now
1690+
platform: &'a str, // We only use this for logging for now
16951691

16961692
#[serde(default, skip_serializing_if = "Option::is_none")]
16971693
client_sample_rate: Option<f64>,
@@ -1737,11 +1733,18 @@ impl SpanKafkaMessage<'_> {
17371733
};
17381734

17391735
match &key[..] {
1740-
"client_sample_rate" => self.client_sample_rate = Some(value),
1741-
"server_sample_rate" => self.server_sample_rate = Some(value),
1736+
"client_sample_rate" => {
1737+
if let Ok(client_sample_rate) = Deserialize::deserialize(value) {
1738+
self.client_sample_rate = Some(client_sample_rate);
1739+
}
1740+
}
1741+
"server_sample_rate" => {
1742+
if let Ok(server_sample_rate) = Deserialize::deserialize(value) {
1743+
self.server_sample_rate = Some(server_sample_rate);
1744+
}
1745+
}
17421746
_ => {
1743-
data.entry(key.clone())
1744-
.or_insert_with(|| Some(value.into()));
1747+
data.entry(Cow::Borrowed(key)).or_insert(Some(value));
17451748
}
17461749
}
17471750
}
@@ -1759,8 +1762,7 @@ impl SpanKafkaMessage<'_> {
17591762
key
17601763
};
17611764

1762-
data.entry(Cow::Borrowed(key))
1763-
.or_insert_with(|| Some(value.clone()));
1765+
data.entry(Cow::Borrowed(key)).or_insert(Some(value));
17641766
}
17651767
}
17661768

@@ -1771,13 +1773,12 @@ impl SpanKafkaMessage<'_> {
17711773
};
17721774

17731775
let key = if *key == "description" {
1774-
"sentry.normalized_description".to_owned()
1776+
Cow::Borrowed("sentry.normalized_description")
17751777
} else {
1776-
format!("sentry.{key}")
1778+
Cow::Owned(format!("sentry.{key}"))
17771779
};
17781780

1779-
data.entry(Cow::Owned(key))
1780-
.or_insert_with(|| Some(value.clone()));
1781+
data.entry(key).or_insert(Some(value));
17811782
}
17821783
}
17831784
}

0 commit comments

Comments
 (0)