@@ -163,5 +163,104 @@ public void VerifySnapshot_Histogram()
163163 Assert . Equal ( 2 , snapshot2 . MetricPoints [ 0 ] . GetHistogramCount ( ) ) ;
164164 Assert . Equal ( 15 , snapshot2 . MetricPoints [ 0 ] . GetHistogramSum ( ) ) ;
165165 }
166+
167+ [ Fact ]
168+ public void VerifySnapshot_ExponentialHistogram ( )
169+ {
170+ var expectedHistogram = new Base2ExponentialBucketHistogram ( ) ;
171+ var exportedMetrics = new List < Metric > ( ) ;
172+ var exportedSnapshots = new List < MetricSnapshot > ( ) ;
173+
174+ using var meter = new Meter ( Utils . GetCurrentMethodName ( ) ) ;
175+ var histogram = meter . CreateHistogram < int > ( "histogram" ) ;
176+ using var meterProvider = Sdk . CreateMeterProviderBuilder ( )
177+ . AddMeter ( meter . Name )
178+ . AddView ( "histogram" , new Base2ExponentialBucketHistogramConfiguration ( ) )
179+ . AddInMemoryExporter ( exportedMetrics )
180+ . AddInMemoryExporter ( exportedSnapshots )
181+ . Build ( ) ;
182+
183+ // FIRST EXPORT
184+ expectedHistogram . Record ( 10 ) ;
185+ histogram . Record ( 10 ) ;
186+ meterProvider . ForceFlush ( ) ;
187+
188+ // Verify Metric 1
189+ Assert . Single ( exportedMetrics ) ;
190+ var metric1 = exportedMetrics [ 0 ] ;
191+ var metricPoints1Enumerator = metric1 . GetMetricPoints ( ) . GetEnumerator ( ) ;
192+ Assert . True ( metricPoints1Enumerator . MoveNext ( ) ) ;
193+ ref readonly var metricPoint1 = ref metricPoints1Enumerator . Current ;
194+ Assert . Equal ( 1 , metricPoint1 . GetHistogramCount ( ) ) ;
195+ Assert . Equal ( 10 , metricPoint1 . GetHistogramSum ( ) ) ;
196+ metricPoint1 . TryGetHistogramMinMaxValues ( out var min , out var max ) ;
197+ Assert . Equal ( 10 , min ) ;
198+ Assert . Equal ( 10 , max ) ;
199+ AggregatorTest . AssertExponentialBucketsAreCorrect ( expectedHistogram , metricPoint1 . GetExponentialHistogramData ( ) ) ;
200+
201+ // Verify Snapshot 1
202+ Assert . Single ( exportedSnapshots ) ;
203+ var snapshot1 = exportedSnapshots [ 0 ] ;
204+ Assert . Single ( snapshot1 . MetricPoints ) ;
205+ Assert . Equal ( 1 , snapshot1 . MetricPoints [ 0 ] . GetHistogramCount ( ) ) ;
206+ Assert . Equal ( 10 , snapshot1 . MetricPoints [ 0 ] . GetHistogramSum ( ) ) ;
207+ snapshot1 . MetricPoints [ 0 ] . TryGetHistogramMinMaxValues ( out min , out max ) ;
208+ Assert . Equal ( 10 , min ) ;
209+ Assert . Equal ( 10 , max ) ;
210+ AggregatorTest . AssertExponentialBucketsAreCorrect ( expectedHistogram , snapshot1 . MetricPoints [ 0 ] . GetExponentialHistogramData ( ) ) ;
211+
212+ // Verify Metric == Snapshot
213+ Assert . Equal ( metric1 . Name , snapshot1 . Name ) ;
214+ Assert . Equal ( metric1 . Description , snapshot1 . Description ) ;
215+ Assert . Equal ( metric1 . Unit , snapshot1 . Unit ) ;
216+ Assert . Equal ( metric1 . MeterName , snapshot1 . MeterName ) ;
217+ Assert . Equal ( metric1 . MetricType , snapshot1 . MetricType ) ;
218+ Assert . Equal ( metric1 . MeterVersion , snapshot1 . MeterVersion ) ;
219+
220+ // SECOND EXPORT
221+ expectedHistogram . Record ( 5 ) ;
222+ histogram . Record ( 5 ) ;
223+ meterProvider . ForceFlush ( ) ;
224+
225+ // Verify Metric 1 after second export
226+ // This value is expected to be updated.
227+ Assert . Equal ( 2 , metricPoint1 . GetHistogramCount ( ) ) ;
228+ Assert . Equal ( 15 , metricPoint1 . GetHistogramSum ( ) ) ;
229+ metricPoint1 . TryGetHistogramMinMaxValues ( out min , out max ) ;
230+ Assert . Equal ( 5 , min ) ;
231+ Assert . Equal ( 10 , max ) ;
232+
233+ // Verify Metric 2
234+ Assert . Equal ( 2 , exportedMetrics . Count ) ;
235+ var metric2 = exportedMetrics [ 1 ] ;
236+ var metricPoints2Enumerator = metric2 . GetMetricPoints ( ) . GetEnumerator ( ) ;
237+ Assert . True ( metricPoints2Enumerator . MoveNext ( ) ) ;
238+ ref readonly var metricPoint2 = ref metricPoints2Enumerator . Current ;
239+ Assert . Equal ( 2 , metricPoint2 . GetHistogramCount ( ) ) ;
240+ Assert . Equal ( 15 , metricPoint2 . GetHistogramSum ( ) ) ;
241+ metricPoint1 . TryGetHistogramMinMaxValues ( out min , out max ) ;
242+ Assert . Equal ( 5 , min ) ;
243+ Assert . Equal ( 10 , max ) ;
244+ AggregatorTest . AssertExponentialBucketsAreCorrect ( expectedHistogram , metricPoint2 . GetExponentialHistogramData ( ) ) ;
245+
246+ // Verify Snapshot 1 after second export
247+ // This value is expected to be unchanged.
248+ Assert . Equal ( 1 , snapshot1 . MetricPoints [ 0 ] . GetHistogramCount ( ) ) ;
249+ Assert . Equal ( 10 , snapshot1 . MetricPoints [ 0 ] . GetHistogramSum ( ) ) ;
250+ snapshot1 . MetricPoints [ 0 ] . TryGetHistogramMinMaxValues ( out min , out max ) ;
251+ Assert . Equal ( 10 , min ) ;
252+ Assert . Equal ( 10 , max ) ;
253+
254+ // Verify Snapshot 2
255+ Assert . Equal ( 2 , exportedSnapshots . Count ) ;
256+ var snapshot2 = exportedSnapshots [ 1 ] ;
257+ Assert . Single ( snapshot2 . MetricPoints ) ;
258+ Assert . Equal ( 2 , snapshot2 . MetricPoints [ 0 ] . GetHistogramCount ( ) ) ;
259+ Assert . Equal ( 15 , snapshot2 . MetricPoints [ 0 ] . GetHistogramSum ( ) ) ;
260+ snapshot2 . MetricPoints [ 0 ] . TryGetHistogramMinMaxValues ( out min , out max ) ;
261+ Assert . Equal ( 5 , min ) ;
262+ Assert . Equal ( 10 , max ) ;
263+ AggregatorTest . AssertExponentialBucketsAreCorrect ( expectedHistogram , snapshot2 . MetricPoints [ 0 ] . GetExponentialHistogramData ( ) ) ;
264+ }
166265 }
167266}
0 commit comments