@@ -16,9 +16,11 @@ use opentelemetry::{
16
16
} ;
17
17
use opentelemetry_otlp:: { WithExportConfig , WithHttpConfig , WithTonicConfig } ;
18
18
use opentelemetry_sdk:: {
19
+ Resource ,
19
20
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
+ } ,
22
24
} ;
23
25
use std:: { collections:: HashMap , net:: SocketAddr , sync:: Arc , time:: Duration } ;
24
26
use temporal_sdk_core_api:: telemetry:: {
@@ -35,10 +37,7 @@ use tonic::{metadata::MetadataMap, transport::ClientTlsConfig};
35
37
/// A specialized `Result` type for metric operations.
36
38
type Result < T > = std:: result:: Result < T , MetricError > ;
37
39
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 > > {
42
41
let buckets = default_buckets_for ( metric_name, use_seconds) ;
43
42
new_view (
44
43
Instrument :: new ( ) . name ( format ! ( "*{metric_name}" ) ) ,
@@ -128,18 +127,15 @@ pub fn build_otlp_metric_exporter(
128
127
}
129
128
exporter
130
129
. 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 ( ) ?
134
132
}
135
133
OtlpProtocol :: Http => opentelemetry_otlp:: HttpExporterBuilder :: default ( )
136
134
. with_endpoint ( opts. url . to_string ( ) )
137
135
. 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 ) ) ?,
141
137
} ;
142
- let reader = PeriodicReader :: builder ( exporter, runtime :: Tokio )
138
+ let reader = PeriodicReader :: builder ( exporter)
143
139
. with_interval ( opts. metric_periodicity )
144
140
. build ( ) ;
145
141
let mp = augment_meter_provider_with_defaults (
@@ -301,14 +297,25 @@ fn default_resource_instance() -> &'static Resource {
301
297
302
298
static INSTANCE : OnceLock < Resource > = OnceLock :: new ( ) ;
303
299
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" ) ) {
306
302
// otel spec recommends to leave service.name as unknown_service but we want to
307
303
// 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 ( ) ;
312
319
}
313
320
resource
314
321
} )
@@ -318,9 +325,19 @@ fn default_resource(override_values: &HashMap<String, String>) -> Resource {
318
325
let override_kvs = override_values
319
326
. iter ( )
320
327
. 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 ( )
324
341
}
325
342
326
343
fn metric_temporality_to_temporality ( t : MetricTemporality ) -> Temporality {
@@ -338,7 +355,7 @@ pub(crate) mod tests {
338
355
#[ test]
339
356
pub ( crate ) fn default_resource_instance_service_name_default ( ) {
340
357
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" ) ) ;
342
359
assert_eq ! ( service_name, Some ( Value :: from( TELEM_SERVICE_NAME ) ) ) ;
343
360
}
344
361
}
0 commit comments