@@ -6,7 +6,7 @@ use opentelemetry_sdk::{
66 error:: OTelSdkResult ,
77 metrics:: {
88 data:: {
9- Gauge , GaugeDataPoint , Histogram , HistogramDataPoint , ResourceMetrics , ScopeMetrics ,
9+ ExponentialHistogram , ExponentialHistogramDataPoint , Gauge , GaugeDataPoint , Histogram , HistogramDataPoint , ResourceMetrics , ScopeMetrics ,
1010 Sum , SumDataPoint ,
1111 } ,
1212 exporter:: PushMetricExporter ,
@@ -120,9 +120,9 @@ fn print_metrics<'a>(metrics: impl Iterator<Item = &'a ScopeMetrics>) {
120120 println ! ( "\t \t Type : Histogram" ) ;
121121 print_histogram ( hist) ;
122122 }
123- MetricData :: ExponentialHistogram ( _ ) => {
123+ MetricData :: ExponentialHistogram ( hist ) => {
124124 println ! ( "\t \t Type : Exponential Histogram" ) ;
125- // TODO: add support for ExponentialHistogram
125+ print_exponential_histogram ( hist ) ;
126126 }
127127 }
128128 }
@@ -193,6 +193,26 @@ fn print_histogram<T: Debug + Copy>(histogram: &Histogram<T>) {
193193 print_hist_data_points ( histogram. data_points ( ) ) ;
194194}
195195
196+ fn print_exponential_histogram < T : Debug + Copy > ( histogram : & ExponentialHistogram < T > ) {
197+ if histogram. temporality ( ) == Temporality :: Cumulative {
198+ println ! ( "\t \t Temporality : Cumulative" ) ;
199+ } else {
200+ println ! ( "\t \t Temporality : Delta" ) ;
201+ }
202+ let datetime: DateTime < Utc > = histogram. start_time ( ) . into ( ) ;
203+ println ! (
204+ "\t \t StartTime : {}" ,
205+ datetime. format( "%Y-%m-%d %H:%M:%S%.6f" )
206+ ) ;
207+ let datetime: DateTime < Utc > = histogram. time ( ) . into ( ) ;
208+ println ! (
209+ "\t \t EndTime : {}" ,
210+ datetime. format( "%Y-%m-%d %H:%M:%S%.6f" )
211+ ) ;
212+ println ! ( "\t \t Exponential Histogram DataPoints" ) ;
213+ print_exponential_hist_data_points ( histogram. data_points ( ) ) ;
214+ }
215+
196216fn print_sum_data_points < ' a , T : Debug + Copy + ' a > (
197217 data_points : impl Iterator < Item = & ' a SumDataPoint < T > > ,
198218) {
@@ -266,6 +286,52 @@ fn print_hist_data_points<'a, T: Debug + Copy + 'a>(
266286 }
267287}
268288
289+ fn print_exponential_hist_data_points < ' a , T : Debug + Copy + ' a > (
290+ data_points : impl Iterator < Item = & ' a ExponentialHistogramDataPoint < T > > ,
291+ ) {
292+ for ( i, data_point) in data_points. enumerate ( ) {
293+ println ! ( "\t \t DataPoint #{i}" ) ;
294+ println ! ( "\t \t \t Count : {}" , data_point. count( ) ) ;
295+ println ! ( "\t \t \t Sum : {:?}" , data_point. sum( ) ) ;
296+ if let Some ( min) = & data_point. min ( ) {
297+ println ! ( "\t \t \t Min : {min:?}" ) ;
298+ }
299+
300+ if let Some ( max) = & data_point. max ( ) {
301+ println ! ( "\t \t \t Max : {max:?}" ) ;
302+ }
303+
304+ let scale = data_point. scale ( ) ;
305+ let base = 2.0f64 . powf ( 2.0f64 . powf ( -scale as f64 ) ) ;
306+
307+ println ! ( "\t \t \t Scale : {}" , scale) ;
308+ println ! ( "\t \t \t Base : {:.3}" , base) ;
309+ println ! ( "\t \t \t ZeroCount : {}" , data_point. zero_count( ) ) ;
310+ println ! ( "\t \t \t ZeroThreshold : {}" , data_point. zero_threshold( ) ) ;
311+
312+ println ! ( "\t \t \t Attributes :" ) ;
313+ for kv in data_point. attributes ( ) {
314+ println ! ( "\t \t \t \t -> {} : {}" , kv. key, kv. value. as_str( ) ) ;
315+ }
316+
317+ let negative_bucket = data_point. negative_bucket ( ) ;
318+ let negative_offset = negative_bucket. offset ( ) ;
319+ println ! ( "\t \t \t NegativeOffset : {}" , negative_offset) ;
320+ for count in negative_bucket. counts ( ) {
321+ println ! ( "\t \t \t : {}" , count) ;
322+ }
323+
324+ let positive_bucket = data_point. positive_bucket ( ) ;
325+ let positive_offset = positive_bucket. offset ( ) ;
326+ println ! ( "\t \t \t PositiveOffset : {}" , positive_offset) ;
327+ for ( i, p) in positive_bucket. counts ( ) . enumerate ( ) {
328+ let from = base. powf ( ( positive_offset + i as i32 ) as f64 ) ;
329+ let to = base. powf ( ( positive_offset + i as i32 + 1 ) as f64 ) ;
330+ println ! ( "\t \t \t \t -> Bucket {} (> {:.3} to <= {:.3}) : {}" , i, from, to, p) ;
331+ }
332+ }
333+ }
334+
269335/// Configuration for the stdout metrics exporter
270336#[ derive( Default ) ]
271337pub struct MetricExporterBuilder {
0 commit comments