Propagate flush to PeriodicMetricReader's metricExporter. (#7410)

This commit is contained in:
Tyler Benson 2025-06-24 15:42:28 -04:00 committed by GitHub
parent b0a9deb7d8
commit aeb08f40a0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 44 additions and 1 deletions

View File

@ -81,7 +81,21 @@ public final class PeriodicMetricReader implements MetricReader {
@Override
public CompletableResultCode forceFlush() {
return scheduled.doRun();
CompletableResultCode result = new CompletableResultCode();
CompletableResultCode doRunResult = scheduled.doRun();
doRunResult.whenComplete(
() -> {
CompletableResultCode flushResult = exporter.flush();
flushResult.whenComplete(
() -> {
if (doRunResult.isSuccess() && flushResult.isSuccess()) {
result.succeed();
} else {
result.fail();
}
});
});
return result;
}
@Override

View File

@ -154,6 +154,35 @@ class PeriodicMetricReaderTest {
}
}
@Test
void forceflush_callsFlush() {
MetricExporter metricExporter = mock(MetricExporter.class);
when(metricExporter.export(any()))
.thenReturn(CompletableResultCode.ofSuccess())
.thenReturn(CompletableResultCode.ofSuccess())
.thenThrow(new RuntimeException("Export Failed!"));
when(metricExporter.flush())
.thenReturn(CompletableResultCode.ofSuccess())
.thenReturn(CompletableResultCode.ofFailure())
.thenReturn(CompletableResultCode.ofSuccess());
when(metricExporter.shutdown()).thenReturn(CompletableResultCode.ofSuccess());
PeriodicMetricReader reader =
PeriodicMetricReader.builder(metricExporter)
.setInterval(Duration.ofNanos(Long.MAX_VALUE))
.build();
try {
reader.register(collectionRegistration);
assertThat(reader.forceFlush().join(10, TimeUnit.SECONDS).isSuccess()).isTrue();
assertThat(reader.forceFlush().join(10, TimeUnit.SECONDS).isSuccess()).isFalse();
assertThat(reader.forceFlush().join(10, TimeUnit.SECONDS).isSuccess()).isFalse();
} finally {
reader.shutdown();
}
verify(metricExporter, times(3)).flush();
}
@Test
@Timeout(2)
@SuppressLogger(PeriodicMetricReader.class)