@@ -16,9 +16,11 @@ use opentelemetry::{
1616} ;
1717use opentelemetry_otlp:: { WithExportConfig , WithHttpConfig , WithTonicConfig } ;
1818use opentelemetry_sdk:: {
19+ Resource ,
1920 metrics:: {
20- new_view, Temporality , Aggregation , Instrument , InstrumentKind , MeterProviderBuilder , MetricError , PeriodicReader , SdkMeterProvider , View
21- } , runtime, Resource
21+ Aggregation , Instrument , InstrumentKind , MeterProviderBuilder , MetricError , PeriodicReader ,
22+ SdkMeterProvider , Temporality , View , new_view,
23+ } ,
2224} ;
2325use std:: { collections:: HashMap , net:: SocketAddr , sync:: Arc , time:: Duration } ;
2426use temporal_sdk_core_api:: telemetry:: {
@@ -35,10 +37,7 @@ use tonic::{metadata::MetadataMap, transport::ClientTlsConfig};
3537/// A specialized `Result` type for metric operations.
3638type Result < T > = std:: result:: Result < T , MetricError > ;
3739
38- fn histo_view (
39- metric_name : & ' static str ,
40- use_seconds : bool ,
41- ) -> Result < Box < dyn View > > {
40+ fn histo_view ( metric_name : & ' static str , use_seconds : bool ) -> Result < Box < dyn View > > {
4241 let buckets = default_buckets_for ( metric_name, use_seconds) ;
4342 new_view (
4443 Instrument :: new ( ) . name ( format ! ( "*{metric_name}" ) ) ,
@@ -128,18 +127,15 @@ pub fn build_otlp_metric_exporter(
128127 }
129128 exporter
130129 . with_metadata ( MetadataMap :: from_headers ( ( & opts. headers ) . try_into ( ) ?) )
131- . with_temporality ( metric_temporality_to_temporality (
132- opts. metric_temporality ,
133- ) ) . build ( ) ?
130+ . with_temporality ( metric_temporality_to_temporality ( opts. metric_temporality ) )
131+ . build ( ) ?
134132 }
135133 OtlpProtocol :: Http => opentelemetry_otlp:: HttpExporterBuilder :: default ( )
136134 . with_endpoint ( opts. url . to_string ( ) )
137135 . with_headers ( opts. headers )
138- . build_metrics_exporter ( metric_temporality_to_temporality (
139- opts. metric_temporality ,
140- ) ) ?,
136+ . build_metrics_exporter ( metric_temporality_to_temporality ( opts. metric_temporality ) ) ?,
141137 } ;
142- let reader = PeriodicReader :: builder ( exporter, runtime :: Tokio )
138+ let reader = PeriodicReader :: builder ( exporter)
143139 . with_interval ( opts. metric_periodicity )
144140 . build ( ) ;
145141 let mp = augment_meter_provider_with_defaults (
@@ -301,14 +297,25 @@ fn default_resource_instance() -> &'static Resource {
301297
302298 static INSTANCE : OnceLock < Resource > = OnceLock :: new ( ) ;
303299 INSTANCE . get_or_init ( || {
304- let resource = Resource :: default ( ) ;
305- if resource. get ( Key :: from ( "service.name" ) ) == Some ( Value :: from ( "unknown_service" ) ) {
300+ let resource = Resource :: builder ( ) . build ( ) ;
301+ if resource. get ( & Key :: from ( "service.name" ) ) == Some ( Value :: from ( "unknown_service" ) ) {
306302 // otel spec recommends to leave service.name as unknown_service but we want to
307303 // maintain backwards compatability with existing library behaviour
308- return resource. merge ( & Resource :: new ( [ KeyValue :: new (
309- "service.name" ,
310- TELEM_SERVICE_NAME ,
311- ) ] ) ) ;
304+ let compat = Resource :: builder ( )
305+ . with_attribute ( KeyValue :: new ( "service.name" , TELEM_SERVICE_NAME ) )
306+ . build ( ) ;
307+ return Resource :: builder_empty ( )
308+ . with_attributes (
309+ resource
310+ . iter ( )
311+ . map ( |( k, v) | KeyValue :: new ( k. clone ( ) , v. clone ( ) ) ) ,
312+ )
313+ . with_attributes (
314+ compat
315+ . iter ( )
316+ . map ( |( k, v) | KeyValue :: new ( k. clone ( ) , v. clone ( ) ) ) ,
317+ )
318+ . build ( ) ;
312319 }
313320 resource
314321 } )
@@ -318,9 +325,19 @@ fn default_resource(override_values: &HashMap<String, String>) -> Resource {
318325 let override_kvs = override_values
319326 . iter ( )
320327 . map ( |( k, v) | KeyValue :: new ( k. clone ( ) , v. clone ( ) ) ) ;
321- default_resource_instance ( )
322- . clone ( )
323- . merge ( & Resource :: new ( override_kvs) )
328+ let override_resource = Resource :: builder ( ) . with_attributes ( override_kvs) . build ( ) ;
329+ Resource :: builder_empty ( )
330+ . with_attributes (
331+ default_resource_instance ( )
332+ . iter ( )
333+ . map ( |( k, v) | KeyValue :: new ( k. clone ( ) , v. clone ( ) ) ) ,
334+ )
335+ . with_attributes (
336+ override_resource
337+ . iter ( )
338+ . map ( |( k, v) | KeyValue :: new ( k. clone ( ) , v. clone ( ) ) ) ,
339+ )
340+ . build ( )
324341}
325342
326343fn metric_temporality_to_temporality ( t : MetricTemporality ) -> Temporality {
@@ -338,7 +355,7 @@ pub(crate) mod tests {
338355 #[ test]
339356 pub ( crate ) fn default_resource_instance_service_name_default ( ) {
340357 let resource = default_resource_instance ( ) ;
341- let service_name = resource. get ( Key :: from ( "service.name" ) ) ;
358+ let service_name = resource. get ( & Key :: from ( "service.name" ) ) ;
342359 assert_eq ! ( service_name, Some ( Value :: from( TELEM_SERVICE_NAME ) ) ) ;
343360 }
344361}
0 commit comments