aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlain Kermis <alain.kermis@sonarsource.com>2025-04-24 16:59:31 +0200
committersonartech <sonartech@sonarsource.com>2025-04-25 20:04:26 +0000
commit4d7fd796314303e23d280250ba43a4540182869f (patch)
treec4067bfbe534165e86922a9e5551c3670efce51a
parentf34c30d04f477d1187aead0744aeee395c761d52 (diff)
downloadsonarqube-4d7fd796314303e23d280250ba43a4540182869f.tar.gz
sonarqube-4d7fd796314303e23d280250ba43a4540182869f.zip
SONAR-23358 Add logging to issues happening on monitoring tasks
-rw-r--r--server/sonar-webserver-monitoring/build.gradle11
-rw-r--r--server/sonar-webserver-monitoring/src/main/java/org/sonar/server/monitoring/MainCollector.java16
-rw-r--r--server/sonar-webserver-monitoring/src/test/java/org/sonar/server/monitoring/MainCollectorTest.java45
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)));
+ }
}