@@ -4,9 +4,9 @@ use std::{borrow::Cow, sync::Arc};
44
55use opentelemetry:: {
66 metrics:: {
7- AsyncInstrumentBuilder , Counter , Gauge , Histogram , HistogramBuilder , InstrumentBuilder ,
8- InstrumentProvider , ObservableCounter , ObservableGauge , ObservableUpDownCounter ,
9- UpDownCounter ,
7+ AsyncHistogramBuilder , AsyncInstrumentBuilder , Counter , Gauge , Histogram , HistogramBuilder ,
8+ InstrumentBuilder , InstrumentProvider , ObservableCounter , ObservableGauge ,
9+ ObservableHistogram , ObservableUpDownCounter , UpDownCounter ,
1010 } ,
1111 otel_error, InstrumentationScope ,
1212} ;
@@ -124,7 +124,7 @@ impl SdkMeter {
124124 let validation_result = validate_instrument_config ( builder. name . as_ref ( ) , & builder. unit ) ;
125125 if let Err ( err) = validation_result {
126126 otel_error ! (
127- name: "InstrumentCreationFailed" ,
127+ name: "InstrumentCreationFailed" ,
128128 meter_name = self . scope. name( ) ,
129129 instrument_name = builder. name. as_ref( ) ,
130130 message = "Callbacks for this ObservableCounter will not be invoked." ,
@@ -183,7 +183,7 @@ impl SdkMeter {
183183 let validation_result = validate_instrument_config ( builder. name . as_ref ( ) , & builder. unit ) ;
184184 if let Err ( err) = validation_result {
185185 otel_error ! (
186- name: "InstrumentCreationFailed" ,
186+ name: "InstrumentCreationFailed" ,
187187 meter_name = self . scope. name( ) ,
188188 instrument_name = builder. name. as_ref( ) ,
189189 message = "Callbacks for this ObservableUpDownCounter will not be invoked." ,
@@ -242,7 +242,7 @@ impl SdkMeter {
242242 let validation_result = validate_instrument_config ( builder. name . as_ref ( ) , & builder. unit ) ;
243243 if let Err ( err) = validation_result {
244244 otel_error ! (
245- name: "InstrumentCreationFailed" ,
245+ name: "InstrumentCreationFailed" ,
246246 meter_name = self . scope. name( ) ,
247247 instrument_name = builder. name. as_ref( ) ,
248248 message = "Callbacks for this ObservableGauge will not be invoked." ,
@@ -290,6 +290,65 @@ impl SdkMeter {
290290 }
291291 }
292292
293+ fn create_observable_histogram < T > (
294+ & self ,
295+ builder : AsyncHistogramBuilder < ' _ , ObservableHistogram < T > , T > ,
296+ resolver : & InstrumentResolver < ' _ , T > ,
297+ ) -> ObservableHistogram < T >
298+ where
299+ T : Number ,
300+ {
301+ let validation_result = validate_instrument_config ( builder. name . as_ref ( ) , & builder. unit ) ;
302+ if let Err ( err) = validation_result {
303+ otel_error ! (
304+ name: "InstrumentCreationFailed" ,
305+ meter_name = self . scope. name( ) ,
306+ instrument_name = builder. name. as_ref( ) ,
307+ message = "Callbacks for this ObservableHistogram will not be invoked." ,
308+ reason = format!( "{}" , err) ) ;
309+ return ObservableHistogram :: new ( ) ;
310+ }
311+
312+ match resolver. measures (
313+ InstrumentKind :: ObservableHistogram ,
314+ builder. name . clone ( ) ,
315+ builder. description ,
316+ builder. unit ,
317+ None ,
318+ ) {
319+ Ok ( ms) => {
320+ if ms. is_empty ( ) {
321+ otel_error ! (
322+ name: "InstrumentCreationFailed" ,
323+ meter_name = self . scope. name( ) ,
324+ instrument_name = builder. name. as_ref( ) ,
325+ message = "Callbacks for this ObservableHistogram will not be invoked. Check View Configuration."
326+ ) ;
327+ return ObservableHistogram :: new ( ) ;
328+ }
329+
330+ let observable = Arc :: new ( Observable :: new ( ms) ) ;
331+
332+ for callback in builder. callbacks {
333+ let cb_inst = Arc :: clone ( & observable) ;
334+ self . pipes
335+ . register_callback ( move || callback ( cb_inst. as_ref ( ) ) ) ;
336+ }
337+
338+ ObservableHistogram :: new ( )
339+ }
340+ Err ( err) => {
341+ otel_error ! (
342+ name: "InstrumentCreationFailed" ,
343+ meter_name = self . scope. name( ) ,
344+ instrument_name = builder. name. as_ref( ) ,
345+ message = "Callbacks for this ObservableHistogram will not be invoked." ,
346+ reason = format!( "{}" , err) ) ;
347+ ObservableHistogram :: new ( )
348+ }
349+ }
350+ }
351+
293352 fn create_updown_counter < T > (
294353 & self ,
295354 builder : InstrumentBuilder < ' _ , UpDownCounter < T > > ,
@@ -548,6 +607,22 @@ impl InstrumentProvider for SdkMeter {
548607 let resolver = InstrumentResolver :: new ( self , & self . u64_resolver ) ;
549608 self . create_histogram ( builder, & resolver)
550609 }
610+
611+ fn f64_observable_histogram (
612+ & self ,
613+ builder : AsyncHistogramBuilder < ' _ , ObservableHistogram < f64 > , f64 > ,
614+ ) -> ObservableHistogram < f64 > {
615+ let resolver = InstrumentResolver :: new ( self , & self . f64_resolver ) ;
616+ self . create_observable_histogram ( builder, & resolver)
617+ }
618+
619+ fn u64_observable_histogram (
620+ & self ,
621+ builder : AsyncHistogramBuilder < ' _ , ObservableHistogram < u64 > , u64 > ,
622+ ) -> ObservableHistogram < u64 > {
623+ let resolver = InstrumentResolver :: new ( self , & self . u64_resolver ) ;
624+ self . create_observable_histogram ( builder, & resolver)
625+ }
551626}
552627
553628fn validate_instrument_config ( name : & str , unit : & Option < Cow < ' static , str > > ) -> MetricResult < ( ) > {
0 commit comments