Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -105,9 +105,9 @@ public void CollectionStop(string sessionId, DateTime intervalStartTime, DateTim
[Event(4, Keywords = Keywords.TimeSeriesValues)]
[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)]
Expand Down Expand Up @@ -194,9 +194,9 @@ public void MultipleSessionsNotSupportedError(string runningSessionId)
[Event(16, Keywords = Keywords.TimeSeriesValues)]
[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);
}

/// <summary>
Expand Down Expand Up @@ -418,12 +418,14 @@ private static void TransmitMetricValue(Instrument instrument, LabeledAggregatio
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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ namespace System.Diagnostics.Metrics
internal sealed class RateSumAggregator : Aggregator
{
private readonly bool _isMonotonic;
private double _sum;
private double _delta;
private double _aggregatedValue;

public RateSumAggregator(bool isMonotonic)
{
Expand All @@ -17,16 +18,17 @@ public override void Update(double value)
{
lock (this)
{
_sum += value;
_delta += value;
}
}

public override IAggregationStatistics Collect()
{
lock (this)
{
RateStatistics? stats = new RateStatistics(_sum, _isMonotonic);
_sum = 0;
_aggregatedValue += _delta;
RateStatistics? stats = new RateStatistics(_delta, _isMonotonic, _aggregatedValue);
_delta = 0;
return stats;
}
}
Expand All @@ -36,7 +38,9 @@ internal sealed class RateAggregator : Aggregator
{
private readonly bool _isMonotonic;
private double? _prevValue;
private double _value;
private double _currValue;
private double _aggregatedValue;
private bool _updated;

public RateAggregator(bool isMonotonic)
{
Expand All @@ -47,7 +51,8 @@ public override void Update(double value)
{
lock (this)
{
_value = value;
_currValue = value;
_updated = true;
}
}

Expand All @@ -58,25 +63,31 @@ 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;
_aggregatedValue += _updated ? _currValue : 0;
_updated = false;

RateStatistics stats = new RateStatistics(delta, _isMonotonic, _aggregatedValue);
_prevValue = _currValue;
return stats;
}
}
}

internal sealed class RateStatistics : IAggregationStatistics
{
public RateStatistics(double? delta, bool isMonotonic)
public RateStatistics(double? delta, bool isMonotonic, double value)
{
Delta = delta;
IsMonotonic = isMonotonic;
Value = value;
}

public double? Delta { get; }

public bool IsMonotonic { get; }

public double Value { get; }
}
}
Loading