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")]);
9797#![ cfg_attr( test, deny( warnings) ) ]
9898
9999use once_cell:: sync:: { Lazy , OnceCell } ;
100- use opentelemetry:: {
101- global,
102- metrics:: { MetricsError , Result } ,
103- Key , Value ,
104- } ;
100+ use opentelemetry:: { otel_error, otel_warn, InstrumentationScope , Key , Value } ;
105101use opentelemetry_sdk:: {
106102 metrics:: {
107- data:: { self , ResourceMetrics , Temporality } ,
108- reader:: { MetricReader , TemporalitySelector } ,
109- InstrumentKind , ManualReader , Pipeline ,
103+ data:: { self , ResourceMetrics } ,
104+ reader:: MetricReader ,
105+ InstrumentKind , ManualReader , MetricResult , Pipeline , Temporality ,
110106 } ,
111- Resource , Scope ,
107+ Resource ,
112108} ;
113109use prometheus:: {
114110 core:: Desc ,
@@ -152,30 +148,28 @@ pub struct PrometheusExporter {
152148 reader : Arc < ManualReader > ,
153149}
154150
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-
163151impl MetricReader for PrometheusExporter {
164152 fn register_pipeline ( & self , pipeline : Weak < Pipeline > ) {
165153 self . reader . register_pipeline ( pipeline)
166154 }
167155
168- fn collect ( & self , rm : & mut ResourceMetrics ) -> Result < ( ) > {
156+ fn collect ( & self , rm : & mut ResourceMetrics ) -> MetricResult < ( ) > {
169157 self . reader . collect ( rm)
170158 }
171159
172- fn force_flush ( & self ) -> Result < ( ) > {
160+ fn force_flush ( & self ) -> MetricResult < ( ) > {
173161 self . reader . force_flush ( )
174162 }
175163
176- fn shutdown ( & self ) -> Result < ( ) > {
164+ fn shutdown ( & self ) -> MetricResult < ( ) > {
177165 self . reader . shutdown ( )
178166 }
167+
168+ /// Note: Prometheus only supports cumulative temporality, so this will always be
169+ /// [Temporality::Cumulative].
170+ fn temporality ( & self , _kind : InstrumentKind ) -> Temporality {
171+ Temporality :: Cumulative
172+ }
179173}
180174
181175struct Collector {
@@ -193,7 +187,7 @@ struct Collector {
193187
194188#[ derive( Default ) ]
195189struct CollectorInner {
196- scope_infos : HashMap < Scope , MetricFamily > ,
190+ scope_infos : HashMap < InstrumentationScope , MetricFamily > ,
197191 metric_families : HashMap < String , MetricFamily > ,
198192}
199193
@@ -281,7 +275,10 @@ impl prometheus::core::Collector for Collector {
281275 let mut inner = match self . inner . lock ( ) {
282276 Ok ( guard) => guard,
283277 Err ( err) => {
284- global:: handle_error ( err) ;
278+ otel_error ! (
279+ name: "MetricScrapeFailed" ,
280+ message = err. to_string( ) ,
281+ ) ;
285282 return Vec :: new ( ) ;
286283 }
287284 } ;
@@ -291,7 +288,10 @@ impl prometheus::core::Collector for Collector {
291288 scope_metrics : vec ! [ ] ,
292289 } ;
293290 if let Err ( err) = self . reader . collect ( & mut metrics) {
294- global:: handle_error ( err) ;
291+ otel_error ! (
292+ name: "MetricScrapeFailed" ,
293+ message = err. to_string( ) ,
294+ ) ;
295295 return vec ! [ ] ;
296296 }
297297 let mut res = Vec :: with_capacity ( metrics. scope_metrics . len ( ) + 1 ) ;
@@ -311,7 +311,7 @@ impl prometheus::core::Collector for Collector {
311311
312312 for scope_metrics in metrics. scope_metrics {
313313 let scope_labels = if !self . disable_scope_info {
314- if ! scope_metrics. scope . attributes . is_empty ( ) {
314+ if scope_metrics. scope . attributes ( ) . count ( ) > 0 {
315315 let scope_info = inner
316316 . scope_infos
317317 . entry ( scope_metrics. scope . clone ( ) )
@@ -320,12 +320,12 @@ impl prometheus::core::Collector for Collector {
320320 }
321321
322322 let mut labels =
323- Vec :: with_capacity ( 1 + scope_metrics. scope . version . is_some ( ) as usize ) ;
323+ Vec :: with_capacity ( 1 + scope_metrics. scope . version ( ) . is_some ( ) as usize ) ;
324324 let mut name = LabelPair :: new ( ) ;
325325 name. set_name ( SCOPE_INFO_KEYS [ 0 ] . into ( ) ) ;
326- name. set_value ( scope_metrics. scope . name . to_string ( ) ) ;
326+ name. set_value ( scope_metrics. scope . name ( ) . to_string ( ) ) ;
327327 labels. push ( name) ;
328- if let Some ( version) = & scope_metrics. scope . version {
328+ if let Some ( version) = & scope_metrics. scope . version ( ) {
329329 let mut l_version = LabelPair :: new ( ) ;
330330 l_version. set_name ( SCOPE_INFO_KEYS [ 1 ] . into ( ) ) ;
331331 l_version. set_value ( version. to_string ( ) ) ;
@@ -421,11 +421,19 @@ fn validate_metrics(
421421) -> ( bool , Option < String > ) {
422422 if let Some ( existing) = mfs. get ( name) {
423423 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) ) ) ;
424+ otel_warn ! (
425+ name: "MetricValidationFailed" ,
426+ message = "Instrument type conflict, using existing type definition" ,
427+ metric_type = format!( "Instrument {name}, Existing: {:?}, dropped: {:?}" , existing. get_field_type( ) , metric_type) . as_str( ) ,
428+ ) ;
425429 return ( true , None ) ;
426430 }
427431 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) ) ) ;
432+ otel_warn ! (
433+ name: "MetricValidationFailed" ,
434+ message = "Instrument description conflict, using existing" ,
435+ metric_description = format!( "Instrument {name}, Existing: {:?}, dropped: {:?}" , existing. get_help( ) . to_string( ) , description. to_string( ) ) . as_str( ) ,
436+ ) ;
429437 return ( false , Some ( existing. get_help ( ) . to_string ( ) ) ) ;
430438 }
431439 ( false , None )
@@ -578,16 +586,16 @@ fn create_info_metric(
578586 mf
579587}
580588
581- fn create_scope_info_metric ( scope : & Scope ) -> MetricFamily {
589+ fn create_scope_info_metric ( scope : & InstrumentationScope ) -> MetricFamily {
582590 let mut g = prometheus:: proto:: Gauge :: default ( ) ;
583591 g. set_value ( 1.0 ) ;
584592
585- let mut labels = Vec :: with_capacity ( 1 + scope. version . is_some ( ) as usize ) ;
593+ let mut labels = Vec :: with_capacity ( 1 + scope. version ( ) . is_some ( ) as usize ) ;
586594 let mut name = LabelPair :: new ( ) ;
587595 name. set_name ( SCOPE_INFO_KEYS [ 0 ] . into ( ) ) ;
588- name. set_value ( scope. name . to_string ( ) ) ;
596+ name. set_value ( scope. name ( ) . to_string ( ) ) ;
589597 labels. push ( name) ;
590- if let Some ( version) = & scope. version {
598+ if let Some ( version) = & scope. version ( ) {
591599 let mut v_label = LabelPair :: new ( ) ;
592600 v_label. set_name ( SCOPE_INFO_KEYS [ 1 ] . into ( ) ) ;
593601 v_label. set_value ( version. to_string ( ) ) ;
0 commit comments