package org.spotter.ext.detection.trafficJam;
import java.util.HashSet;
import java.util.Set;
import org.lpe.common.config.ConfigParameterDescription;
import org.lpe.common.util.LpeSupportedTypes;
import org.spotter.core.detection.AbstractDetectionExtension;
import org.spotter.core.detection.IDetectionController;
public class TrafficJamExtension extends AbstractDetectionExtension {
private static final String EXTENSION_DESCRIPTION = "Traffic Jam represents a scalability problem, "
+ "either due to software bottlenecks or hardware limitations. ";
public static final String REQUIRED_CONFIDENCE_LEVEL_KEY = "confidenceLevel";
public static final String REQUIRED_SIGNIFICANT_STEPS_KEY = "numSignificantSteps";
public static final String REGRESSION_SLOPE_KEY = "regression slope threshold";
public static final String EXPERIMENT_STEPS_KEY = "numExperiments";
public static final double REQUIRED_CONFIDENCE_LEVEL_DEFAULT = 0.95;
public static final double REGRESSION_SLOPE_DEFAULT = 10.0;
public static final int REQUIRED_SIGNIFICANT_STEPS_DEFAULT = 2;
public static final int EXPERIMENT_STEPS_DEFAULT = 4;
protected static final String DETECTION_STRATEGY_KEY = "strategy";
protected static final String T_TEST_STRATEGY = "t-Test strategy";
protected static final String LIN_REGRESSION_STRATEGY = "linear regression strategy";
@Override
public IDetectionController createExtensionArtifact() {
return new TrafficJamDetectionController(this);
}
@Override
public String getName() {
return "Traffic Jam";
}
private ConfigParameterDescription createNumExperimentsParameter() {
ConfigParameterDescription numExperimentsParameter = new ConfigParameterDescription(EXPERIMENT_STEPS_KEY,
LpeSupportedTypes.Integer);
numExperimentsParameter.setDefaultValue(String.valueOf(EXPERIMENT_STEPS_DEFAULT));
numExperimentsParameter.setRange(String.valueOf(2), String.valueOf(Integer.MAX_VALUE));
numExperimentsParameter.setDescription("Number of experiments to execute with "
+ "different number of users between 1 and max number of users.");
return numExperimentsParameter;
}
private ConfigParameterDescription createNumSignificantStepsParameter() {
ConfigParameterDescription numSignificantStepsParameter = new ConfigParameterDescription(
REQUIRED_SIGNIFICANT_STEPS_KEY, LpeSupportedTypes.Integer);
numSignificantStepsParameter.setDefaultValue(String.valueOf(REQUIRED_SIGNIFICANT_STEPS_DEFAULT));
numSignificantStepsParameter.setRange(String.valueOf(1), String.valueOf(Integer.MAX_VALUE));
numSignificantStepsParameter.setDescription("This parameter specifies the number of steps between experiments "
+ "required to show a significant increase in order to detect a One Lane Bridge.");
return numSignificantStepsParameter;
}
private ConfigParameterDescription createConfidenceLevelParameter() {
ConfigParameterDescription requiredConfidenceLevel = new ConfigParameterDescription(
REQUIRED_CONFIDENCE_LEVEL_KEY, LpeSupportedTypes.Double);
requiredConfidenceLevel.setDefaultValue(String.valueOf(REQUIRED_CONFIDENCE_LEVEL_DEFAULT));
requiredConfidenceLevel.setRange("0.0", "1.0");
requiredConfidenceLevel.setDescription("This parameter defines the confidence level to be reached "
+ "in order to recognize a significant difference when comparing "
+ "two response time samples with the t-test.");
return requiredConfidenceLevel;
}
private ConfigParameterDescription createRegressionSlopeParameter() {
ConfigParameterDescription requiredConfidenceLevel = new ConfigParameterDescription(
REGRESSION_SLOPE_KEY, LpeSupportedTypes.Double);
requiredConfidenceLevel.setDefaultValue(String.valueOf(REGRESSION_SLOPE_DEFAULT));
requiredConfidenceLevel.setDescription("ONLY for lilnear regression strategy! Threshold for regression slope.");
return requiredConfidenceLevel;
}
private ConfigParameterDescription createStrategyParameter() {
ConfigParameterDescription scopeParameter = new ConfigParameterDescription(DETECTION_STRATEGY_KEY,
LpeSupportedTypes.String);
Set<String> scopeOptions = new HashSet<>();
scopeOptions.add(T_TEST_STRATEGY);
scopeOptions.add(LIN_REGRESSION_STRATEGY);
scopeParameter.setOptions(scopeOptions);
scopeParameter.setDefaultValue(T_TEST_STRATEGY);
scopeParameter.setDescription("This parameter determines the strategy, "
+ "used to analyse the Traffic Jam anti-pattern.");
return scopeParameter;
}
@Override
protected void initializeConfigurationParameters() {
addConfigParameter(ConfigParameterDescription.createExtensionDescription(EXTENSION_DESCRIPTION));
addConfigParameter(createConfidenceLevelParameter());
addConfigParameter(createNumSignificantStepsParameter());
addConfigParameter(createNumExperimentsParameter());
addConfigParameter(createStrategyParameter());
addConfigParameter(createRegressionSlopeParameter());
}
}