import org.sonar.api.utils.System2;
import org.sonar.api.utils.log.Logger;
import org.sonar.api.utils.log.Loggers;
-import org.sonar.api.utils.log.Profiler;
+import org.sonar.core.util.logs.Profiler;
import org.sonar.server.computation.activity.ActivityManager;
import org.sonar.server.computation.step.ComputationStep;
import org.sonar.server.computation.step.ComputationSteps;
+import static java.lang.String.format;
import static org.sonar.db.compute.AnalysisReportDto.Status.FAILED;
import static org.sonar.db.compute.AnalysisReportDto.Status.SUCCESS;
public void process() {
String projectKey = item.dto.getProjectKey();
- Profiler profiler = Profiler.create(LOG).startDebug(
- String.format("Analysis of project %s (report %d)", projectKey, item.dto.getId())
- );
+ String message = format("Analysis of project %s (report %d)", projectKey, item.dto.getId());
+ Profiler profiler = Profiler.create(LOG).startDebug(message);
+ long timingSum = 0L;
+ Profiler stepProfiler = Profiler.create(LOG);
try {
for (ComputationStep step : steps.instances()) {
- Profiler stepProfiler = Profiler.createIfDebug(LOG).startDebug(step.getDescription());
+ stepProfiler.start();
step.execute();
- stepProfiler.stopDebug();
+ timingSum += stepProfiler.stopInfo(step.getDescription());
}
item.dto.setStatus(SUCCESS);
} catch (Throwable e) {
} finally {
item.dto.setFinishedAt(system.now());
activityManager.saveActivity(item.dto);
- profiler.stopInfo();
+ profiler.stopInfo(format("%s total time spent in steps=%sms", message, timingSum));
}
}
}
*/
package org.sonar.server.computation.container;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Member;
import java.util.Arrays;
import java.util.List;
import org.picocontainer.ComponentAdapter;
+import org.picocontainer.ComponentMonitor;
import org.picocontainer.DefaultPicoContainer;
import org.picocontainer.MutablePicoContainer;
+import org.picocontainer.PicoContainer;
import org.picocontainer.behaviors.OptInCaching;
import org.picocontainer.lifecycle.ReflectionLifecycleStrategy;
+import org.picocontainer.monitors.ComponentMonitorHelper;
import org.picocontainer.monitors.NullComponentMonitor;
+import org.sonar.api.utils.log.Logger;
import org.sonar.api.utils.log.Loggers;
-import org.sonar.api.utils.log.Profiler;
import org.sonar.core.issue.tracking.Tracker;
import org.sonar.core.platform.ComponentContainer;
import org.sonar.core.platform.Module;
import org.sonar.server.view.index.ViewIndex;
import static java.util.Objects.requireNonNull;
+import static org.picocontainer.monitors.ComponentMonitorHelper.ctorToString;
+import static org.picocontainer.monitors.ComponentMonitorHelper.format;
+import static org.picocontainer.monitors.ComponentMonitorHelper.methodToString;
+import static org.picocontainer.monitors.ComponentMonitorHelper.parmsToString;
public class ComputeEngineContainerImpl extends ComponentContainer implements ComputeEngineContainer {
+ private static final Logger LOG = Loggers.get(ComputeEngineContainerImpl.class);
+
private final ReportQueue.Item item;
private final ComputationSteps steps;
* and lazily starts its components.
*/
private static MutablePicoContainer createContainer(ComponentContainer parent) {
- ReflectionLifecycleStrategy lifecycleStrategy = new ReflectionLifecycleStrategy(new NullComponentMonitor(), "start", "stop", "close") {
+ ComponentMonitor componentMonitor = instanceComponentMonitor();
+ ReflectionLifecycleStrategy lifecycleStrategy = new ReflectionLifecycleStrategy(componentMonitor, "start", "stop", "close") {
@Override
public boolean isLazy(ComponentAdapter<?> adapter) {
return true;
}
-
- @Override
- public void start(Object component) {
- Profiler profiler = Profiler.createIfTrace(Loggers.get(ComponentContainer.class));
- profiler.start();
- super.start(component);
- profiler.stopTrace(component.getClass().getCanonicalName() + " started");
- }
};
- return new DefaultPicoContainer(new OptInCaching(), lifecycleStrategy, parent.getPicoContainer());
+ return new DefaultPicoContainer(new OptInCaching(), lifecycleStrategy, parent.getPicoContainer(), componentMonitor);
+ }
+
+ private static ComponentMonitor instanceComponentMonitor() {
+ if (!LOG.isTraceEnabled()) {
+ return new NullComponentMonitor();
+ }
+ return new ComputeEngineComponentMonitor();
+ }
+
+ private static class ComputeEngineComponentMonitor extends NullComponentMonitor {
+
+ public <T> void instantiated(PicoContainer container, ComponentAdapter<T> componentAdapter,
+ Constructor<T> constructor, Object instantiated, Object[] parameters, long duration) {
+ LOG.trace(format(ComponentMonitorHelper.INSTANTIATED, ctorToString(constructor), duration, instantiated.getClass().getName(), parmsToString(parameters)));
+ }
+
+ @Override
+ public void invoked(PicoContainer container, ComponentAdapter<?> componentAdapter, Member member, Object instance, long duration, Object[] args, Object retVal) {
+ LOG.trace(format(ComponentMonitorHelper.INVOKED, methodToString(member), instance, duration));
+ }
+
}
/**
return Arrays.asList(
new ComputationTempFolderProvider(),
- ActivityManager.class,
+ ActivityManager.class,
- MetricModule.class,
+ MetricModule.class,
- // holders
+ // holders
BatchReportDirectoryHolderImpl.class,
TreeRootHolderImpl.class,
PeriodsHolderImpl.class,
SqaleRatingSettings.class,
ActiveRulesHolderImpl.class,
- BatchReportReaderImpl.class,
+ BatchReportReaderImpl.class,
- // repositories
+ // repositories
LanguageRepositoryImpl.class,
MeasureRepositoryImpl.class,
EventRepositoryImpl.class,
QualityGateServiceImpl.class,
EvaluationResultTextConverterImpl.class,
- // new coverage measures
+ // new coverage measures
NewCoverageMetricKeysModule.class,
- // issues
+ // issues
RuleCacheLoader.class,
RuleRepositoryImpl.class,
ScmAccountToUserLoader.class,
IssueVisitors.class,
IssueLifecycle.class,
- // common rules
+ // common rules
CommonRuleEngineImpl.class,
BranchCoverageRule.class,
LineCoverageRule.class,
TestErrorRule.class,
SkippedTestRule.class,
- // order is important: DebtAggregator then NewDebtAggregator (new debt requires debt)
+ // order is important: DebtAggregator then NewDebtAggregator (new debt requires debt)
DebtCalculator.class,
DebtAggregator.class,
NewDebtCalculator.class,
RuleTagsCopier.class,
IssueCounter.class,
- UpdateConflictResolver.class,
+ UpdateConflictResolver.class,
TrackerBaseInputFactory.class,
TrackerRawInputFactory.class,
Tracker.class,
TrackerExecution.class,
BaseIssuesLoader.class,
- // views
+ // views
ViewIndex.class,
- // ComputationService
- ComputationService.class
- );
+ // ComputationService
+ ComputationService.class);
}
@Override