1+ use std:: borrow:: Cow ;
2+
13use opentelemetry:: KeyValue ;
24// use opentelemetry_resource_detectors::OsResourceDetector;
35use opentelemetry_sdk:: { Resource , resource:: ResourceDetector } ;
@@ -16,37 +18,43 @@ use opentelemetry_semantic_conventions::resource;
1618/// ```
1719#[ derive( Debug , Default , Clone ) ]
1820pub struct DetectResource {
19- fallback_service_name : Option < & ' static str > ,
20- fallback_service_version : Option < & ' static str > ,
21+ fallback_service_name : Option < Cow < ' static , str > > ,
22+ fallback_service_version : Option < Cow < ' static , str > > ,
2123}
2224
2325impl DetectResource {
2426 /// `service.name` is first extracted from environment variables
2527 /// (in this order) `OTEL_SERVICE_NAME`, `SERVICE_NAME`, `APP_NAME`.
2628 /// But a default value can be provided with this method.
2729 #[ must_use]
28- pub fn with_fallback_service_name ( mut self , fallback_service_name : & ' static str ) -> Self {
29- self . fallback_service_name = Some ( fallback_service_name) ;
30+ pub fn with_fallback_service_name (
31+ mut self ,
32+ fallback_service_name : impl Into < Cow < ' static , str > > ,
33+ ) -> Self {
34+ self . fallback_service_name = Some ( fallback_service_name. into ( ) ) ;
3035 self
3136 }
3237
3338 /// `service.name` is first extracted from environment variables
3439 /// (in this order) `SERVICE_VERSION`, `APP_VERSION`.
3540 /// But a default value can be provided with this method.
3641 #[ must_use]
37- pub fn with_fallback_service_version ( mut self , fallback_service_version : & ' static str ) -> Self {
38- self . fallback_service_version = Some ( fallback_service_version) ;
42+ pub fn with_fallback_service_version (
43+ mut self ,
44+ fallback_service_version : impl Into < Cow < ' static , str > > ,
45+ ) -> Self {
46+ self . fallback_service_version = Some ( fallback_service_version. into ( ) ) ;
3947 self
4048 }
4149
4250 #[ must_use]
43- pub fn build ( & mut self ) -> Resource {
51+ pub fn build ( self ) -> Resource {
4452 //Box::new(OsResourceDetector), //FIXME enable when available for opentelemetry >= 0.25
4553 //Box::new(ProcessResourceDetector),
4654 let rsrc = Resource :: builder ( )
4755 . with_detector ( Box :: new ( ServiceInfoDetector {
48- fallback_service_name : self . fallback_service_name . take ( ) ,
49- fallback_service_version : self . fallback_service_version . take ( ) ,
56+ fallback_service_name : self . fallback_service_name ,
57+ fallback_service_version : self . fallback_service_version ,
5058 } ) )
5159 . build ( ) ;
5260 debug_resource ( & rsrc) ;
@@ -62,8 +70,8 @@ pub fn debug_resource(rsrc: &Resource) {
6270
6371#[ derive( Debug ) ]
6472pub struct ServiceInfoDetector {
65- fallback_service_name : Option < & ' static str > ,
66- fallback_service_version : Option < & ' static str > ,
73+ fallback_service_name : Option < Cow < ' static , str > > ,
74+ fallback_service_version : Option < Cow < ' static , str > > ,
6775}
6876
6977impl ResourceDetector for ServiceInfoDetector {
@@ -72,17 +80,15 @@ impl ResourceDetector for ServiceInfoDetector {
7280 . or_else ( |_| std:: env:: var ( "SERVICE_NAME" ) )
7381 . or_else ( |_| std:: env:: var ( "APP_NAME" ) )
7482 . ok ( )
75- . or_else ( || {
76- self . fallback_service_name
77- . map ( std:: string:: ToString :: to_string)
78- } )
83+ . or_else ( || self . fallback_service_name . clone ( ) . map ( |v| v. to_string ( ) ) )
7984 . map ( |v| KeyValue :: new ( resource:: SERVICE_NAME , v) ) ;
8085 let service_version = std:: env:: var ( "SERVICE_VERSION" )
8186 . or_else ( |_| std:: env:: var ( "APP_VERSION" ) )
8287 . ok ( )
8388 . or_else ( || {
8489 self . fallback_service_version
85- . map ( std:: string:: ToString :: to_string)
90+ . clone ( )
91+ . map ( std:: borrow:: Cow :: into_owned)
8692 } )
8793 . map ( |v| KeyValue :: new ( resource:: SERVICE_VERSION , v) ) ;
8894 let mut resource = Resource :: builder_empty ( ) ;
0 commit comments