Skip to content

Commit ae9f9c8

Browse files
committed
chore: Use Task.WhenAny's output to avoid a double await
Also enable tests for PeriodicExportingMetricReaderTaskWorker to improve coverage
1 parent 91d28c7 commit ae9f9c8

File tree

3 files changed

+15
-9
lines changed

3 files changed

+15
-9
lines changed

src/OpenTelemetry/Internal/PeriodicExportingMetricReaderTaskWorker.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -127,10 +127,13 @@ private async Task ExporterProcAsync()
127127
{
128128
var timeout = (int)(this.exportIntervalMilliseconds - (sw.ElapsedMilliseconds % this.exportIntervalMilliseconds));
129129

130+
var exportTriggerTask = this.exportTrigger.WaitAsync(cancellationToken);
131+
Task? triggeredTask = null;
132+
130133
try
131134
{
132-
await Task.WhenAny(
133-
this.exportTrigger.WaitAsync(cancellationToken),
135+
triggeredTask = await Task.WhenAny(
136+
exportTriggerTask,
134137
Task.Delay(timeout, cancellationToken)).ConfigureAwait(false);
135138
}
136139
catch (OperationCanceledException)
@@ -151,9 +154,9 @@ await Task.WhenAny(
151154
}
152155

153156
// Check if the trigger was signaled by trying to acquire it with a timeout of 0
154-
var wasTriggered = await this.exportTrigger.WaitAsync(0, cancellationToken).ConfigureAwait(false);
157+
var exportWasTriggered = triggeredTask == exportTriggerTask;
155158

156-
if (wasTriggered)
159+
if (exportWasTriggered)
157160
{
158161
OpenTelemetrySdkEventSource.Log.MetricReaderEvent("PeriodicExportingMetricReader calling MetricReader.Collect because Export was triggered.");
159162
}

test/OpenTelemetry.Tests/Internal/PeriodicExportingMetricReaderHelperTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,6 @@ private static PeriodicExportingMetricReader CreatePeriodicExportingMetricReader
149149
#pragma warning disable CA2000 // Dispose objects before losing scope
150150
var dummyMetricExporter = new InMemoryExporter<Metric>(Array.Empty<Metric>());
151151
#pragma warning restore CA2000 // Dispose objects before losing scope
152-
return PeriodicExportingMetricReaderHelper.CreatePeriodicExportingMetricReader(dummyMetricExporter, options, useThreads: true);
152+
return PeriodicExportingMetricReaderHelper.CreatePeriodicExportingMetricReader(dummyMetricExporter, options, useThreads: useThreads);
153153
}
154154
}

test/OpenTelemetry.Tests/Metrics/MetricPointReclaimTests.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// SPDX-License-Identifier: Apache-2.0
33

44
using System.Diagnostics.Metrics;
5+
using Microsoft.ApplicationInsights.Extensibility.Implementation;
56
using OpenTelemetry.Tests;
67
using Xunit;
78

@@ -10,9 +11,11 @@ namespace OpenTelemetry.Metrics.Tests;
1011
public class MetricPointReclaimTests
1112
{
1213
[Theory]
13-
[InlineData(false)]
14-
[InlineData(true)]
15-
public void MeasurementsAreNotDropped(bool emitMetricWithNoDimensions)
14+
[InlineData(false, false)]
15+
[InlineData(true, false)]
16+
[InlineData(false, true)]
17+
[InlineData(true, true)]
18+
public void MeasurementsAreNotDropped(bool emitMetricWithNoDimensions, bool useThreads)
1619
{
1720
using var meter = new Meter(Utils.GetCurrentMethodName());
1821
var counter = meter.CreateCounter<long>("MyFruitCounter");
@@ -21,7 +24,7 @@ public void MeasurementsAreNotDropped(bool emitMetricWithNoDimensions)
2124
int maxNumberofDistinctMetricPoints = 4000; // Default max MetricPoints * 2
2225

2326
using var exporter = new CustomExporter(assertNoDroppedMeasurements: true);
24-
using var metricReader = new PeriodicExportingMetricReader(exporter, exportIntervalMilliseconds: 10)
27+
using var metricReader = new PeriodicExportingMetricReader(exporter, exportIntervalMilliseconds: 10, useThreads: useThreads)
2528
{
2629
TemporalityPreference = MetricReaderTemporalityPreference.Delta,
2730
};

0 commit comments

Comments
 (0)