@@ -1613,6 +1613,93 @@ public void UnsupportedMetricInstrument()
16131613 Assert . Empty ( exportedItems ) ;
16141614 }
16151615
1616+ [ Fact ]
1617+ public void GaugeIsExportedCorrectly ( )
1618+ {
1619+ var exportedItems = new List < Metric > ( ) ;
1620+
1621+ using var meter = new Meter ( $ "{ Utils . GetCurrentMethodName ( ) } ") ;
1622+
1623+ using var container = this . BuildMeterProvider ( out var meterProvider , builder => builder
1624+ . AddMeter ( meter . Name )
1625+ . AddInMemoryExporter ( exportedItems ) ) ;
1626+
1627+ var gauge = meter . CreateGauge < long > ( name : "NoiseLevel" , unit : "dB" , description : "Background Noise Level" ) ;
1628+ gauge . Record ( 10 ) ;
1629+ meterProvider . ForceFlush ( MaxTimeToAllowForFlush ) ;
1630+ Assert . Single ( exportedItems ) ;
1631+ var metric = exportedItems [ 0 ] ;
1632+ Assert . Equal ( "Background Noise Level" , metric . Description ) ;
1633+ List < MetricPoint > metricPoints = new List < MetricPoint > ( ) ;
1634+ foreach ( ref readonly var mp in metric . GetMetricPoints ( ) )
1635+ {
1636+ metricPoints . Add ( mp ) ;
1637+ }
1638+
1639+ var lastValue = metricPoints [ 0 ] . GetGaugeLastValueLong ( ) ;
1640+ Assert . Equal ( 10 , lastValue ) ;
1641+ }
1642+
1643+ [ Theory ]
1644+ [ InlineData ( MetricReaderTemporalityPreference . Cumulative ) ]
1645+ [ InlineData ( MetricReaderTemporalityPreference . Delta ) ]
1646+ public void GaugeHandlesNoNewMeasurementsCorrectlyWithTemporality ( MetricReaderTemporalityPreference temporalityPreference )
1647+ {
1648+ var exportedMetrics = new List < Metric > ( ) ;
1649+
1650+ using var meter = new Meter ( $ "{ Utils . GetCurrentMethodName ( ) } ") ;
1651+ using var container = this . BuildMeterProvider ( out var meterProvider , builder => builder
1652+ . AddMeter ( meter . Name )
1653+ . AddInMemoryExporter ( exportedMetrics , metricReaderOptions =>
1654+ {
1655+ metricReaderOptions . TemporalityPreference = temporalityPreference ;
1656+ } ) ) ;
1657+
1658+ var noiseLevelGauge = meter . CreateGauge < long > ( name : "NoiseLevel" , unit : "dB" , description : "Background Noise Level" ) ;
1659+ noiseLevelGauge . Record ( 10 ) ;
1660+
1661+ // Force a flush to export the recorded data
1662+ meterProvider . ForceFlush ( MaxTimeToAllowForFlush ) ;
1663+
1664+ // Validate first export / flush
1665+ var firstMetric = exportedMetrics [ 0 ] ;
1666+ var firstMetricPoints = new List < MetricPoint > ( ) ;
1667+ foreach ( ref readonly var metricPoint in firstMetric . GetMetricPoints ( ) )
1668+ {
1669+ firstMetricPoints . Add ( metricPoint ) ;
1670+ }
1671+
1672+ Assert . Single ( firstMetricPoints ) ;
1673+ var firstMetricPoint = firstMetricPoints [ 0 ] ;
1674+ Assert . Equal ( 10 , firstMetricPoint . GetGaugeLastValueLong ( ) ) ;
1675+
1676+ // Flush the metrics again without recording any new measurements
1677+ meterProvider . ForceFlush ( MaxTimeToAllowForFlush ) ;
1678+
1679+ // Validate second export / flush
1680+ if ( temporalityPreference == MetricReaderTemporalityPreference . Cumulative )
1681+ {
1682+ // For cumulative temporality, data points should still be collected
1683+ // without any new measurements
1684+ Assert . Equal ( 2 , exportedMetrics . Count ) ;
1685+ var secondMetric = exportedMetrics [ 1 ] ;
1686+ var secondMetricPoints = new List < MetricPoint > ( ) ;
1687+ foreach ( ref readonly var metricPoint in secondMetric . GetMetricPoints ( ) )
1688+ {
1689+ secondMetricPoints . Add ( metricPoint ) ;
1690+ }
1691+
1692+ Assert . Single ( secondMetricPoints ) ;
1693+ var secondMetricPoint = secondMetricPoints [ 0 ] ;
1694+ Assert . Equal ( 10 , secondMetricPoint . GetGaugeLastValueLong ( ) ) ;
1695+ }
1696+ else if ( temporalityPreference == MetricReaderTemporalityPreference . Delta )
1697+ {
1698+ // For delta temporality, no new metric should be collected
1699+ Assert . Single ( exportedMetrics ) ;
1700+ }
1701+ }
1702+
16161703 internal static IConfiguration BuildConfiguration ( bool emitOverflowAttribute , bool shouldReclaimUnusedMetricPoints )
16171704 {
16181705 var configurationData = new Dictionary < string , string > ( ) ;
0 commit comments