1515import static org .mockito .Mockito .verify ;
1616import static org .mockito .Mockito .when ;
1717
18+ import io .github .netmikey .logunit .api .LogCapturer ;
1819import io .opentelemetry .api .common .Attributes ;
1920import io .opentelemetry .internal .testing .slf4j .SuppressLogger ;
2021import io .opentelemetry .sdk .common .CompletableResultCode ;
4243import java .util .concurrent .TimeUnit ;
4344import java .util .concurrent .atomic .AtomicBoolean ;
4445import 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 ;
4946import javax .annotation .Nullable ;
5047import org .junit .jupiter .api .BeforeEach ;
5148import org .junit .jupiter .api .Test ;
5249import org .junit .jupiter .api .Timeout ;
5350import org .junit .jupiter .api .extension .ExtendWith ;
51+ import org .junit .jupiter .api .extension .RegisterExtension ;
5452import org .mockito .Mock ;
5553import org .mockito .junit .jupiter .MockitoExtension ;
5654import 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