Skip to content

Commit 8601bd1

Browse files
committed
fix: remove panics in finished span reads
1 parent b80d612 commit 8601bd1

File tree

1 file changed

+48
-24
lines changed

1 file changed

+48
-24
lines changed

opentelemetry-sdk/src/trace/span.rs

Lines changed: 48 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -284,12 +284,6 @@ pub struct FinishedSpan {
284284
}
285285

286286
impl FinishedSpan {
287-
fn span_data_ref(&self) -> &crate::trace::SpanData {
288-
self.span
289-
.as_ref()
290-
.expect("Span data has already been consumed")
291-
}
292-
293287
/// Creates a new `FinishedSpan` with the given span data.
294288
pub fn new(span_data: crate::trace::SpanData) -> Self {
295289
FinishedSpan {
@@ -336,57 +330,87 @@ impl FinishedSpan {
336330

337331
impl ReadableSpan for FinishedSpan {
338332
fn context(&self) -> &SpanContext {
339-
&self.span_data_ref().span_context
333+
match self.span {
334+
Some(ref data) => &data.span_context,
335+
None => &SpanContext::NONE,
336+
}
340337
}
341338

342339
fn parent_span_id(&self) -> SpanId {
343-
self.span_data_ref().parent_span_id
340+
match self.span {
341+
Some(ref data) => data.parent_span_id,
342+
None => SpanId::INVALID,
343+
}
344344
}
345345

346346
fn span_kind(&self) -> SpanKind {
347-
self.span_data_ref().span_kind.clone()
347+
match self.span {
348+
Some(ref data) => data.span_kind.clone(),
349+
None => SpanKind::Internal,
350+
}
348351
}
349352

350353
fn name(&self) -> Option<&str> {
351-
Some(&self.span_data_ref().name)
354+
self.span.as_ref().map(|s| s.name.as_ref())
352355
}
353356
fn start_time(&self) -> Option<SystemTime> {
354-
Some(self.span_data_ref().start_time)
357+
self.span.as_ref().map(|s| s.start_time)
355358
}
356359
fn end_time(&self) -> Option<SystemTime> {
357-
Some(self.span_data_ref().end_time)
360+
self.span.as_ref().map(|s| s.end_time)
358361
}
359362
fn attributes(&self) -> &[KeyValue] {
360-
self.span_data_ref().attributes.as_slice()
363+
match self.span {
364+
Some(ref data) => data.attributes.as_slice(),
365+
None => &[],
366+
}
361367
}
362368
fn dropped_attributes_count(&self) -> u32 {
363-
self.span_data_ref().dropped_attributes_count
369+
match self.span {
370+
Some(ref data) => data.dropped_attributes_count,
371+
None => 0,
372+
}
364373
}
365374
fn events(&self) -> &[Event] {
366-
self.span_data_ref().events.events.as_slice()
375+
match self.span {
376+
Some(ref data) => data.events.events.as_slice(),
377+
None => &[],
378+
}
367379
}
368380
fn dropped_events_count(&self) -> u32 {
369-
self.span_data_ref().events.dropped_count
381+
match self.span {
382+
Some(ref data) => data.events.dropped_count,
383+
None => 0,
384+
}
370385
}
371386
fn links(&self) -> &[Link] {
372-
self.span_data_ref().links.links.as_slice()
387+
match self.span {
388+
Some(ref data) => data.links.links.as_slice(),
389+
None => &[],
390+
}
373391
}
392+
374393
fn dropped_links_count(&self) -> u32 {
375-
self.span_data_ref().links.dropped_count
394+
match self.span {
395+
Some(ref data) => data.links.dropped_count,
396+
None => 0,
397+
}
376398
}
377399
fn status(&self) -> &Status {
378-
&self.span_data_ref().status
400+
match self.span {
401+
Some(ref data) => &data.status,
402+
None => &Status::Unset,
403+
}
379404
}
380405
}
381406

382407
impl std::fmt::Debug for FinishedSpan {
383408
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
384409
let mut fmt = f.debug_struct("FinishedSpan");
385-
if self.is_consumed {
386-
fmt.field("consumed", &self.is_consumed);
387-
} else {
388-
fmt.field("span", &self.span_data_ref());
389-
}
410+
match &self.span {
411+
Some(s) if !self.is_consumed => fmt.field("span", s),
412+
_ => fmt.field("consumed", &self.is_consumed),
413+
};
390414
fmt.finish()
391415
}
392416
}

0 commit comments

Comments
 (0)