package org.spotter.ext.detection.trafficJam;
import org.aim.api.exceptions.InstrumentationException;
import org.aim.api.exceptions.MeasurementException;
import org.aim.api.measurement.dataset.Dataset;
import org.aim.api.measurement.dataset.DatasetCollection;
import org.aim.artifacts.probes.ResponsetimeProbe;
import org.aim.artifacts.records.ResponseTimeRecord;
import org.aim.artifacts.scopes.EntryPointScope;
import org.aim.description.InstrumentationDescription;
import org.aim.description.builder.InstrumentationDescriptionBuilder;
import org.lpe.common.extension.IExtension;
import org.spotter.core.ProgressManager;
import org.spotter.core.detection.AbstractDetectionController;
import org.spotter.core.detection.IDetectionController;
import org.spotter.exceptions.WorkloadException;
import org.spotter.ext.detection.trafficJam.strategies.LinearRegression;
import org.spotter.ext.detection.trafficJam.strategies.TTestStrategy;
import org.spotter.shared.result.model.SpotterResult;
public class TrafficJamDetectionController extends AbstractDetectionController {
private String analysisStrategy;
private ITrafficJamStrategy analysisStrategyImpl;
private int experimentSteps;
public TrafficJamDetectionController(IExtension<IDetectionController> provider) {
super(provider);
}
@Override
public void loadProperties() {
String experimentStepsStr = getProblemDetectionConfiguration().getProperty(
TrafficJamExtension.EXPERIMENT_STEPS_KEY);
experimentSteps = experimentStepsStr != null ? Integer.parseInt(experimentStepsStr)
: TrafficJamExtension.EXPERIMENT_STEPS_DEFAULT;
analysisStrategy = getProblemDetectionConfiguration().getProperty(TrafficJamExtension.DETECTION_STRATEGY_KEY,
TrafficJamExtension.T_TEST_STRATEGY);
switch (analysisStrategy) {
case TrafficJamExtension.T_TEST_STRATEGY:
analysisStrategyImpl = new TTestStrategy();
break;
case TrafficJamExtension.LIN_REGRESSION_STRATEGY:
analysisStrategyImpl = new LinearRegression();
break;
default:
analysisStrategyImpl = new TTestStrategy();
}
analysisStrategyImpl.setMainDetectionController(this);
analysisStrategyImpl.setProblemDetectionConfiguration(getProblemDetectionConfiguration());
}
@Override
public long getExperimentSeriesDuration() {
return ProgressManager.getInstance().calculateDefaultExperimentSeriesDuration(experimentSteps);
}
@Override
public void executeExperiments() throws InstrumentationException, MeasurementException, WorkloadException {
executeDefaultExperimentSeries(this, experimentSteps, getInstrumentationDescription());
}
private InstrumentationDescription getInstrumentationDescription() {
InstrumentationDescriptionBuilder idBuilder = new InstrumentationDescriptionBuilder();
idBuilder.newAPIScopeEntity(EntryPointScope.class.getName()).addProbe(ResponsetimeProbe.MODEL_PROBE)
.entityDone();
return idBuilder.build();
}
@Override
protected SpotterResult analyze(DatasetCollection data) {
SpotterResult result = new SpotterResult();
Dataset rtDataset = data.getDataSet(ResponseTimeRecord.class);
if (rtDataset == null || rtDataset.size() == 0) {
result.setDetected(false);
result.addMessage("Instrumentation achieved no results for the given scope!");
return result;
}
for (String operation : rtDataset.getValueSet(ResponseTimeRecord.PAR_OPERATION, String.class)) {
boolean operationDetected = false;
try {
operationDetected = analysisStrategyImpl.analyseOperationResponseTimes(rtDataset, operation, result);
} catch (NullPointerException npe) {
result.addMessage("Traffic Jam detection failed for the operation '" + operation
+ "', because the operation was not executed in each analysis cycle.");
continue;
} catch (IllegalArgumentException iae) {
result.addMessage(iae.getMessage());
continue;
}
if (operationDetected) {
result.setDetected(true);
result.addMessage("Traffic Jam detected in service: " + operation);
}
}
return result;
}
}