aboutsummaryrefslogtreecommitdiffstats
path: root/server/sonar-ce-task
diff options
context:
space:
mode:
authorSébastien Lesaint <sebastien.lesaint@sonarsource.com>2018-10-10 11:06:59 +0200
committerSonarTech <sonartech@sonarsource.com>2018-10-11 20:20:54 +0200
commit66def08e9bb337dc79d59279ea417a79366e2ad6 (patch)
treea01b4cf62aa758d9da008717f77b6f389b9e3d52 /server/sonar-ce-task
parent32366453776c56e7365dbfe1ad8438885991778f (diff)
downloadsonarqube-66def08e9bb337dc79d59279ea417a79366e2ad6.tar.gz
sonarqube-66def08e9bb337dc79d59279ea417a79366e2ad6.zip
SONAR-11278 log failing computation step
Diffstat (limited to 'server/sonar-ce-task')
-rw-r--r--server/sonar-ce-task/src/main/java/org/sonar/ce/task/step/ComputationStepExecutor.java15
-rw-r--r--server/sonar-ce-task/src/test/java/org/sonar/ce/task/step/ComputationStepExecutorTest.java41
2 files changed, 49 insertions, 7 deletions
diff --git a/server/sonar-ce-task/src/main/java/org/sonar/ce/task/step/ComputationStepExecutor.java b/server/sonar-ce-task/src/main/java/org/sonar/ce/task/step/ComputationStepExecutor.java
index 381a824cc32..8318fe8d8ab 100644
--- a/server/sonar-ce-task/src/main/java/org/sonar/ce/task/step/ComputationStepExecutor.java
+++ b/server/sonar-ce-task/src/main/java/org/sonar/ce/task/step/ComputationStepExecutor.java
@@ -26,6 +26,7 @@ import org.sonar.api.utils.log.Loggers;
import org.sonar.core.util.logs.Profiler;
import static com.google.common.base.Preconditions.checkArgument;
+import static java.lang.String.format;
import static java.util.Objects.requireNonNull;
public final class ComputationStepExecutor {
@@ -65,8 +66,18 @@ public final class ComputationStepExecutor {
StepStatisticsImpl statistics = new StepStatisticsImpl(stepProfiler);
ComputationStep.Context context = new StepContextImpl(statistics);
for (ComputationStep step : steps.instances()) {
- stepProfiler.start();
+ executeStep(stepProfiler, context, step);
+ }
+ }
+
+ private static void executeStep(Profiler stepProfiler, ComputationStep.Context context, ComputationStep step) {
+ String status = "FAILED";
+ stepProfiler.start();
+ try {
step.execute(context);
+ status = "SUCCESS";
+ } finally {
+ stepProfiler.addContext("status", status);
stepProfiler.stopInfo(step.getDescription());
}
}
@@ -96,7 +107,7 @@ public final class ComputationStepExecutor {
@Override
public ComputationStep.Statistics add(String key, Object value) {
requireNonNull(key, "Statistic has null key");
- requireNonNull(value, () -> String.format("Statistic with key [%s] has null value", key));
+ requireNonNull(value, () -> format("Statistic with key [%s] has null value", key));
checkArgument(!key.equalsIgnoreCase("time"), "Statistic with key [time] is not accepted");
checkArgument(!profiler.hasContext(key), "Statistic with key [%s] is already present", key);
profiler.addContext(key, value);
diff --git a/server/sonar-ce-task/src/test/java/org/sonar/ce/task/step/ComputationStepExecutorTest.java b/server/sonar-ce-task/src/test/java/org/sonar/ce/task/step/ComputationStepExecutorTest.java
index 8e7acad22f5..71810a3ce55 100644
--- a/server/sonar-ce-task/src/test/java/org/sonar/ce/task/step/ComputationStepExecutorTest.java
+++ b/server/sonar-ce-task/src/test/java/org/sonar/ce/task/step/ComputationStepExecutorTest.java
@@ -91,15 +91,46 @@ public class ComputationStepExecutorTest {
try (ChangeLogLevel executor = new ChangeLogLevel(ComputationStepExecutor.class, LoggerLevel.INFO);
ChangeLogLevel logLevel1 = new ChangeLogLevel(step1.getClass(), LoggerLevel.INFO);
- ChangeLogLevel logLevel2 = new ChangeLogLevel(step1.getClass(), LoggerLevel.INFO);
- ChangeLogLevel logLevel3 = new ChangeLogLevel(step2.getClass(), LoggerLevel.INFO)) {
+ ChangeLogLevel logLevel2 = new ChangeLogLevel(step2.getClass(), LoggerLevel.INFO);
+ ChangeLogLevel logLevel3 = new ChangeLogLevel(step3.getClass(), LoggerLevel.INFO)) {
new ComputationStepExecutor(mockComputationSteps(step1, step2, step3)).execute();
List<String> infoLogs = logTester.logs(LoggerLevel.INFO);
assertThat(infoLogs).hasSize(3);
- assertThat(infoLogs.get(0)).contains("Step One | foo=100 | bar=20 | time=");
- assertThat(infoLogs.get(1)).contains("Step Two | foo=50 | baz=10 | time=");
- assertThat(infoLogs.get(2)).contains("Step Three | time=");
+ assertThat(infoLogs.get(0)).contains("Step One | foo=100 | bar=20 | status=SUCCESS | time=");
+ assertThat(infoLogs.get(1)).contains("Step Two | foo=50 | baz=10 | status=SUCCESS | time=");
+ assertThat(infoLogs.get(2)).contains("Step Three | status=SUCCESS | time=");
+ }
+ }
+
+ @Test
+ public void execute_logs_end_timing_and_statistics_for_each_ComputationStep_in_INFO_level_even_if_failed() {
+ RuntimeException expected = new RuntimeException("faking step failing with RuntimeException");
+ ComputationStep step1 = new StepWithStatistics("Step One", "foo", "100", "bar", "20");
+ ComputationStep step2 = new StepWithStatistics("Step Two", "foo", "50", "baz", "10");
+ ComputationStep step3 = new StepWithStatistics("Step Three", "donut", "crash") {
+ @Override
+ public void execute(Context context) {
+ super.execute(context);
+ throw expected;
+ }
+ } ;
+
+ try (ChangeLogLevel executor = new ChangeLogLevel(ComputationStepExecutor.class, LoggerLevel.INFO);
+ ChangeLogLevel logLevel1 = new ChangeLogLevel(step1.getClass(), LoggerLevel.INFO);
+ ChangeLogLevel logLevel2 = new ChangeLogLevel(step2.getClass(), LoggerLevel.INFO);
+ ChangeLogLevel logLevel3 = new ChangeLogLevel(step3.getClass(), LoggerLevel.INFO)) {
+
+ try {
+ new ComputationStepExecutor(mockComputationSteps(step1, step2, step3)).execute();
+ fail("a RuntimeException should have been thrown");
+ } catch (RuntimeException e) {
+ List<String> infoLogs = logTester.logs(LoggerLevel.INFO);
+ assertThat(infoLogs).hasSize(3);
+ assertThat(infoLogs.get(0)).contains("Step One | foo=100 | bar=20 | status=SUCCESS | time=");
+ assertThat(infoLogs.get(1)).contains("Step Two | foo=50 | baz=10 | status=SUCCESS | time=");
+ assertThat(infoLogs.get(2)).contains("Step Three | donut=crash | status=FAILED | time=");
+ }
}
}