Skip to content

Commit f6852d3

Browse files
authored
feat: Implement conversion from Span V2 to Span V1 (#4743)
This adds a new module `v2_to_v1` to `relay-spans` which is unused for now. The module contains a function `span_v2_to_span_v1` and a battery of tests that parallel the ones in `otel_to_sentry`.
1 parent e3b62f0 commit f6852d3

File tree

4 files changed

+749
-65
lines changed

4 files changed

+749
-65
lines changed

relay-protocol/src/annotated.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,15 @@ impl<T> Annotated<T> {
213213
_ => {}
214214
}
215215
}
216+
217+
/// Returns `self` if it contains a value, otherwise computes and returns `other`.
218+
pub fn or_else<F: FnOnce() -> Annotated<T>>(self, other: F) -> Annotated<T> {
219+
if self.value().is_some() {
220+
return self;
221+
}
222+
223+
other()
224+
}
216225
}
217226

218227
impl<T> Annotated<T>

relay-spans/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,4 @@ pub use opentelemetry_proto::tonic::trace::v1 as otel_trace;
1212

1313
mod otel_to_sentry;
1414
mod status_codes;
15+
mod v2_to_v1;

relay-spans/src/otel_to_sentry.rs

Lines changed: 1 addition & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ fn otel_to_sentry_value(value: OtelValue) -> Option<Value> {
261261
#[cfg(test)]
262262
mod tests {
263263
use super::*;
264-
use relay_protocol::{SerializableAnnotated, get_path};
264+
use relay_protocol::SerializableAnnotated;
265265

266266
#[test]
267267
fn parse_span() {
@@ -329,12 +329,7 @@ mod tests {
329329
}"#;
330330
let otel_span: OtelSpan = serde_json::from_str(json).unwrap();
331331
let event_span: EventSpan = otel_to_sentry_span(otel_span).unwrap();
332-
assert_eq!(event_span.exclusive_time, Annotated::new(1000.0));
333332
let annotated_span: Annotated<EventSpan> = Annotated::new(event_span);
334-
assert_eq!(
335-
get_path!(annotated_span.data.environment),
336-
Some(&Annotated::new("test".into()))
337-
);
338333
insta::assert_json_snapshot!(SerializableAnnotated(&annotated_span), @r###"
339334
{
340335
"timestamp": 1697620454.980079,
@@ -380,7 +375,6 @@ mod tests {
380375
}"#;
381376
let otel_span: OtelSpan = serde_json::from_str(json).unwrap();
382377
let event_span: EventSpan = otel_to_sentry_span(otel_span).unwrap();
383-
assert_eq!(event_span.exclusive_time, Annotated::new(3200.0));
384378
let annotated_span: Annotated<EventSpan> = Annotated::new(event_span);
385379
insta::assert_json_snapshot!(SerializableAnnotated(&annotated_span), @r###"
386380
{
@@ -412,7 +406,6 @@ mod tests {
412406
}"#;
413407
let otel_span: OtelSpan = serde_json::from_str(json).unwrap();
414408
let event_span: EventSpan = otel_to_sentry_span(otel_span).unwrap();
415-
assert_eq!(event_span.exclusive_time, Annotated::new(0.0788));
416409
let annotated_span: Annotated<EventSpan> = Annotated::new(event_span);
417410
insta::assert_json_snapshot!(SerializableAnnotated(&annotated_span), @r###"
418411
{
@@ -464,13 +457,6 @@ mod tests {
464457
}"#;
465458
let otel_span: OtelSpan = serde_json::from_str(json).unwrap();
466459
let event_span: EventSpan = otel_to_sentry_span(otel_span).unwrap();
467-
assert_eq!(event_span.op, Annotated::new("database query".into()));
468-
assert_eq!(
469-
event_span.description,
470-
Annotated::new(
471-
"SELECT \"table\".\"col\" FROM \"table\" WHERE \"table\".\"col\" = %s".into()
472-
)
473-
);
474460
let annotated_span: Annotated<EventSpan> = Annotated::new(event_span);
475461
insta::assert_json_snapshot!(SerializableAnnotated(&annotated_span), @r###"
476462
{
@@ -529,11 +515,6 @@ mod tests {
529515
}"#;
530516
let otel_span: OtelSpan = serde_json::from_str(json).unwrap();
531517
let event_span: EventSpan = otel_to_sentry_span(otel_span).unwrap();
532-
assert_eq!(event_span.op, Annotated::new("database query".into()));
533-
assert_eq!(
534-
event_span.description,
535-
Annotated::new("index view query".into())
536-
);
537518
let annotated_span: Annotated<EventSpan> = Annotated::new(event_span);
538519
insta::assert_json_snapshot!(SerializableAnnotated(&annotated_span), @r###"
539520
{
@@ -580,11 +561,6 @@ mod tests {
580561
}"#;
581562
let otel_span: OtelSpan = serde_json::from_str(json).unwrap();
582563
let event_span: EventSpan = otel_to_sentry_span(otel_span).unwrap();
583-
assert_eq!(event_span.op, Annotated::new("http client request".into()));
584-
assert_eq!(
585-
event_span.description,
586-
Annotated::new("GET /api/search?q=foobar".into())
587-
);
588564
let annotated_span: Annotated<EventSpan> = Annotated::new(event_span);
589565
insta::assert_json_snapshot!(SerializableAnnotated(&annotated_span), @r###"
590566
{
@@ -777,7 +753,6 @@ mod tests {
777753
}"#;
778754
let otel_span: OtelSpan = serde_json::from_str(json).unwrap();
779755
let event_span: EventSpan = otel_to_sentry_span(otel_span).unwrap();
780-
assert_eq!(event_span.is_remote, Annotated::new(true));
781756
let annotated_span: Annotated<EventSpan> = Annotated::new(event_span);
782757
insta::assert_json_snapshot!(SerializableAnnotated(&annotated_span), @r###"
783758
{
@@ -808,7 +783,6 @@ mod tests {
808783
}"#;
809784
let otel_span: OtelSpan = serde_json::from_str(json).unwrap();
810785
let event_span: EventSpan = otel_to_sentry_span(otel_span).unwrap();
811-
assert_eq!(event_span.is_remote, Annotated::new(false));
812786
let annotated_span: Annotated<EventSpan> = Annotated::new(event_span);
813787
insta::assert_json_snapshot!(SerializableAnnotated(&annotated_span), @r###"
814788
{
@@ -839,8 +813,6 @@ mod tests {
839813
}"#;
840814
let otel_span: OtelSpan = serde_json::from_str(json).unwrap();
841815
let event_span: EventSpan = otel_to_sentry_span(otel_span).unwrap();
842-
let kind = event_span.kind.value().expect("kind should be set");
843-
assert_eq!(kind, &SpanKind::Client);
844816
let annotated_span: Annotated<EventSpan> = Annotated::new(event_span);
845817
insta::assert_json_snapshot!(SerializableAnnotated(&annotated_span), @r###"
846818
{
@@ -909,42 +881,6 @@ mod tests {
909881
let event_span: EventSpan = otel_to_sentry_span(otel_span).unwrap();
910882
let annotated_span: Annotated<EventSpan> = Annotated::new(event_span);
911883

912-
assert_eq!(
913-
get_path!(annotated_span.trace_id),
914-
Some(&Annotated::new(
915-
"3c79f60c11214eb38604f4ae0781bfb2".parse().unwrap()
916-
))
917-
);
918-
assert_eq!(
919-
get_path!(annotated_span.links[0].trace_id),
920-
Some(&Annotated::new(
921-
"4c79f60c11214eb38604f4ae0781bfb2".parse().unwrap()
922-
))
923-
);
924-
assert_eq!(
925-
get_path!(annotated_span.links[0].span_id),
926-
Some(&Annotated::new(SpanId("fa90fdead5f74052".into())))
927-
);
928-
assert_eq!(
929-
get_path!(annotated_span.links[0].attributes["str_key"]),
930-
Some(&Annotated::new(Value::String("str_value".into())))
931-
);
932-
assert_eq!(
933-
get_path!(annotated_span.links[0].attributes["bool_key"]),
934-
Some(&Annotated::new(Value::Bool(true)))
935-
);
936-
assert_eq!(
937-
get_path!(annotated_span.links[0].attributes["int_key"]),
938-
Some(&Annotated::new(Value::I64(123)))
939-
);
940-
assert_eq!(
941-
get_path!(annotated_span.links[0].attributes["double_key"]),
942-
Some(&Annotated::new(Value::F64(1.23)))
943-
);
944-
assert_eq!(
945-
get_path!(annotated_span.links[0].sampled),
946-
Some(&Annotated::new(true))
947-
);
948884
insta::assert_json_snapshot!(SerializableAnnotated(&annotated_span), @r###"
949885
{
950886
"timestamp": 0.0,

0 commit comments

Comments
 (0)