Skip to content

Commit f76f68a

Browse files
authored
fix: ServiceName default should include executable name (#3302)
1 parent 7ad3325 commit f76f68a

File tree

5 files changed

+112
-44
lines changed

5 files changed

+112
-44
lines changed

opentelemetry-sdk/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
## vNext
44

5+
- Fix `service.name` Resource attribute fallback to follow OpenTelemetry
6+
specification by using `unknown_service:<process.executable.name>` format when
7+
service name is not explicitly configured. Previously, it only used
8+
`unknown_service`.
59
- Fix `SpanExporter::shutdown()` default timeout from 5 nanoseconds to 5 seconds.
610
- **Breaking** `SpanExporter` trait methods `shutdown`, `shutdown_with_timeout`, and `force_flush` now take `&self` instead of `&mut self` for consistency with `LogExporter` and `PushMetricExporter`. Implementers using interior mutability (e.g., `Mutex`, `AtomicBool`) require no changes.
711
- Added `Resource::get_ref(&self, key: &Key) -> Option<&Value>` to allow retrieving a reference to a resource value without cloning.

opentelemetry-sdk/src/logs/logger_provider.rs

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -477,11 +477,15 @@ mod tests {
477477
let _ = super::SdkLoggerProvider::builder()
478478
.with_log_processor(processor_with_resource.clone())
479479
.build();
480-
assert_resource(
481-
&processor_with_resource,
482-
&exporter_with_resource,
483-
SERVICE_NAME,
484-
Some("unknown_service"),
480+
let service_name = processor_with_resource
481+
.resource()
482+
.get(&Key::from_static_str(SERVICE_NAME))
483+
.map(|v| v.to_string())
484+
.unwrap();
485+
assert!(
486+
service_name.starts_with("unknown_service:opentelemetry_sdk-"),
487+
"Expected service name to start with 'unknown_service:opentelemetry_sdk-', got: {}",
488+
service_name
485489
);
486490
assert_telemetry_resource(&processor_with_resource, &exporter_with_resource);
487491
});
@@ -516,11 +520,15 @@ mod tests {
516520
let _ = super::SdkLoggerProvider::builder()
517521
.with_log_processor(processor_with_resource.clone())
518522
.build();
519-
assert_resource(
520-
&processor_with_resource,
521-
&exporter_with_resource,
522-
SERVICE_NAME,
523-
Some("unknown_service"),
523+
let service_name = processor_with_resource
524+
.resource()
525+
.get(&Key::from_static_str(SERVICE_NAME))
526+
.map(|v| v.to_string())
527+
.unwrap();
528+
assert!(
529+
service_name.starts_with("unknown_service:opentelemetry_sdk-"),
530+
"Expected service name to start with 'unknown_service:opentelemetry_sdk-', got: {}",
531+
service_name
524532
);
525533
assert_resource(
526534
&processor_with_resource,
@@ -558,11 +566,15 @@ mod tests {
558566
)
559567
.with_log_processor(processor_with_resource.clone())
560568
.build();
561-
assert_resource(
562-
&processor_with_resource,
563-
&exporter_with_resource,
564-
SERVICE_NAME,
565-
Some("unknown_service"),
569+
let service_name = processor_with_resource
570+
.resource()
571+
.get(&Key::from_static_str(SERVICE_NAME))
572+
.map(|v| v.to_string())
573+
.unwrap();
574+
assert!(
575+
service_name.starts_with("unknown_service:opentelemetry_sdk-"),
576+
"Expected service name to start with 'unknown_service:opentelemetry_sdk-', got: {}",
577+
service_name
566578
);
567579
assert_resource(
568580
&processor_with_resource,

opentelemetry-sdk/src/metrics/meter_provider.rs

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -461,10 +461,15 @@ mod tests {
461461
let default_meter_provider = super::SdkMeterProvider::builder()
462462
.with_reader(reader)
463463
.build();
464-
assert_resource(
465-
&default_meter_provider,
466-
SERVICE_NAME,
467-
Some("unknown_service"),
464+
let service_name = default_meter_provider.inner.pipes.0[0]
465+
.resource
466+
.get(&Key::from_static_str(SERVICE_NAME))
467+
.map(|v| v.to_string())
468+
.unwrap();
469+
assert!(
470+
service_name.starts_with("unknown_service:opentelemetry_sdk-"),
471+
"Expected service name to start with 'unknown_service:opentelemetry_sdk-', got: {}",
472+
service_name
468473
);
469474
assert_telemetry_resource(&default_meter_provider);
470475
});
@@ -491,10 +496,15 @@ mod tests {
491496
let env_resource_provider = super::SdkMeterProvider::builder()
492497
.with_reader(reader3)
493498
.build();
494-
assert_resource(
495-
&env_resource_provider,
496-
SERVICE_NAME,
497-
Some("unknown_service"),
499+
let service_name = env_resource_provider.inner.pipes.0[0]
500+
.resource
501+
.get(&Key::from_static_str(SERVICE_NAME))
502+
.map(|v| v.to_string())
503+
.unwrap();
504+
assert!(
505+
service_name.starts_with("unknown_service:opentelemetry_sdk-"),
506+
"Expected service name to start with 'unknown_service:opentelemetry_sdk-', got: {}",
507+
service_name
498508
);
499509
assert_resource(&env_resource_provider, "key1", Some("value1"));
500510
assert_resource(&env_resource_provider, "k3", Some("value2"));
@@ -520,10 +530,15 @@ mod tests {
520530
.build(),
521531
)
522532
.build();
523-
assert_resource(
524-
&user_provided_resource_config_provider,
525-
SERVICE_NAME,
526-
Some("unknown_service"),
533+
let service_name = user_provided_resource_config_provider.inner.pipes.0[0]
534+
.resource
535+
.get(&Key::from_static_str(SERVICE_NAME))
536+
.map(|v| v.to_string())
537+
.unwrap();
538+
assert!(
539+
service_name.starts_with("unknown_service:opentelemetry_sdk-"),
540+
"Expected service name to start with 'unknown_service:opentelemetry_sdk-', got: {}",
541+
service_name
527542
);
528543
assert_resource(
529544
&user_provided_resource_config_provider,

opentelemetry-sdk/src/resource/env.rs

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,19 @@ impl ResourceDetector for SdkProvidedResourceDetector {
8686
.detect()
8787
.get(&Key::new(super::SERVICE_NAME))
8888
})
89-
.unwrap_or_else(|| "unknown_service".into()),
89+
.unwrap_or_else(|| {
90+
// Fallback to unknown_service:<process.executable.name> per spec
91+
// https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/resource/sdk.md#sdk-provided-resource-attributes
92+
env::current_exe()
93+
.ok()
94+
.and_then(|path| {
95+
path.file_name()
96+
.and_then(|name| name.to_str())
97+
.map(|name| format!("unknown_service:{}", name))
98+
})
99+
.unwrap_or_else(|| "unknown_service".to_string())
100+
.into()
101+
}),
90102
)])
91103
.build()
92104
}
@@ -135,11 +147,18 @@ mod tests {
135147

136148
#[test]
137149
fn test_sdk_provided_resource_detector() {
138-
// Ensure no env var set
150+
// Ensure no env var set - should fallback to unknown_service:<executable_name>
151+
// For cargo tests, the executable name is typically <crate_name>-<hash>
139152
let no_env = SdkProvidedResourceDetector.detect();
140-
assert_eq!(
141-
no_env.get(&Key::from_static_str(crate::resource::SERVICE_NAME)),
142-
Some(Value::from("unknown_service")),
153+
let service_name = no_env
154+
.get(&Key::from_static_str(crate::resource::SERVICE_NAME))
155+
.map(|v| v.to_string())
156+
.unwrap();
157+
158+
assert!(
159+
service_name.starts_with("unknown_service:opentelemetry_sdk-"),
160+
"Expected service name to start with 'unknown_service:opentelemetry_sdk-', got: {}",
161+
service_name
143162
);
144163

145164
temp_env::with_var(OTEL_SERVICE_NAME, Some("test service"), || {

opentelemetry-sdk/src/trace/provider.rs

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -606,10 +606,16 @@ mod tests {
606606
// If users didn't provide a resource and there isn't a env var set. Use default one.
607607
temp_env::with_var_unset("OTEL_RESOURCE_ATTRIBUTES", || {
608608
let default_config_provider = super::SdkTracerProvider::builder().build();
609-
assert_resource(
610-
&default_config_provider,
611-
SERVICE_NAME,
612-
Some("unknown_service"),
609+
let service_name = default_config_provider
610+
.config()
611+
.resource
612+
.get(&Key::from_static_str(SERVICE_NAME))
613+
.map(|v| v.to_string())
614+
.unwrap();
615+
assert!(
616+
service_name.starts_with("unknown_service:opentelemetry_sdk-"),
617+
"Expected service name to start with 'unknown_service:opentelemetry_sdk-', got: {}",
618+
service_name
613619
);
614620
assert_telemetry_resource(&default_config_provider);
615621
});
@@ -631,10 +637,16 @@ mod tests {
631637
Some("key1=value1, k2, k3=value2"),
632638
|| {
633639
let env_resource_provider = super::SdkTracerProvider::builder().build();
634-
assert_resource(
635-
&env_resource_provider,
636-
SERVICE_NAME,
637-
Some("unknown_service"),
640+
let service_name = env_resource_provider
641+
.config()
642+
.resource
643+
.get(&Key::from_static_str(SERVICE_NAME))
644+
.map(|v| v.to_string())
645+
.unwrap();
646+
assert!(
647+
service_name.starts_with("unknown_service:opentelemetry_sdk-"),
648+
"Expected service name to start with 'unknown_service:opentelemetry_sdk-', got: {}",
649+
service_name
638650
);
639651
assert_resource(&env_resource_provider, "key1", Some("value1"));
640652
assert_resource(&env_resource_provider, "k3", Some("value2"));
@@ -658,10 +670,16 @@ mod tests {
658670
.build(),
659671
)
660672
.build();
661-
assert_resource(
662-
&user_provided_resource_config_provider,
663-
SERVICE_NAME,
664-
Some("unknown_service"),
673+
let service_name = user_provided_resource_config_provider
674+
.config()
675+
.resource
676+
.get(&Key::from_static_str(SERVICE_NAME))
677+
.map(|v| v.to_string())
678+
.unwrap();
679+
assert!(
680+
service_name.starts_with("unknown_service:opentelemetry_sdk-"),
681+
"Expected service name to start with 'unknown_service:opentelemetry_sdk-', got: {}",
682+
service_name
665683
);
666684
assert_resource(
667685
&user_provided_resource_config_provider,

0 commit comments

Comments
 (0)