package org.spotter.ext.detection.olb.strategies;
import java.util.Properties;
import org.aim.api.measurement.dataset.Dataset;
import org.aim.api.measurement.dataset.DatasetCollection;
import org.aim.api.measurement.dataset.ParameterSelection;
import org.aim.artifacts.records.CPUUtilizationRecord;
import org.lpe.common.util.LpeNumericUtils;
import org.lpe.common.util.NumericPairList;
import org.spotter.core.chartbuilder.AnalysisChartBuilder;
import org.spotter.core.detection.AbstractDetectionController;
import org.spotter.ext.detection.olb.IOLBAnalysisStrategy;
import org.spotter.ext.detection.olb.OLBDetectionController;
import org.spotter.ext.detection.olb.OLBExtension;
import org.spotter.shared.result.model.SpotterResult;
public class TTestCpuThresholdStrategy implements IOLBAnalysisStrategy {
private static final double PER_PERCENT = 0.01;
private OLBDetectionController mainDetectionController;
private double cpuThreshold;
@Override
public SpotterResult analyze(DatasetCollection data) {
SpotterResult result = new SpotterResult();
Dataset cpuUtilDataset = data.getDataSet(CPUUtilizationRecord.class);
if (cpuUtilDataset == null) {
result.addMessage("Unable to analyze CPU utilization: CPU utilization data has not been gathered.");
result.setDetected(false);
return result;
} else {
for (String processId : cpuUtilDataset.getValueSet(CPUUtilizationRecord.PAR_PROCESS_ID, String.class)) {
boolean cpuUtilized = cpuUtilized(cpuUtilDataset, processId, result);
if (cpuUtilized) {
result.addMessage("CPU Utilization is quite high. The CPU is probably a bottleneck!");
result.setDetected(false);
return result;
}
}
}
result.setDetected(true);
result.addMessage("None of the hardware resources is utilized to capacity!");
return result;
}
private boolean cpuUtilized(Dataset cpuUtilDataset, String processId, SpotterResult result) {
NumericPairList<Integer, Double> cpuMeans = new NumericPairList<>();
boolean cpuUtilized = false;
ParameterSelection parSelection = new ParameterSelection();
parSelection.select(CPUUtilizationRecord.PAR_CPU_ID, CPUUtilizationRecord.RES_CPU_AGGREGATED).select(
CPUUtilizationRecord.PAR_PROCESS_ID, processId);
for (Integer numUsers : cpuUtilDataset.getValueSet(AbstractDetectionController.NUMBER_OF_USERS_KEY,
Integer.class)) {
parSelection.select(AbstractDetectionController.NUMBER_OF_USERS_KEY, numUsers);
Dataset selectedDataSet = parSelection.applyTo(cpuUtilDataset);
double meanCpuUtil = LpeNumericUtils.average(selectedDataSet.getValues(
CPUUtilizationRecord.PAR_UTILIZATION, Double.class));
if (meanCpuUtil >= cpuThreshold) {
cpuUtilized = true;
}
cpuMeans.add(numUsers, meanCpuUtil);
}
AnalysisChartBuilder chartBuilder = AnalysisChartBuilder.getChartBuilder();
chartBuilder.startChart("CPU Utilization - " + processId, "number of users", "Mean Utilization [%]");
chartBuilder.addUtilizationLineSeries(cpuMeans, "CPU Utilization", true);
chartBuilder.addHorizontalLine(cpuThreshold * 100.0, "Utilization Threshold");
mainDetectionController.getResultManager().storeImageChartResource(chartBuilder, "CPU Utilization", result);
return cpuUtilized;
}
@Override
public void setProblemDetectionConfiguration(Properties problemDetectionConfiguration) {
String cpuThresholdStr = problemDetectionConfiguration.getProperty(OLBExtension.CPU_UTILIZATION_THRESHOLD_KEY,
String.valueOf(OLBExtension.CPU_UTILIZATION_THRESHOLD_DEFAULT));
cpuThreshold = Double.parseDouble(cpuThresholdStr);
}
@Override
public void setMainDetectionController(OLBDetectionController mainDetectionController) {
this.mainDetectionController = mainDetectionController;
}
}