Skip to content

Commit 2e9efb7

Browse files
committed
Use LogCapturer extension for log assetion in tests
1 parent 4c2b9bd commit 2e9efb7

2 files changed

Lines changed: 45 additions & 86 deletions

File tree

sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/internal/SdkMeterProviderUtil.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,21 @@ public static SdkMeterProviderBuilder addMeterConfiguratorCondition(
7676
return sdkMeterProviderBuilder;
7777
}
7878

79+
/** Reflectively set the max export batch size for the {@link SdkMeterProviderBuilder}. */
80+
public static SdkMeterProviderBuilder setMaxExportBatchSize(
81+
SdkMeterProviderBuilder sdkMeterProviderBuilder, int maxExportBatchSize) {
82+
try {
83+
Method method =
84+
SdkMeterProviderBuilder.class.getDeclaredMethod("setMaxExportBatchSize", int.class);
85+
method.setAccessible(true);
86+
method.invoke(sdkMeterProviderBuilder, maxExportBatchSize);
87+
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
88+
throw new IllegalStateException(
89+
"Error calling setMaxExportBatchSize on SdkMeterProviderBuilder", e);
90+
}
91+
return sdkMeterProviderBuilder;
92+
}
93+
7994
/**
8095
* Reflectively add an {@link AttributesProcessor} to the {@link ViewBuilder} which appends
8196
* key-values from baggage to all measurements.

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

Lines changed: 30 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import static org.mockito.Mockito.verify;
1616
import static org.mockito.Mockito.when;
1717

18+
import io.github.netmikey.logunit.api.LogCapturer;
1819
import io.opentelemetry.api.common.Attributes;
1920
import io.opentelemetry.internal.testing.slf4j.SuppressLogger;
2021
import io.opentelemetry.sdk.common.CompletableResultCode;
@@ -42,15 +43,12 @@
4243
import java.util.concurrent.TimeUnit;
4344
import java.util.concurrent.atomic.AtomicBoolean;
4445
import java.util.concurrent.atomic.AtomicInteger;
45-
import java.util.logging.Handler;
46-
import java.util.logging.Level;
47-
import java.util.logging.LogRecord;
48-
import java.util.logging.Logger;
4946
import javax.annotation.Nullable;
5047
import org.junit.jupiter.api.BeforeEach;
5148
import org.junit.jupiter.api.Test;
5249
import org.junit.jupiter.api.Timeout;
5350
import org.junit.jupiter.api.extension.ExtendWith;
51+
import org.junit.jupiter.api.extension.RegisterExtension;
5452
import org.mockito.Mock;
5553
import org.mockito.junit.jupiter.MockitoExtension;
5654
import org.mockito.junit.jupiter.MockitoSettings;
@@ -81,6 +79,10 @@ class PeriodicMetricReaderTest {
8179
@Mock private CollectionRegistration collectionRegistration;
8280
@Mock private MetricExporter metricExporter;
8381

82+
@RegisterExtension
83+
LogCapturer logCapturer =
84+
LogCapturer.create().captureForLogger(PeriodicMetricReader.class.getName());
85+
8486
@BeforeEach
8587
void setup() {
8688
when(collectionRegistration.collectAllMetrics())
@@ -500,6 +502,7 @@ void periodicExport_SequentialBatches() throws Exception {
500502
}
501503

502504
@Test
505+
@SuppressLogger(PeriodicMetricReader.class)
503506
void periodicExport_SequentialBatches_PartialFailure() throws Exception {
504507
MetricExporter mockExporter = mock(MetricExporter.class);
505508
when(mockExporter.getAggregationTemporality(any()))
@@ -526,44 +529,26 @@ void periodicExport_SequentialBatches_PartialFailure() throws Exception {
526529
.thenReturn(Collections.singletonList(METRIC_DATA));
527530
reader.register(collectionRegistration);
528531

529-
Logger targetLogger = Logger.getLogger(PeriodicMetricReader.class.getName());
530-
Level originalLevel = targetLogger.getLevel();
531-
targetLogger.setLevel(Level.FINE);
532-
533-
TestHandler testHandler = new TestHandler();
534-
testHandler.setLevel(Level.FINE);
535-
targetLogger.addHandler(testHandler);
536-
537-
try {
538-
CompletableResultCode flushResult = reader.forceFlush();
532+
CompletableResultCode flushResult = reader.forceFlush();
539533

540-
verify(mockExporter, times(1)).export(any());
534+
verify(mockExporter, times(1)).export(any());
541535

542-
batch1Result.succeed();
543-
verify(mockExporter, times(2)).export(any());
536+
batch1Result.succeed();
537+
verify(mockExporter, times(2)).export(any());
544538

545-
batch2Result.fail();
546-
verify(mockExporter, times(3)).export(any());
539+
batch2Result.fail();
540+
verify(mockExporter, times(3)).export(any());
547541

548-
batch3Result.succeed();
542+
batch3Result.succeed();
549543

550-
// Failed export results are logged, but forceFlush preserves the prior partial-success
551-
// behavior.
552-
assertThat(flushResult.join(5, TimeUnit.SECONDS).isSuccess()).isTrue();
544+
// Failed export results are logged, but forceFlush preserves the prior
545+
// partial-success
546+
// behavior.
547+
assertThat(flushResult.join(5, TimeUnit.SECONDS).isSuccess()).isTrue();
553548

554-
boolean logFound =
555-
testHandler.getLogRecords().stream()
556-
.anyMatch(
557-
record ->
558-
record.getLevel().equals(Level.FINE)
559-
&& record.getMessage().equals("Exporter failed"));
560-
assertThat(logFound).isTrue();
549+
logCapturer.assertContains("Exporter failed");
561550

562-
reader.shutdown();
563-
} finally {
564-
targetLogger.removeHandler(testHandler);
565-
targetLogger.setLevel(originalLevel);
566-
}
551+
reader.shutdown();
567552
}
568553

569554
@Test
@@ -626,42 +611,22 @@ void periodicExport_SequentialBatches_PurelyAsynchronous() throws Exception {
626611
.thenReturn(Collections.singletonList(METRIC_DATA));
627612
reader.register(collectionRegistration);
628613

629-
Logger targetLogger = Logger.getLogger(PeriodicMetricReader.class.getName());
630-
Level originalLevel = targetLogger.getLevel();
631-
targetLogger.setLevel(Level.FINE);
632-
633-
TestHandler testHandler = new TestHandler();
634-
testHandler.setLevel(Level.FINE);
635-
targetLogger.addHandler(testHandler);
636-
637-
try {
638-
CompletableResultCode flushResult = reader.forceFlush();
639-
640-
verify(mockExporter, times(1)).export(any());
614+
CompletableResultCode flushResult = reader.forceFlush();
641615

642-
batch1Result.succeed();
643-
verify(mockExporter, times(2)).export(any());
616+
verify(mockExporter, times(1)).export(any());
644617

645-
batch2Result.succeed();
646-
verify(mockExporter, times(3)).export(any());
618+
batch1Result.succeed();
619+
verify(mockExporter, times(2)).export(any());
647620

648-
batch3Result.succeed();
621+
batch2Result.succeed();
622+
verify(mockExporter, times(3)).export(any());
649623

650-
assertThat(flushResult.join(5, TimeUnit.SECONDS).isSuccess()).isTrue();
624+
batch3Result.succeed();
651625

652-
boolean logFound =
653-
testHandler.getLogRecords().stream()
654-
.anyMatch(
655-
record ->
656-
record.getLevel().equals(Level.FINE)
657-
&& record.getMessage().equals("Exporter failed"));
658-
assertThat(logFound).isFalse();
626+
assertThat(flushResult.join(5, TimeUnit.SECONDS).isSuccess()).isTrue();
627+
logCapturer.assertDoesNotContain("Exporter failed");
659628

660-
reader.shutdown();
661-
} finally {
662-
targetLogger.removeHandler(testHandler);
663-
targetLogger.setLevel(originalLevel);
664-
}
629+
reader.shutdown();
665630
}
666631

667632
@Test
@@ -738,25 +703,4 @@ List<List<MetricData>> waitForNumberOfExports(int numberOfExports) throws Except
738703
return result;
739704
}
740705
}
741-
742-
private static class TestHandler extends Handler {
743-
private final List<LogRecord> logRecords = new ArrayList<>();
744-
745-
private TestHandler() {}
746-
747-
@Override
748-
public void publish(LogRecord record) {
749-
logRecords.add(record);
750-
}
751-
752-
@Override
753-
public void flush() {}
754-
755-
@Override
756-
public void close() {}
757-
758-
List<LogRecord> getLogRecords() {
759-
return logRecords;
760-
}
761-
}
762706
}

0 commit comments

Comments
 (0)