2828//! let counter = meter
2929//! .u64_counter("a.counter")
3030//! .with_description("Counts things")
31- //! .init ();
31+ //! .build ();
3232//! let histogram = meter
3333//! .u64_histogram("a.histogram")
3434//! .with_description("Records values")
35- //! .init ();
35+ //! .build ();
3636//!
3737//! counter.add(100, &[KeyValue::new("key", "value")]);
3838//! histogram.record(100, &[KeyValue::new("key", "value")]);
9898
9999use once_cell:: sync:: { Lazy , OnceCell } ;
100100use opentelemetry:: {
101- global,
102- metrics:: { MetricsError , Result } ,
101+ otel_error,
103102 Key , Value ,
103+ InstrumentationScope
104104} ;
105105use opentelemetry_sdk:: {
106106 metrics:: {
107- data:: { self , ResourceMetrics , Temporality } ,
108- reader:: { MetricReader , TemporalitySelector } ,
107+ Temporality ,
108+ data:: { self , ResourceMetrics } ,
109+ reader:: MetricReader ,
109110 InstrumentKind , ManualReader , Pipeline ,
111+ MetricResult
110112 } ,
111- Resource , Scope ,
113+ Resource ,
112114} ;
113115use prometheus:: {
114116 core:: Desc ,
@@ -152,30 +154,26 @@ pub struct PrometheusExporter {
152154 reader : Arc < ManualReader > ,
153155}
154156
155- impl TemporalitySelector for PrometheusExporter {
156- /// Note: Prometheus only supports cumulative temporality so this will always be
157- /// [Temporality::Cumulative].
158- fn temporality ( & self , kind : InstrumentKind ) -> Temporality {
159- self . reader . temporality ( kind)
160- }
161- }
162-
163157impl MetricReader for PrometheusExporter {
164158 fn register_pipeline ( & self , pipeline : Weak < Pipeline > ) {
165159 self . reader . register_pipeline ( pipeline)
166160 }
167161
168- fn collect ( & self , rm : & mut ResourceMetrics ) -> Result < ( ) > {
162+ fn collect ( & self , rm : & mut ResourceMetrics ) -> MetricResult < ( ) > {
169163 self . reader . collect ( rm)
170164 }
171165
172- fn force_flush ( & self ) -> Result < ( ) > {
166+ fn force_flush ( & self ) -> MetricResult < ( ) > {
173167 self . reader . force_flush ( )
174168 }
175169
176- fn shutdown ( & self ) -> Result < ( ) > {
170+ fn shutdown ( & self ) -> MetricResult < ( ) > {
177171 self . reader . shutdown ( )
178172 }
173+
174+ fn temporality ( & self , kind : InstrumentKind ) -> Temporality {
175+ self . reader . temporality ( kind)
176+ }
179177}
180178
181179struct Collector {
@@ -193,7 +191,7 @@ struct Collector {
193191
194192#[ derive( Default ) ]
195193struct CollectorInner {
196- scope_infos : HashMap < Scope , MetricFamily > ,
194+ scope_infos : HashMap < InstrumentationScope , MetricFamily > ,
197195 metric_families : HashMap < String , MetricFamily > ,
198196}
199197
@@ -281,7 +279,7 @@ impl prometheus::core::Collector for Collector {
281279 let mut inner = match self . inner . lock ( ) {
282280 Ok ( guard) => guard,
283281 Err ( err) => {
284- global :: handle_error ( err) ;
282+ otel_error ! ( name : format! ( "OpenTelemetry error occurred. {}" , err. to_string ( ) ) ) ;
285283 return Vec :: new ( ) ;
286284 }
287285 } ;
@@ -291,7 +289,7 @@ impl prometheus::core::Collector for Collector {
291289 scope_metrics : vec ! [ ] ,
292290 } ;
293291 if let Err ( err) = self . reader . collect ( & mut metrics) {
294- global :: handle_error ( err) ;
292+ otel_error ! ( name : format! ( "OpenTelemetry metrics error occurred. {}" , err. to_string ( ) ) ) ;
295293 return vec ! [ ] ;
296294 }
297295 let mut res = Vec :: with_capacity ( metrics. scope_metrics . len ( ) + 1 ) ;
@@ -311,7 +309,7 @@ impl prometheus::core::Collector for Collector {
311309
312310 for scope_metrics in metrics. scope_metrics {
313311 let scope_labels = if !self . disable_scope_info {
314- if ! scope_metrics. scope . attributes . is_empty ( ) {
312+ if scope_metrics. scope . attributes ( ) . count ( ) > 0 {
315313 let scope_info = inner
316314 . scope_infos
317315 . entry ( scope_metrics. scope . clone ( ) )
@@ -320,12 +318,12 @@ impl prometheus::core::Collector for Collector {
320318 }
321319
322320 let mut labels =
323- Vec :: with_capacity ( 1 + scope_metrics. scope . version . is_some ( ) as usize ) ;
321+ Vec :: with_capacity ( 1 + scope_metrics. scope . version ( ) . is_some ( ) as usize ) ;
324322 let mut name = LabelPair :: new ( ) ;
325323 name. set_name ( SCOPE_INFO_KEYS [ 0 ] . into ( ) ) ;
326- name. set_value ( scope_metrics. scope . name . to_string ( ) ) ;
324+ name. set_value ( scope_metrics. scope . name ( ) . to_string ( ) ) ;
327325 labels. push ( name) ;
328- if let Some ( version) = & scope_metrics. scope . version {
326+ if let Some ( version) = & scope_metrics. scope . version ( ) {
329327 let mut l_version = LabelPair :: new ( ) ;
330328 l_version. set_name ( SCOPE_INFO_KEYS [ 1 ] . into ( ) ) ;
331329 l_version. set_value ( version. to_string ( ) ) ;
@@ -421,11 +419,11 @@ fn validate_metrics(
421419) -> ( bool , Option < String > ) {
422420 if let Some ( existing) = mfs. get ( name) {
423421 if existing. get_field_type ( ) != metric_type {
424- global :: handle_error ( MetricsError :: Other ( format ! ( "Instrument type conflict, using existing type definition. Instrument {name}, Existing: {:?}, dropped: {:?}" , existing. get_field_type( ) , metric_type) ) ) ;
422+ otel_error ! ( name : format!( "OpenTelemetry metrics error occurred. Instrument type conflict, using existing type definition. Instrument {name}, Existing: {:?}, dropped: {:?}" , existing. get_field_type( ) , metric_type) ) ;
425423 return ( true , None ) ;
426424 }
427425 if existing. get_help ( ) != description {
428- global :: handle_error ( MetricsError :: Other ( format ! ( "Instrument description conflict, using existing. Instrument {name}, Existing: {:?}, dropped: {:?}" , existing. get_help( ) , description) ) ) ;
426+ otel_error ! ( name : format!( "OpenTelemetry metrics error occurred. Instrument description conflict, using existing. Instrument {name}, Existing: {:?}, dropped: {:?}" , existing. get_help( ) , description) ) ;
429427 return ( false , Some ( existing. get_help ( ) . to_string ( ) ) ) ;
430428 }
431429 ( false , None )
@@ -578,16 +576,16 @@ fn create_info_metric(
578576 mf
579577}
580578
581- fn create_scope_info_metric ( scope : & Scope ) -> MetricFamily {
579+ fn create_scope_info_metric ( scope : & InstrumentationScope ) -> MetricFamily {
582580 let mut g = prometheus:: proto:: Gauge :: default ( ) ;
583581 g. set_value ( 1.0 ) ;
584582
585- let mut labels = Vec :: with_capacity ( 1 + scope. version . is_some ( ) as usize ) ;
583+ let mut labels = Vec :: with_capacity ( 1 + scope. version ( ) . is_some ( ) as usize ) ;
586584 let mut name = LabelPair :: new ( ) ;
587585 name. set_name ( SCOPE_INFO_KEYS [ 0 ] . into ( ) ) ;
588- name. set_value ( scope. name . to_string ( ) ) ;
586+ name. set_value ( scope. name ( ) . to_string ( ) ) ;
589587 labels. push ( name) ;
590- if let Some ( version) = & scope. version {
588+ if let Some ( version) = & scope. version ( ) {
591589 let mut v_label = LabelPair :: new ( ) ;
592590 v_label. set_name ( SCOPE_INFO_KEYS [ 1 ] . into ( ) ) ;
593591 v_label. set_value ( version. to_string ( ) ) ;
0 commit comments