diff options
author | Alain Kermis <alain.kermis@sonarsource.com> | 2025-04-24 16:59:31 +0200 |
---|---|---|
committer | sonartech <sonartech@sonarsource.com> | 2025-04-25 20:04:26 +0000 |
commit | 4d7fd796314303e23d280250ba43a4540182869f (patch) | |
tree | c4067bfbe534165e86922a9e5551c3670efce51a | |
parent | f34c30d04f477d1187aead0744aeee395c761d52 (diff) | |
download | sonarqube-4d7fd796314303e23d280250ba43a4540182869f.tar.gz sonarqube-4d7fd796314303e23d280250ba43a4540182869f.zip |
SONAR-23358 Add logging to issues happening on monitoring tasks
3 files changed, 57 insertions, 15 deletions
diff --git a/server/sonar-webserver-monitoring/build.gradle b/server/sonar-webserver-monitoring/build.gradle index 84fb86e4fb2..d5fe638db08 100644 --- a/server/sonar-webserver-monitoring/build.gradle +++ b/server/sonar-webserver-monitoring/build.gradle @@ -9,6 +9,17 @@ dependencies { testImplementation 'junit:junit' testImplementation 'org.assertj:assertj-core' + testImplementation 'org.awaitility:awaitility' + testImplementation 'org.junit.jupiter:junit-jupiter-api' + testImplementation 'org.junit.jupiter:junit-jupiter-params' testImplementation 'org.mockito:mockito-core' testImplementation 'org.sonarsource.api.plugin:sonar-plugin-api-test-fixtures' + + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine' + testRuntimeOnly 'org.junit.vintage:junit-vintage-engine' +} + +test { + // Enabling the JUnit Platform (see https://github.com/junit-team/junit5-samples/tree/master/junit5-migration-gradle) + useJUnitPlatform() } diff --git a/server/sonar-webserver-monitoring/src/main/java/org/sonar/server/monitoring/MainCollector.java b/server/sonar-webserver-monitoring/src/main/java/org/sonar/server/monitoring/MainCollector.java index 02be4e82a0d..8f15ad207f1 100644 --- a/server/sonar-webserver-monitoring/src/main/java/org/sonar/server/monitoring/MainCollector.java +++ b/server/sonar-webserver-monitoring/src/main/java/org/sonar/server/monitoring/MainCollector.java @@ -21,14 +21,19 @@ package org.sonar.server.monitoring; import com.google.common.annotations.VisibleForTesting; import com.google.common.util.concurrent.ThreadFactoryBuilder; +import java.util.Arrays; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.sonar.api.Startable; import static java.util.concurrent.TimeUnit.MILLISECONDS; public class MainCollector implements Startable { + private static final Logger LOG = LoggerFactory.getLogger(MainCollector.class); + private final MonitoringTask[] monitoringTasks; private ScheduledExecutorService scheduledExecutorService; @@ -43,9 +48,14 @@ public class MainCollector implements Startable { .setDaemon(true) .setNameFormat(getClass().getCanonicalName() + "-thread-%d") .build()); - for (MonitoringTask task : monitoringTasks) { - scheduledExecutorService.scheduleWithFixedDelay(task, task.getDelay(), task.getPeriod(), MILLISECONDS); - } + Arrays.stream(monitoringTasks).forEach(task -> + scheduledExecutorService.scheduleWithFixedDelay(() -> { + try { + task.run(); + } catch (Exception e) { + LOG.warn("Error while executing monitoring task in {}: ", task.getClass().getSimpleName(), e); + } + }, task.getDelay(), task.getPeriod(), MILLISECONDS)); } @Override diff --git a/server/sonar-webserver-monitoring/src/test/java/org/sonar/server/monitoring/MainCollectorTest.java b/server/sonar-webserver-monitoring/src/test/java/org/sonar/server/monitoring/MainCollectorTest.java index 1ff72da45b3..e22d28cf2ab 100644 --- a/server/sonar-webserver-monitoring/src/test/java/org/sonar/server/monitoring/MainCollectorTest.java +++ b/server/sonar-webserver-monitoring/src/test/java/org/sonar/server/monitoring/MainCollectorTest.java @@ -19,26 +19,34 @@ */ package org.sonar.server.monitoring; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import java.util.concurrent.TimeUnit; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; +import org.sonar.api.testfixtures.log.LogTesterJUnit5; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.awaitility.Awaitility.await; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -public class MainCollectorTest { +class MainCollectorTest { + + @RegisterExtension + private final LogTesterJUnit5 logTester = new LogTesterJUnit5(); private final MonitoringTask task1 = mock(MonitoringTask.class); private final MonitoringTask task2 = mock(MonitoringTask.class); private MainCollector underTest; - @Before - public void before() { + @BeforeEach + void before() { MonitoringTask[] tasks = {task1, task2}; for(MonitoringTask task : tasks) { when(task.getDelay()).thenReturn(1L); @@ -47,13 +55,13 @@ public class MainCollectorTest { underTest = new MainCollector(tasks); } - @After - public void stop() { + @AfterEach + void stop() { underTest.stop(); } @Test - public void startAndStop_executorServiceIsShutdown() { + void startAndStop_executorServiceIsShutdown() { underTest.start(); assertFalse(underTest.getScheduledExecutorService().isShutdown()); @@ -64,7 +72,7 @@ public class MainCollectorTest { } @Test - public void start_givenTwoTasks_callsGetsDelayAndPeriodFromTasks() { + void start_givenTwoTasks_callsGetsDelayAndPeriodFromTasks() { underTest.start(); verify(task1, times(1)).getDelay(); @@ -72,4 +80,17 @@ public class MainCollectorTest { verify(task2, times(1)).getDelay(); verify(task2, times(1)).getPeriod(); } + + @Test + void start_logsExceptionAsWarn_whenTaskThrowsException() { + doThrow(new RuntimeException()).when(task1).run(); + + underTest.start(); + + String expectedLogMessage = "Error while executing monitoring task in " + task1.getClass().getSimpleName(); + await() + .atMost(1, TimeUnit.SECONDS) + .until(() -> logTester.logs().stream() + .anyMatch(log -> log.contains(expectedLogMessage))); + } } |