Skip to content

Commit 98759f5

Browse files
committed
Drop non-finite values in sum metrics only
1 parent 0c32ff3 commit 98759f5

2 files changed

Lines changed: 59 additions & 3 deletions

File tree

src/OpenTelemetry/Metrics/MeterProviderSdk.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -219,9 +219,13 @@ internal static void MeasurementRecordedDouble(Instrument instrument, double val
219219
return;
220220
}
221221

222-
if (!MathHelper.IsFinite(value))
222+
if (!MathHelper.IsFinite(value)
223+
&& instrument is Counter<double>
224+
or UpDownCounter<double>
225+
or ObservableCounter<double>
226+
or ObservableUpDownCounter<double>)
223227
{
224-
OpenTelemetrySdkEventSource.Log.MeasurementDropped(instrument?.Name ?? "UnknownInstrument", "Measurement value was invalid.", "Use a finite value for measurements (not NaN or Infinity).");
228+
OpenTelemetrySdkEventSource.Log.MeasurementDropped(instrument?.Name ?? "UnknownInstrument", "Measurement value was invalid.", "Use a finite value for sum instruments (not NaN or Infinity).");
225229
return;
226230
}
227231

test/OpenTelemetry.Tests/Metrics/MeterProviderSdkTests.cs

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ void RunTest()
106106
}
107107

108108
[Fact]
109-
public void NonFiniteDoubleMeasurementsAreDropped()
109+
public void NonFiniteCounterDoubleMeasurementsAreDropped()
110110
{
111111
var meterName = Utils.GetCurrentMethodName();
112112
var exportedItems = new List<Metric>();
@@ -125,9 +125,61 @@ public void NonFiniteDoubleMeasurementsAreDropped()
125125
counter.Add(2.5);
126126

127127
Assert.True(meterProvider.ForceFlush());
128+
129+
var exportedMetric = Assert.Single(exportedItems);
130+
var metric = new MetricSnapshot(exportedMetric);
131+
var metricPoint = Assert.Single(metric.MetricPoints);
132+
Assert.Equal(2.5, metricPoint.GetSumDouble());
133+
}
134+
135+
[Fact]
136+
public void NonFiniteUpDownCounterDoubleMeasurementsAreDropped()
137+
{
138+
var meterName = Utils.GetCurrentMethodName();
139+
var exportedItems = new List<Metric>();
140+
141+
using var meterProvider = Sdk.CreateMeterProviderBuilder()
142+
.AddMeter(meterName)
143+
.AddInMemoryExporter(exportedItems)
144+
.Build();
145+
146+
using var meter = new Meter(meterName);
147+
var upDownCounter = meter.CreateUpDownCounter<double>("updowncounter");
148+
149+
upDownCounter.Add(double.PositiveInfinity);
150+
upDownCounter.Add(double.NegativeInfinity);
151+
upDownCounter.Add(2.5);
152+
153+
Assert.True(meterProvider.ForceFlush());
154+
128155
var exportedMetric = Assert.Single(exportedItems);
129156
var metric = new MetricSnapshot(exportedMetric);
130157
var metricPoint = Assert.Single(metric.MetricPoints);
131158
Assert.Equal(2.5, metricPoint.GetSumDouble());
132159
}
160+
161+
[Fact]
162+
public void NaNHistogramMeasurementsAreNotDropped()
163+
{
164+
var meterName = Utils.GetCurrentMethodName();
165+
var exportedItems = new List<Metric>();
166+
167+
using var meterProvider = Sdk.CreateMeterProviderBuilder()
168+
.AddMeter(meterName)
169+
.AddInMemoryExporter(exportedItems)
170+
.Build();
171+
172+
using var meter = new Meter(meterName);
173+
var histogram = meter.CreateHistogram<double>("histogram");
174+
175+
histogram.Record(18);
176+
histogram.Record(double.NaN);
177+
178+
Assert.True(meterProvider.ForceFlush());
179+
180+
var exportedMetric = Assert.Single(exportedItems);
181+
var metric = new MetricSnapshot(exportedMetric);
182+
var metricPoint = Assert.Single(metric.MetricPoints);
183+
Assert.True(double.IsNaN(metricPoint.GetHistogramSum()));
184+
}
133185
}

0 commit comments

Comments
 (0)