Skip to content

Commit 7e488a0

Browse files
committed
Propagate flush to PeriodicMetricReader's metricExporter.
On a synchronous exporter this doesn't matter, but the API design allows for asynchronous exporters, which requires calling flush after manually exporting. Fixes #7343
1 parent d5a2fa2 commit 7e488a0

File tree

2 files changed

+37
-1
lines changed

2 files changed

+37
-1
lines changed

sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/export/PeriodicMetricReader.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,21 @@ public MemoryMode getMemoryMode() {
8181

8282
@Override
8383
public CompletableResultCode forceFlush() {
84-
return scheduled.doRun();
84+
CompletableResultCode result = new CompletableResultCode();
85+
CompletableResultCode flushResult = scheduled.doRun();
86+
flushResult.whenComplete(
87+
() ->
88+
exporter
89+
.flush()
90+
.whenComplete(
91+
() -> {
92+
if (!flushResult.isSuccess()) {
93+
result.fail();
94+
} else {
95+
result.succeed();
96+
}
97+
}));
98+
return result;
8599
}
86100

87101
@Override

sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/export/PeriodicMetricReaderTest.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,28 @@ void flush() throws Exception {
154154
}
155155
}
156156

157+
@Test
158+
void forceflush_callsFlush() {
159+
MetricExporter metricExporter = mock(MetricExporter.class);
160+
when(metricExporter.export(any())).thenReturn(CompletableResultCode.ofSuccess());
161+
when(metricExporter.flush()).thenReturn(CompletableResultCode.ofSuccess());
162+
when(metricExporter.shutdown()).thenReturn(CompletableResultCode.ofSuccess());
163+
164+
PeriodicMetricReader reader =
165+
PeriodicMetricReader.builder(metricExporter)
166+
.setInterval(Duration.ofNanos(Long.MAX_VALUE))
167+
.build();
168+
169+
reader.register(collectionRegistration);
170+
assertThat(reader.forceFlush().join(10, TimeUnit.SECONDS).isSuccess()).isTrue();
171+
172+
try {
173+
verify(metricExporter).flush();
174+
} finally {
175+
reader.shutdown();
176+
}
177+
}
178+
157179
@Test
158180
@Timeout(2)
159181
@SuppressLogger(PeriodicMetricReader.class)

0 commit comments

Comments
 (0)