Skip to content

Commit ddcf5f9

Browse files
committed
nit: add test coverage for ReadableSpan implementation
1 parent 4f9b012 commit ddcf5f9

File tree

1 file changed

+104
-16
lines changed

1 file changed

+104
-16
lines changed

opentelemetry-sdk/src/trace/span.rs

Lines changed: 104 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ impl Drop for Span {
269269
/// use opentelemetry_sdk::trace::{FinishedSpan, ReadableSpan};
270270
/// fn on_end(span: &mut FinishedSpan) {
271271
/// // Read the span data without consuming it
272-
/// if span.name() != "my_span" {
272+
/// if span.name() != Some("my_span") {
273273
/// return;
274274
/// }
275275
/// // Consume the span data, potentially cloning it
@@ -342,7 +342,7 @@ impl ReadableSpan for FinishedSpan {
342342
}
343343

344344
fn name(&self) -> Option<&str> {
345-
Some(&self.span.as_ref()?.name)
345+
Some(&self.span_data_ref().name)
346346
}
347347
fn start_time(&self) -> Option<SystemTime> {
348348
Some(self.span_data_ref().start_time)
@@ -558,9 +558,9 @@ mod tests {
558558
DEFAULT_MAX_ATTRIBUTES_PER_EVENT, DEFAULT_MAX_ATTRIBUTES_PER_LINK,
559559
DEFAULT_MAX_ATTRIBUTES_PER_SPAN, DEFAULT_MAX_EVENT_PER_SPAN, DEFAULT_MAX_LINKS_PER_SPAN,
560560
};
561-
use crate::trace::{SpanEvents, SpanLinks, SpanProcessor};
561+
use crate::trace::{SdkTracer, SpanEvents, SpanLinks, SpanProcessor};
562562
use opentelemetry::trace::{
563-
self, Span as _, SpanBuilder, TraceFlags, TraceId, Tracer, TracerProvider,
563+
self, SamplingResult, Span as _, SpanBuilder, TraceFlags, TraceId, Tracer, TracerProvider,
564564
};
565565
use std::time::Duration;
566566
use std::vec;
@@ -989,6 +989,82 @@ mod tests {
989989
assert_eq!(event_vec.len(), DEFAULT_MAX_EVENT_PER_SPAN as usize);
990990
}
991991

992+
fn make_test_span(tracer: &SdkTracer, sampling_decision: trace::SamplingDecision) -> Span {
993+
tracer
994+
.span_builder("test_span")
995+
.with_sampling_result(SamplingResult {
996+
decision: sampling_decision,
997+
attributes: vec![],
998+
trace_state: Default::default(),
999+
})
1000+
.with_attributes(vec![KeyValue::new("k", "v")])
1001+
.with_kind(SpanKind::Client)
1002+
.with_events(vec![Event::with_name("test_event")])
1003+
.with_links(vec![Link::with_context(SpanContext::new(
1004+
TraceId::from_bytes((1234_u128).to_ne_bytes()),
1005+
SpanId::from_bytes((5678_u64).to_ne_bytes()),
1006+
Default::default(),
1007+
false,
1008+
Default::default(),
1009+
))])
1010+
.with_span_id(SpanId::from_bytes((1337_u64).to_ne_bytes()))
1011+
.start(tracer)
1012+
}
1013+
1014+
#[test]
1015+
fn test_readable_span() {
1016+
use super::ReadableSpan;
1017+
1018+
let provider = crate::trace::SdkTracerProvider::builder()
1019+
.with_simple_exporter(NoopSpanExporter::new())
1020+
.build();
1021+
let tracer = provider.tracer("test");
1022+
{
1023+
// ReadableSpan trait methods for recording span
1024+
let span = make_test_span(&tracer, trace::SamplingDecision::RecordOnly);
1025+
1026+
assert_eq!(
1027+
span.context().span_id(),
1028+
SpanId::from_bytes((1337_u64).to_ne_bytes())
1029+
);
1030+
1031+
assert_eq!(span.name(), Some("test_span"));
1032+
assert_eq!(span.span_kind(), SpanKind::Client);
1033+
assert!(span.start_time().is_some());
1034+
assert!(span.end_time().is_some());
1035+
assert_eq!(span.attributes(), &[KeyValue::new("k", "v")]);
1036+
assert_eq!(span.dropped_attributes_count(), 0);
1037+
assert_eq!(span.events().len(), 1);
1038+
assert_eq!(span.events()[0].name, "test_event");
1039+
assert_eq!(span.dropped_events_count(), 0);
1040+
assert_eq!(span.links().len(), 1);
1041+
}
1042+
1043+
{
1044+
// ReadableSpan trait methods for non-recording span
1045+
let span = make_test_span(&tracer, trace::SamplingDecision::Drop);
1046+
1047+
assert_eq!(
1048+
span.context().span_id(),
1049+
SpanId::from_bytes((1337_u64).to_ne_bytes())
1050+
);
1051+
1052+
assert_eq!(span.name(), None);
1053+
assert_eq!(span.span_kind(), SpanKind::Internal);
1054+
assert!(span.start_time().is_none());
1055+
assert!(span.end_time().is_none());
1056+
assert_eq!(span.attributes(), &[]);
1057+
assert_eq!(span.dropped_attributes_count(), 0);
1058+
assert_eq!(span.events().len(), 0);
1059+
assert_eq!(span.dropped_events_count(), 0);
1060+
assert_eq!(span.links().len(), 0);
1061+
assert_eq!(
1062+
span.context().span_id(),
1063+
SpanId::from_bytes((1337_u64).to_ne_bytes())
1064+
);
1065+
}
1066+
}
1067+
9921068
#[test]
9931069
fn test_span_exported_data() {
9941070
let provider = crate::trace::SdkTracerProvider::builder()
@@ -1018,11 +1094,22 @@ mod tests {
10181094
struct TestSpanProcessor;
10191095
impl SpanProcessor for TestSpanProcessor {
10201096
fn on_end(&self, span: &mut FinishedSpan) {
1021-
let parent_id = span.parent_span_id();
1022-
let name = span.name();
1097+
assert_eq!(
1098+
span.context().span_id(),
1099+
SpanId::from_bytes((1337_u64).to_ne_bytes())
1100+
);
1101+
1102+
assert_eq!(span.name(), Some("test_span"));
1103+
assert_eq!(span.span_kind(), SpanKind::Client);
1104+
assert!(span.start_time().is_some());
1105+
assert!(span.end_time().is_some());
1106+
assert_eq!(span.attributes(), &[KeyValue::new("k", "v")]);
1107+
assert_eq!(span.dropped_attributes_count(), 0);
1108+
assert_eq!(span.events().len(), 1);
1109+
assert_eq!(span.events()[0].name, "test_event");
1110+
assert_eq!(span.dropped_events_count(), 0);
1111+
assert_eq!(span.links().len(), 1);
10231112

1024-
assert_eq!(name, Some("test_span"));
1025-
assert_eq!(parent_id, SpanId::INVALID);
10261113
let _ = span.consume();
10271114
}
10281115

@@ -1040,10 +1127,10 @@ mod tests {
10401127
let provider = crate::trace::SdkTracerProvider::builder()
10411128
.with_span_processor(TestSpanProcessor)
10421129
.build();
1043-
let tracer = provider.tracer("test");
1044-
{
1045-
tracer.start("test_span");
1046-
}
1130+
drop(make_test_span(
1131+
&provider.tracer("test"),
1132+
trace::SamplingDecision::RecordAndSample,
1133+
));
10471134
let res = provider.shutdown();
10481135
println!("{:?}", res);
10491136
assert!(res.is_ok());
@@ -1075,10 +1162,11 @@ mod tests {
10751162
let provider = crate::trace::SdkTracerProvider::builder()
10761163
.with_span_processor(TestSpanProcessor)
10771164
.build();
1078-
let tracer = provider.tracer("test");
1079-
{
1080-
tracer.start("test_span");
1081-
}
1165+
drop(make_test_span(
1166+
&provider.tracer("test"),
1167+
trace::SamplingDecision::RecordAndSample,
1168+
));
1169+
10821170
let res = provider.shutdown();
10831171
println!("{:?}", res);
10841172
assert!(res.is_ok());

0 commit comments

Comments
 (0)