diff --git a/src/libraries/System.Diagnostics.DiagnosticSource/src/System.Diagnostics.DiagnosticSource.csproj b/src/libraries/System.Diagnostics.DiagnosticSource/src/System.Diagnostics.DiagnosticSource.csproj index cafd3cd3459a42..8b01133f758818 100644 --- a/src/libraries/System.Diagnostics.DiagnosticSource/src/System.Diagnostics.DiagnosticSource.csproj +++ b/src/libraries/System.Diagnostics.DiagnosticSource/src/System.Diagnostics.DiagnosticSource.csproj @@ -62,7 +62,7 @@ System.Diagnostics.DiagnosticSource - + diff --git a/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/Metrics/AggregationManager.cs b/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/Metrics/AggregationManager.cs index 770af1d8a9ca2c..3e2460e0e993a1 100644 --- a/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/Metrics/AggregationManager.cs +++ b/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/Metrics/AggregationManager.cs @@ -275,7 +275,7 @@ private void RemoveInstrumentState(Instrument instrument) { lock (this) { - return CheckTimeSeriesAllowed() ? new RateSumAggregator(isMonotonic: true) : null; + return CheckTimeSeriesAllowed() ? new CounterAggregator(isMonotonic: true) : null; } }; } @@ -285,7 +285,7 @@ private void RemoveInstrumentState(Instrument instrument) { lock (this) { - return CheckTimeSeriesAllowed() ? new RateAggregator(isMonotonic: true) : null; + return CheckTimeSeriesAllowed() ? new ObservableCounterAggregator(isMonotonic: true) : null; } }; } @@ -318,7 +318,7 @@ private void RemoveInstrumentState(Instrument instrument) { lock (this) { - return CheckTimeSeriesAllowed() ? new RateSumAggregator(isMonotonic: false) : null; + return CheckTimeSeriesAllowed() ? new CounterAggregator(isMonotonic: false) : null; } }; } @@ -328,7 +328,7 @@ private void RemoveInstrumentState(Instrument instrument) { lock (this) { - return CheckTimeSeriesAllowed() ? new RateAggregator(isMonotonic: false) : null; + return CheckTimeSeriesAllowed() ? new ObservableCounterAggregator(isMonotonic: false) : null; } }; } diff --git a/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/Metrics/RateAggregator.cs b/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/Metrics/CounterAggregator.cs similarity index 56% rename from src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/Metrics/RateAggregator.cs rename to src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/Metrics/CounterAggregator.cs index e1c6020b58471c..19d86894fe264a 100644 --- a/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/Metrics/RateAggregator.cs +++ b/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/Metrics/CounterAggregator.cs @@ -3,12 +3,13 @@ namespace System.Diagnostics.Metrics { - internal sealed class RateSumAggregator : Aggregator + internal sealed class CounterAggregator : Aggregator { private readonly bool _isMonotonic; - private double _sum; + private double _delta; + private double _aggregatedValue; - public RateSumAggregator(bool isMonotonic) + public CounterAggregator(bool isMonotonic) { _isMonotonic = isMonotonic; } @@ -17,7 +18,7 @@ public override void Update(double value) { lock (this) { - _sum += value; + _delta += value; } } @@ -25,20 +26,21 @@ public override IAggregationStatistics Collect() { lock (this) { - RateStatistics? stats = new RateStatistics(_sum, _isMonotonic); - _sum = 0; + _aggregatedValue += _delta; + CounterStatistics? stats = new CounterStatistics(_delta, _isMonotonic, _aggregatedValue); + _delta = 0; return stats; } } } - internal sealed class RateAggregator : Aggregator + internal sealed class ObservableCounterAggregator : Aggregator { private readonly bool _isMonotonic; private double? _prevValue; - private double _value; + private double _currValue; - public RateAggregator(bool isMonotonic) + public ObservableCounterAggregator(bool isMonotonic) { _isMonotonic = isMonotonic; } @@ -47,7 +49,7 @@ public override void Update(double value) { lock (this) { - _value = value; + _currValue = value; } } @@ -58,25 +60,29 @@ public override IAggregationStatistics Collect() double? delta = null; if (_prevValue.HasValue) { - delta = _value - _prevValue.Value; + delta = _currValue - _prevValue.Value; } - RateStatistics stats = new RateStatistics(delta, _isMonotonic); - _prevValue = _value; + + CounterStatistics stats = new CounterStatistics(delta, _isMonotonic, _currValue); + _prevValue = _currValue; return stats; } } } - internal sealed class RateStatistics : IAggregationStatistics + internal sealed class CounterStatistics : IAggregationStatistics { - public RateStatistics(double? delta, bool isMonotonic) + public CounterStatistics(double? delta, bool isMonotonic, double value) { Delta = delta; IsMonotonic = isMonotonic; + Value = value; } public double? Delta { get; } public bool IsMonotonic { get; } + + public double Value { get; } } } diff --git a/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/Metrics/MetricsEventSource.cs b/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/Metrics/MetricsEventSource.cs index 79a5b78633923b..42a98185c9b0b1 100644 --- a/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/Metrics/MetricsEventSource.cs +++ b/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/Metrics/MetricsEventSource.cs @@ -102,12 +102,12 @@ public void CollectionStop(string sessionId, DateTime intervalStartTime, DateTim WriteEvent(3, sessionId, intervalStartTime, intervalEndTime); } - [Event(4, Keywords = Keywords.TimeSeriesValues)] + [Event(4, Keywords = Keywords.TimeSeriesValues, Version=1)] [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode", Justification = "This calls WriteEvent with all primitive arguments which is safe. Primitives are always serialized properly.")] - public void CounterRateValuePublished(string sessionId, string meterName, string? meterVersion, string instrumentName, string? unit, string tags, string rate) + public void CounterRateValuePublished(string sessionId, string meterName, string? meterVersion, string instrumentName, string? unit, string tags, string rate, string value) { - WriteEvent(4, sessionId, meterName, meterVersion ?? "", instrumentName, unit ?? "", tags, rate); + WriteEvent(4, sessionId, meterName, meterVersion ?? "", instrumentName, unit ?? "", tags, rate, value); } [Event(5, Keywords = Keywords.TimeSeriesValues)] @@ -191,12 +191,12 @@ public void MultipleSessionsNotSupportedError(string runningSessionId) WriteEvent(15, runningSessionId); } - [Event(16, Keywords = Keywords.TimeSeriesValues)] + [Event(16, Keywords = Keywords.TimeSeriesValues, Version=1)] [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode", Justification = "This calls WriteEvent with all primitive arguments which is safe. Primitives are always serialized properly.")] - public void UpDownCounterRateValuePublished(string sessionId, string meterName, string? meterVersion, string instrumentName, string? unit, string tags, string rate) + public void UpDownCounterRateValuePublished(string sessionId, string meterName, string? meterVersion, string instrumentName, string? unit, string tags, string rate, string value) { - WriteEvent(16, sessionId, meterName, meterVersion ?? "", instrumentName, unit ?? "", tags, rate); + WriteEvent(16, sessionId, meterName, meterVersion ?? "", instrumentName, unit ?? "", tags, rate, value); } /// @@ -413,17 +413,19 @@ private void ParseSpecs(string? metricsSpecs) private static void TransmitMetricValue(Instrument instrument, LabeledAggregationStatistics stats, string sessionId) { - if (stats.AggregationStatistics is RateStatistics rateStats) + if (stats.AggregationStatistics is CounterStatistics rateStats) { if (rateStats.IsMonotonic) { Log.CounterRateValuePublished(sessionId, instrument.Meter.Name, instrument.Meter.Version, instrument.Name, instrument.Unit, FormatTags(stats.Labels), - rateStats.Delta.HasValue ? rateStats.Delta.Value.ToString(CultureInfo.InvariantCulture) : ""); + rateStats.Delta.HasValue ? rateStats.Delta.Value.ToString(CultureInfo.InvariantCulture) : "", + rateStats.Value.ToString(CultureInfo.InvariantCulture)); } else { Log.UpDownCounterRateValuePublished(sessionId, instrument.Meter.Name, instrument.Meter.Version, instrument.Name, instrument.Unit, FormatTags(stats.Labels), - rateStats.Delta.HasValue ? rateStats.Delta.Value.ToString(CultureInfo.InvariantCulture) : ""); + rateStats.Delta.HasValue ? rateStats.Delta.Value.ToString(CultureInfo.InvariantCulture) : "", + rateStats.Value.ToString(CultureInfo.InvariantCulture)); } } else if (stats.AggregationStatistics is LastValueStatistics lastValueStats) diff --git a/src/libraries/System.Diagnostics.DiagnosticSource/tests/MetricEventSourceTests.cs b/src/libraries/System.Diagnostics.DiagnosticSource/tests/MetricEventSourceTests.cs index e85ebbe46096e3..1229706331d431 100644 --- a/src/libraries/System.Diagnostics.DiagnosticSource/tests/MetricEventSourceTests.cs +++ b/src/libraries/System.Diagnostics.DiagnosticSource/tests/MetricEventSourceTests.cs @@ -56,12 +56,12 @@ public void EventSourcePublishesTimeSeriesWithEmptyMetadata() AssertBeginInstrumentReportingEventsPresent(events, c, oc, og, h, udc, oudc); AssertInitialEnumerationCompleteEventPresent(events); - AssertCounterEventsPresent(events, meter.Name, c.Name, "", "", "5", "12"); - AssertCounterEventsPresent(events, meter.Name, oc.Name, "", "", "", "7"); + AssertCounterEventsPresent(events, meter.Name, c.Name, "", "", ("5", "5"), ("12", "17")); + AssertCounterEventsPresent(events, meter.Name, oc.Name, "", "", ("", "10"), ("7", "17")); AssertGaugeEventsPresent(events, meter.Name, og.Name, "", "", "9", "18"); AssertHistogramEventsPresent(events, meter.Name, h.Name, "", "", "0.5=19;0.95=19;0.99=19", "0.5=26;0.95=26;0.99=26"); - AssertUpDownCounterEventsPresent(events, meter.Name, udc.Name, "", "", "-33", "-40"); - AssertUpDownCounterEventsPresent(events, meter.Name, oudc.Name, "", "", "", "-11"); + AssertUpDownCounterEventsPresent(events, meter.Name, udc.Name, "", "", ("-33", "-33"), ("-40", "-73")); + AssertUpDownCounterEventsPresent(events, meter.Name, oudc.Name, "", "", ("", "-11"), ("-11", "-22")); AssertCollectStartStopEventsPresent(events, IntervalSecs, 3); } @@ -97,12 +97,12 @@ public void EventSourcePublishesTimeSeriesWithMetadata() AssertBeginInstrumentReportingEventsPresent(events, c, oc, og, h, udc, oudc); AssertInitialEnumerationCompleteEventPresent(events); - AssertCounterEventsPresent(events, meter.Name, c.Name, "", c.Unit, "5", "12"); - AssertCounterEventsPresent(events, meter.Name, oc.Name, "", oc.Unit, "", "7", "7"); + AssertCounterEventsPresent(events, meter.Name, c.Name, "", c.Unit, ("5", "5"), ("12", "17")); + AssertCounterEventsPresent(events, meter.Name, oc.Name, "", oc.Unit, ("", "10"), ("7", "17"), ("7", "24")); AssertGaugeEventsPresent(events, meter.Name, og.Name, "", og.Unit, "9", "18", "27"); AssertHistogramEventsPresent(events, meter.Name, h.Name, "", h.Unit, "0.5=19;0.95=19;0.99=19", "0.5=26;0.95=26;0.99=26"); - AssertUpDownCounterEventsPresent(events, meter.Name, udc.Name, "", udc.Unit, "33", "40"); - AssertUpDownCounterEventsPresent(events, meter.Name, oudc.Name, "", oudc.Unit, "", "11"); + AssertUpDownCounterEventsPresent(events, meter.Name, udc.Name, "", udc.Unit, ("33", "33"), ("40", "73")); + AssertUpDownCounterEventsPresent(events, meter.Name, oudc.Name, "", oudc.Unit, ("", "11"), ("11", "22"), ("11", "33")); AssertCollectStartStopEventsPresent(events, IntervalSecs, 3); } @@ -152,12 +152,12 @@ public void EventSourcePublishesTimeSeriesForLateMeter() AssertBeginInstrumentReportingEventsPresent(events, c, oc, og, h, udc, oudc); AssertInitialEnumerationCompleteEventPresent(events); - AssertCounterEventsPresent(events, meter.Name, c.Name, "", "", "5", "12"); - AssertCounterEventsPresent(events, meter.Name, oc.Name, "", "", "", "7"); + AssertCounterEventsPresent(events, meter.Name, c.Name, "", "", ("5", "5"), ("12", "17")); + AssertCounterEventsPresent(events, meter.Name, oc.Name, "", "", ("", "10"), ("7", "17")); AssertGaugeEventsPresent(events, meter.Name, og.Name, "", "", "9", "18"); AssertHistogramEventsPresent(events, meter.Name, h.Name, "", "", "0.5=19;0.95=19;0.99=19", "0.5=26;0.95=26;0.99=26"); - AssertUpDownCounterEventsPresent(events, meter.Name, udc.Name, "", "", "33", "40"); - AssertUpDownCounterEventsPresent(events, meter.Name, oudc.Name, "", "", "", "-11"); + AssertUpDownCounterEventsPresent(events, meter.Name, udc.Name, "", "", ("33", "33"), ("40", "73")); + AssertUpDownCounterEventsPresent(events, meter.Name, oudc.Name, "", "", ("", "-11"), ("-11", "-22")); AssertCollectStartStopEventsPresent(events, IntervalSecs, 3); } finally @@ -208,12 +208,12 @@ public void EventSourcePublishesTimeSeriesForLateInstruments() AssertBeginInstrumentReportingEventsPresent(events, c, oc, og, h, udc, oudc); AssertInitialEnumerationCompleteEventPresent(events); - AssertCounterEventsPresent(events, meter.Name, c.Name, "", "", "5", "12"); - AssertCounterEventsPresent(events, meter.Name, oc.Name, "", "", "", "7"); + AssertCounterEventsPresent(events, meter.Name, c.Name, "", "", ("5", "5"), ("12", "17")); + AssertCounterEventsPresent(events, meter.Name, oc.Name, "", "", ("", "10"), ("7", "17")); AssertGaugeEventsPresent(events, meter.Name, og.Name, "", "", "9", "18"); AssertHistogramEventsPresent(events, meter.Name, h.Name, "", "", "0.5=19;0.95=19;0.99=19", "0.5=26;0.95=26;0.99=26"); - AssertUpDownCounterEventsPresent(events, meter.Name, udc.Name, "", "", "-33", "-40"); - AssertUpDownCounterEventsPresent(events, meter.Name, oudc.Name, "", "", "", "11"); + AssertUpDownCounterEventsPresent(events, meter.Name, udc.Name, "", "", ("-33", "-33"), ("-40", "-73")); + AssertUpDownCounterEventsPresent(events, meter.Name, oudc.Name, "", "", ("", "11"), ("11", "22")); AssertCollectStartStopEventsPresent(events, IntervalSecs, 3); } @@ -281,18 +281,18 @@ public void EventSourcePublishesTimeSeriesWithTags() AssertBeginInstrumentReportingEventsPresent(events, c, oc, og, h, udc, oudc); AssertInitialEnumerationCompleteEventPresent(events); - AssertCounterEventsPresent(events, meter.Name, c.Name, "Color=red", "", "5", "12"); - AssertCounterEventsPresent(events, meter.Name, c.Name, "Color=blue", "", "6", "13"); - AssertCounterEventsPresent(events, meter.Name, oc.Name, "Color=red,Size=19", "", "", "7"); - AssertCounterEventsPresent(events, meter.Name, oc.Name, "Color=blue,Size=4", "", "", "14"); + AssertCounterEventsPresent(events, meter.Name, c.Name, "Color=red", "", ("5", "5"), ("12", "17")); + AssertCounterEventsPresent(events, meter.Name, c.Name, "Color=blue", "", ("6", "6"), ("13", "19")); + AssertCounterEventsPresent(events, meter.Name, oc.Name, "Color=red,Size=19", "", ("", "10"), ("7", "17")); + AssertCounterEventsPresent(events, meter.Name, oc.Name, "Color=blue,Size=4", "", ("", "20"), ("14", "34")); AssertGaugeEventsPresent(events, meter.Name, og.Name, "Color=red,Size=19", "", "9", "18"); AssertGaugeEventsPresent(events, meter.Name, og.Name, "Color=blue,Size=4", "", "18", "36"); AssertHistogramEventsPresent(events, meter.Name, h.Name, "Size=123", "", "0.5=19;0.95=19;0.99=19", "0.5=26;0.95=26;0.99=26"); AssertHistogramEventsPresent(events, meter.Name, h.Name, "Size=124", "", "0.5=20;0.95=20;0.99=20", "0.5=27;0.95=27;0.99=27"); - AssertUpDownCounterEventsPresent(events, meter.Name, udc.Name, "Color=red", "", "-33", "40"); - AssertUpDownCounterEventsPresent(events, meter.Name, udc.Name, "Color=blue", "", "-34", "41"); - AssertUpDownCounterEventsPresent(events, meter.Name, oudc.Name, "Color=red,Size=19", "", "", "-11"); - AssertUpDownCounterEventsPresent(events, meter.Name, oudc.Name, "Color=blue,Size=4", "", "", "-22"); + AssertUpDownCounterEventsPresent(events, meter.Name, udc.Name, "Color=red", "", ("-33", "-33"), ("40", "7")); + AssertUpDownCounterEventsPresent(events, meter.Name, udc.Name, "Color=blue", "", ("-34", "-34"), ("41", "7")); + AssertUpDownCounterEventsPresent(events, meter.Name, oudc.Name, "Color=red,Size=19", "", ("", "-11"), ("-11", "-22")); + AssertUpDownCounterEventsPresent(events, meter.Name, oudc.Name, "Color=blue,Size=4", "", ("", "-22"), ("-22", "-44")); AssertCollectStartStopEventsPresent(events, IntervalSecs, 3); } @@ -347,12 +347,12 @@ public void EventSourceFiltersInstruments() AssertBeginInstrumentReportingEventsPresent(events, c3a, c1b, c2b, c3b, c2c, c3c); AssertInitialEnumerationCompleteEventPresent(events); - AssertCounterEventsPresent(events, meterA.Name, c3a.Name, "", "", "1", "2"); - AssertCounterEventsPresent(events, meterB.Name, c1b.Name, "", "", "1", "2"); - AssertCounterEventsPresent(events, meterB.Name, c2b.Name, "", "", "1", "2"); - AssertCounterEventsPresent(events, meterB.Name, c3b.Name, "", "", "1", "2"); - AssertCounterEventsPresent(events, meterC.Name, c3c.Name, "", "", "1", "2"); - AssertCounterEventsPresent(events, meterC.Name, c3c.Name, "", "", "1", "2"); + AssertCounterEventsPresent(events, meterA.Name, c3a.Name, "", "", ("1", "1"), ("2", "3")); + AssertCounterEventsPresent(events, meterB.Name, c1b.Name, "", "", ("1", "1"), ("2", "3")); + AssertCounterEventsPresent(events, meterB.Name, c2b.Name, "", "", ("1", "1"), ("2", "3")); + AssertCounterEventsPresent(events, meterB.Name, c3b.Name, "", "", ("1", "1"), ("2", "3")); + AssertCounterEventsPresent(events, meterC.Name, c3c.Name, "", "", ("1", "1"), ("2", "3")); + AssertCounterEventsPresent(events, meterC.Name, c3c.Name, "", "", ("1", "1"), ("2", "3")); AssertCounterEventsNotPresent(events, meterA.Name, c1a.Name, ""); AssertCounterEventsNotPresent(events, meterA.Name, c2a.Name, ""); AssertCounterEventsNotPresent(events, meterC.Name, c1c.Name, ""); @@ -438,12 +438,12 @@ public void EventSourcePublishesMissingDataPoints() AssertBeginInstrumentReportingEventsPresent(events, c, oc, og, h, udc, oudc); AssertInitialEnumerationCompleteEventPresent(events); - AssertCounterEventsPresent(events, meter.Name, c.Name, "", "", "5", "0", "12"); - AssertCounterEventsPresent(events, meter.Name, oc.Name, "", "", "", "0", "14", "0"); + AssertCounterEventsPresent(events, meter.Name, c.Name, "", "", ("5", "5"), ("0", "5"), ("12", "17")); + AssertCounterEventsPresent(events, meter.Name, oc.Name, "", "", ("", "17"), ("0", "17"), ("14", "31"), ("0", "31")); AssertGaugeEventsPresent(events, meter.Name, og.Name, "", "", "18", "", "36", ""); AssertHistogramEventsPresent(events, meter.Name, h.Name, "", "", "0.5=19;0.95=19;0.99=19", "", "0.5=26;0.95=26;0.99=26", ""); - AssertUpDownCounterEventsPresent(events, meter.Name, udc.Name, "", "", "33", "0", "40"); - AssertUpDownCounterEventsPresent(events, meter.Name, oudc.Name, "", "", "", "0", "22", "0"); + AssertUpDownCounterEventsPresent(events, meter.Name, udc.Name, "", "", ("33", "33"), ("0", "33"), ("40", "73")); + AssertUpDownCounterEventsPresent(events, meter.Name, oudc.Name, "", "", ("", "22"), ("0", "22"), ("22", "44"), ("0", "44")); AssertCollectStartStopEventsPresent(events, IntervalSecs, 5); } @@ -484,12 +484,12 @@ public void EventSourceRejectsNewListener() } AssertBeginInstrumentReportingEventsPresent(events, c, oc, og, h, udc, oudc); - AssertCounterEventsPresent(events, meter.Name, c.Name, "", c.Unit, "5", "12"); - AssertCounterEventsPresent(events, meter.Name, oc.Name, "", oc.Unit, "", "7", "7"); + AssertCounterEventsPresent(events, meter.Name, c.Name, "", c.Unit, ("5", "5"), ("12", "17")); + AssertCounterEventsPresent(events, meter.Name, oc.Name, "", oc.Unit, ("", "10"), ("7", "17"), ("7", "24")); AssertGaugeEventsPresent(events, meter.Name, og.Name, "", og.Unit, "9", "18", "27"); AssertHistogramEventsPresent(events, meter.Name, h.Name, "", h.Unit, "0.5=19;0.95=19;0.99=19", "0.5=26;0.95=26;0.99=26"); - AssertUpDownCounterEventsPresent(events, meter.Name, udc.Name, "", udc.Unit, "33", "40"); - AssertUpDownCounterEventsPresent(events, meter.Name, oudc.Name, "", oudc.Unit, "", "11"); + AssertUpDownCounterEventsPresent(events, meter.Name, udc.Name, "", udc.Unit, ("33", "33"), ("40", "73")); + AssertUpDownCounterEventsPresent(events, meter.Name, oudc.Name, "", oudc.Unit, ("", "11"), ("11", "22"), ("11", "33")); AssertCollectStartStopEventsPresent(events, IntervalSecs, 3); } @@ -532,12 +532,12 @@ public void EventSourcePublishesEndEventsOnMeterDispose() AssertBeginInstrumentReportingEventsPresent(events, c, oc, og, h, udc, oudc); AssertInitialEnumerationCompleteEventPresent(events); - AssertCounterEventsPresent(events, meterA.Name, c.Name, "", c.Unit, "5", "12"); - AssertCounterEventsPresent(events, meterA.Name, oc.Name, "", oc.Unit, "", "7", "7"); + AssertCounterEventsPresent(events, meterA.Name, c.Name, "", c.Unit, ("5", "5"), ("12", "17")); + AssertCounterEventsPresent(events, meterA.Name, oc.Name, "", oc.Unit, ("", "10"), ("7", "17"), ("7", "24")); AssertGaugeEventsPresent(events, meterA.Name, og.Name, "", og.Unit, "9", "18", "27"); AssertHistogramEventsPresent(events, meterB.Name, h.Name, "", h.Unit, "0.5=19;0.95=19;0.99=19", "0.5=26;0.95=26;0.99=26", "0.5=21;0.95=21;0.99=21"); - AssertUpDownCounterEventsPresent(events, meterA.Name, udc.Name, "", udc.Unit, "33", "40"); - AssertUpDownCounterEventsPresent(events, meterA.Name, oudc.Name, "", oudc.Unit, "", "11", "11"); + AssertUpDownCounterEventsPresent(events, meterA.Name, udc.Name, "", udc.Unit, ("33", "33"), ("40", "73")); + AssertUpDownCounterEventsPresent(events, meterA.Name, oudc.Name, "", oudc.Unit, ("", "11"), ("11", "22"), ("11", "33")); AssertCollectStartStopEventsPresent(events, IntervalSecs, 4); AssertEndInstrumentReportingEventsPresent(events, c, oc, og, udc, oudc); } @@ -626,13 +626,13 @@ public void EventSourcePublishesAllDataTypes() AssertBeginInstrumentReportingEventsPresent(events, i, s, b, l, dec, f, d); AssertInitialEnumerationCompleteEventPresent(events); - AssertCounterEventsPresent(events, meter.Name, i.Name, "", "", "1234568", "1234568"); - AssertCounterEventsPresent(events, meter.Name, s.Name, "", "", "21433", "21433"); - AssertCounterEventsPresent(events, meter.Name, b.Name, "", "", "2", "2"); - AssertCounterEventsPresent(events, meter.Name, l.Name, "", "", "123456789013", "123456789013"); - AssertCounterEventsPresent(events, meter.Name, dec.Name, "", "", "123456789012346", "123456789012346"); - AssertCounterEventsPresent(events, meter.Name, f.Name, "", "", "123457.7890625", "123457.7890625"); - AssertCounterEventsPresent(events, meter.Name, d.Name, "", "", "87654321987655.4", "87654321987655.4"); + AssertCounterEventsPresent(events, meter.Name, i.Name, "", "", ("1234568", "1234568"), ("1234568", "2469136")); + AssertCounterEventsPresent(events, meter.Name, s.Name, "", "", ("21433", "21433"), ("21433", "42866")); + AssertCounterEventsPresent(events, meter.Name, b.Name, "", "", ("2", "2"), ("2", "4")); + AssertCounterEventsPresent(events, meter.Name, l.Name, "", "", ("123456789013", "123456789013"), ("123456789013", "246913578026")); + AssertCounterEventsPresent(events, meter.Name, dec.Name, "", "", ("123456789012346", "123456789012346"), ("123456789012346", "246913578024692")); + AssertCounterEventsPresent(events, meter.Name, f.Name, "", "", ("123457.7890625", "123457.7890625"), ("123457.7890625", "246915.578125")); + AssertCounterEventsPresent(events, meter.Name, d.Name, "", "", ("87654321987655.4", "87654321987655.4"), ("87654321987655.4", "175308643975310.8")); AssertCollectStartStopEventsPresent(events, IntervalSecs, 3); } @@ -664,8 +664,8 @@ public void EventSourceEnforcesTimeSeriesLimit() AssertBeginInstrumentReportingEventsPresent(events, c); AssertInitialEnumerationCompleteEventPresent(events); - AssertCounterEventsPresent(events, meter.Name, c.Name, "Color=red", "", "5", "12"); - AssertCounterEventsPresent(events, meter.Name, c.Name, "Color=blue", "", "6", "13"); + AssertCounterEventsPresent(events, meter.Name, c.Name, "Color=red", "", ("5", "5"), ("12", "17")); + AssertCounterEventsPresent(events, meter.Name, c.Name, "Color=blue", "", ("6", "6"), ("13", "19")); AssertTimeSeriesLimitPresent(events); AssertCounterEventsNotPresent(events, meter.Name, c.Name, "Color=green"); AssertCounterEventsNotPresent(events, meter.Name, c.Name, "Color=yellow"); @@ -731,7 +731,7 @@ public void EventSourceHandlesObservableCallbackException() AssertBeginInstrumentReportingEventsPresent(events, c, oc); AssertInitialEnumerationCompleteEventPresent(events); - AssertCounterEventsPresent(events, meter.Name, c.Name, "", "", "5", "12"); + AssertCounterEventsPresent(events, meter.Name, c.Name, "", "", ("5", "5"), ("12", "17")); AssertObservableCallbackErrorPresent(events); AssertCollectStartStopEventsPresent(events, IntervalSecs, 3); } @@ -768,12 +768,12 @@ public void EventSourceWorksWithSequentialListeners() AssertBeginInstrumentReportingEventsPresent(events, c, oc, og, h, udc, oudc); AssertInitialEnumerationCompleteEventPresent(events); - AssertCounterEventsPresent(events, meter.Name, c.Name, "", "", "5", "12"); - AssertCounterEventsPresent(events, meter.Name, oc.Name, "", "", "", "7"); + AssertCounterEventsPresent(events, meter.Name, c.Name, "", "", ("5", "5"), ("12", "17")); + AssertCounterEventsPresent(events, meter.Name, oc.Name, "", "", ("", "10"), ("7", "17")); AssertGaugeEventsPresent(events, meter.Name, og.Name, "", "", "9", "18"); AssertHistogramEventsPresent(events, meter.Name, h.Name, "", "", "0.5=19;0.95=19;0.99=19", "0.5=26;0.95=26;0.99=26"); - AssertUpDownCounterEventsPresent(events, meter.Name, udc.Name, "", "", "33", "40"); - AssertUpDownCounterEventsPresent(events, meter.Name, oudc.Name, "", "", "", "11"); + AssertUpDownCounterEventsPresent(events, meter.Name, udc.Name, "", "", ("33", "33"), ("40", "73")); + AssertUpDownCounterEventsPresent(events, meter.Name, oudc.Name, "", "", ("", "11"), ("11", "22")); AssertCollectStartStopEventsPresent(events, IntervalSecs, 3); // Now create a new listener and do everything a 2nd time. Because the listener above has been disposed the source should be @@ -795,12 +795,12 @@ public void EventSourceWorksWithSequentialListeners() AssertBeginInstrumentReportingEventsPresent(events, c, oc, og, h, udc, oudc); AssertInitialEnumerationCompleteEventPresent(events); - AssertCounterEventsPresent(events, meter.Name, c.Name, "", "", "5", "12"); - AssertCounterEventsPresent(events, meter.Name, oc.Name, "", "", "", "7"); + AssertCounterEventsPresent(events, meter.Name, c.Name, "", "", ("5", "5"), ("12", "17")); + AssertCounterEventsPresent(events, meter.Name, oc.Name, "", "", ("", "31"), ("7", "38")); AssertGaugeEventsPresent(events, meter.Name, og.Name, "", "", "36", "45"); AssertHistogramEventsPresent(events, meter.Name, h.Name, "", "", "0.5=19;0.95=19;0.99=19", "0.5=26;0.95=26;0.99=26"); - AssertUpDownCounterEventsPresent(events, meter.Name, udc.Name, "", "", "33", "40"); - AssertUpDownCounterEventsPresent(events, meter.Name, oudc.Name, "", "", "", "11"); + AssertUpDownCounterEventsPresent(events, meter.Name, udc.Name, "", "", ("33", "33"), ("40", "73")); + AssertUpDownCounterEventsPresent(events, meter.Name, oudc.Name, "", "", ("", "44"), ("11", "55")); AssertCollectStartStopEventsPresent(events, IntervalSecs, 3); } @@ -944,19 +944,19 @@ private void AssertInstrumentPublishingEventsPresent(EventWrittenEventArgs[] eve } private void AssertCounterEventsPresent(EventWrittenEventArgs[] events, string meterName, string instrumentName, string tags, - string expectedUnit, params string[] expectedRates) + string expectedUnit, params (string, string)[] expected) { - AssertGenericCounterEventsPresent("CounterRateValuePublished", events, meterName, instrumentName, tags, expectedUnit, expectedRates); + AssertGenericCounterEventsPresent("CounterRateValuePublished", events, meterName, instrumentName, tags, expectedUnit, expected); } private void AssertUpDownCounterEventsPresent(EventWrittenEventArgs[] events, string meterName, string instrumentName, string tags, - string expectedUnit, params string[] expectedRates) + string expectedUnit, params (string, string)[] expected) { - AssertGenericCounterEventsPresent("UpDownCounterRateValuePublished", events, meterName, instrumentName, tags, expectedUnit, expectedRates); + AssertGenericCounterEventsPresent("UpDownCounterRateValuePublished", events, meterName, instrumentName, tags, expectedUnit, expected); } private void AssertGenericCounterEventsPresent(string eventName, EventWrittenEventArgs[] events, string meterName, string instrumentName, string tags, - string expectedUnit, params string[] expectedRates) + string expectedUnit, params (string, string)[] expected) { var counterEvents = events.Where(e => e.EventName == eventName).Select(e => new @@ -966,14 +966,16 @@ private void AssertGenericCounterEventsPresent(string eventName, EventWrittenEve InstrumentName = e.Payload[3].ToString(), Unit = e.Payload[4].ToString(), Tags = e.Payload[5].ToString(), - Rate = e.Payload[6].ToString() + Rate = e.Payload[6].ToString(), + Value = e.Payload[7].ToString() }).ToArray(); var filteredEvents = counterEvents.Where(e => e.MeterName == meterName && e.InstrumentName == instrumentName && e.Tags == tags).ToArray(); - Assert.True(filteredEvents.Length >= expectedRates.Length); - for (int i = 0; i < expectedRates.Length; i++) + Assert.True(filteredEvents.Length >= expected.Length); + for (int i = 0; i < expected.Length; i++) { Assert.Equal(expectedUnit, filteredEvents[i].Unit); - Assert.Equal(expectedRates[i], filteredEvents[i].Rate); + Assert.Equal(expected[i].Item1, filteredEvents[i].Rate); + Assert.Equal(expected[i].Item2, filteredEvents[i].Value); } }