Skip to content

Commit ea298ec

Browse files
committed
retain empty tracer name
1 parent 9a8ad95 commit ea298ec

File tree

2 files changed

+47
-11
lines changed

2 files changed

+47
-11
lines changed

opentelemetry-sdk/src/trace/mod.rs

+43-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ mod tests {
4848

4949
use super::*;
5050
use crate::{
51-
testing::trace::InMemorySpanExporterBuilder,
51+
testing::trace::{InMemorySpanExporter, InMemorySpanExporterBuilder},
5252
trace::span_limit::{DEFAULT_MAX_EVENT_PER_SPAN, DEFAULT_MAX_LINKS_PER_SPAN},
5353
};
5454
use opentelemetry::trace::{
@@ -342,4 +342,46 @@ mod tests {
342342
.attributes()
343343
.eq(&[KeyValue::new("test_k", "test_v")]));
344344
}
345+
346+
#[tokio::test(flavor = "multi_thread", worker_threads = 1)]
347+
async fn empty_tracer_name_retained() {
348+
async fn tracer_name_retained_helper(
349+
tracer: super::Tracer,
350+
provider: TracerProvider,
351+
exporter: InMemorySpanExporter,
352+
) {
353+
// Act
354+
tracer.start("my_span").end();
355+
356+
// Force flush to ensure spans are exported
357+
provider.force_flush().into_iter().for_each(|result| {
358+
result.expect("failed to flush spans");
359+
});
360+
361+
// Assert
362+
let finished_spans = exporter
363+
.get_finished_spans()
364+
.expect("spans are expected to be exported.");
365+
assert_eq!(finished_spans.len(), 1, "There should be a single span");
366+
367+
let tracer_name = finished_spans[0].instrumentation_scope.name();
368+
assert_eq!(tracer_name, "", "The tracer name should be an empty string");
369+
370+
exporter.reset();
371+
}
372+
373+
let exporter = InMemorySpanExporter::default();
374+
let span_processor = SimpleSpanProcessor::new(Box::new(exporter.clone()));
375+
let tracer_provider = TracerProvider::builder()
376+
.with_span_processor(span_processor)
377+
.build();
378+
379+
// Test Tracer creation in 2 ways, both with empty string as tracer name
380+
let tracer1 = tracer_provider.tracer("");
381+
tracer_name_retained_helper(tracer1, tracer_provider.clone(), exporter.clone()).await;
382+
383+
let tracer_scope = InstrumentationScope::builder("").build();
384+
let tracer2 = tracer_provider.tracer_with_scope(tracer_scope);
385+
tracer_name_retained_helper(tracer2, tracer_provider, exporter).await;
386+
}
345387
}

opentelemetry-sdk/src/trace/provider.rs

+4-10
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@ use crate::trace::{
6868
use crate::Resource;
6969
use crate::{export::trace::SpanExporter, trace::SpanProcessor};
7070
use opentelemetry::trace::TraceError;
71-
use opentelemetry::InstrumentationScope;
7271
use opentelemetry::{otel_debug, trace::TraceResult};
72+
use opentelemetry::{otel_info, InstrumentationScope};
7373
use std::borrow::Cow;
7474
use std::sync::atomic::{AtomicBool, Ordering};
7575
use std::sync::{Arc, OnceLock};
@@ -252,20 +252,11 @@ impl TracerProvider {
252252
}
253253
}
254254

255-
/// Default tracer name if empty string is provided.
256-
const DEFAULT_COMPONENT_NAME: &str = "rust.opentelemetry.io/sdk/tracer";
257-
258255
impl opentelemetry::trace::TracerProvider for TracerProvider {
259256
/// This implementation of `TracerProvider` produces `Tracer` instances.
260257
type Tracer = Tracer;
261258

262259
fn tracer(&self, name: impl Into<Cow<'static, str>>) -> Self::Tracer {
263-
let mut name = name.into();
264-
265-
if name.is_empty() {
266-
name = Cow::Borrowed(DEFAULT_COMPONENT_NAME)
267-
};
268-
269260
let scope = InstrumentationScope::builder(name).build();
270261
self.tracer_with_scope(scope)
271262
}
@@ -274,6 +265,9 @@ impl opentelemetry::trace::TracerProvider for TracerProvider {
274265
if self.inner.is_shutdown.load(Ordering::Relaxed) {
275266
return Tracer::new(scope, noop_tracer_provider().clone());
276267
}
268+
if scope.name().is_empty() {
269+
otel_info!(name: "TracerNameEmpty", message = "Tracer name is empty; consider providing a meaningful name. Tracer will function normally and the provided name will be used as-is.");
270+
};
277271
Tracer::new(scope, self.clone())
278272
}
279273
}

0 commit comments

Comments
 (0)