Skip to content

Commit

Permalink
opentelemetry: slightly improve OpentemetrySubscriber's performance…
Browse files Browse the repository at this point in the history
… by pre-determined the attribute length
  • Loading branch information
Folyd committed Mar 27, 2021
1 parent 0e8f920 commit 97689bf
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 20 deletions.
6 changes: 6 additions & 0 deletions tracing-core/src/span.rs
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,12 @@ impl<'a> Attributes<'a> {
pub fn is_empty(&self) -> bool {
self.values.is_empty()
}

/// Returns the number of fields in this `Attributes`.
#[inline]
pub fn len(&self) -> usize {
self.values.field_set().len()
}
}

// ===== impl Record =====
Expand Down
32 changes: 12 additions & 20 deletions tracing-opentelemetry/src/subscriber.rs
Original file line number Diff line number Diff line change
Expand Up @@ -171,29 +171,28 @@ impl<'a> field::Visit for SpanEventVisitor<'a> {

struct SpanAttributeVisitor<'a>(&'a mut otel::SpanBuilder);

impl<'a> SpanAttributeVisitor<'a> {
fn record(&mut self, attribute: KeyValue) {
debug_assert!(self.0.attributes.is_some());
self.0.attributes.as_mut().map(|v| v.push(attribute));
}
}

impl<'a> field::Visit for SpanAttributeVisitor<'a> {
/// Set attributes on the underlying OpenTelemetry [`Span`] from `bool` values.
///
/// [`Span`]: opentelemetry::trace::Span
fn record_bool(&mut self, field: &field::Field, value: bool) {
let attribute = KeyValue::new(field.name(), value);
if let Some(attributes) = &mut self.0.attributes {
attributes.push(attribute);
} else {
self.0.attributes = Some(vec![attribute]);
}
self.record(attribute);
}

/// Set attributes on the underlying OpenTelemetry [`Span`] from `i64` values.
///
/// [`Span`]: opentelemetry::trace::Span
fn record_i64(&mut self, field: &field::Field, value: i64) {
let attribute = KeyValue::new(field.name(), value);
if let Some(attributes) = &mut self.0.attributes {
attributes.push(attribute);
} else {
self.0.attributes = Some(vec![attribute]);
}
self.record(attribute);
}

/// Set attributes on the underlying OpenTelemetry [`Span`] from `&str` values.
Expand All @@ -206,11 +205,7 @@ impl<'a> field::Visit for SpanAttributeVisitor<'a> {
self.0.span_kind = str_to_span_kind(value);
} else {
let attribute = KeyValue::new(field.name(), value.to_string());
if let Some(attributes) = &mut self.0.attributes {
attributes.push(attribute);
} else {
self.0.attributes = Some(vec![attribute]);
}
self.record(attribute);
}
}

Expand All @@ -225,11 +220,7 @@ impl<'a> field::Visit for SpanAttributeVisitor<'a> {
self.0.span_kind = str_to_span_kind(&format!("{:?}", value));
} else {
let attribute = Key::new(field.name()).string(format!("{:?}", value));
if let Some(attributes) = &mut self.0.attributes {
attributes.push(attribute);
} else {
self.0.attributes = Some(vec![attribute]);
}
self.record(attribute);
}
}
}
Expand Down Expand Up @@ -418,6 +409,7 @@ where
builder.trace_id = Some(self.tracer.new_trace_id());
}

builder.attributes = Some(Vec::with_capacity(attrs.len()));
attrs.record(&mut SpanAttributeVisitor(&mut builder));
extensions.insert(builder);
}
Expand Down

0 comments on commit 97689bf

Please sign in to comment.