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);
}
}