package nl.codecentric.jenkins.appd; import hudson.model.AbstractBuild; import nl.codecentric.jenkins.appd.rest.types.MetricData; import nl.codecentric.jenkins.appd.rest.types.MetricValues; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; /** * Represents a single performance report */ public class AppDynamicsReport { private final Map<String, MetricData> keyedMetricDataMap = new LinkedHashMap<String, MetricData>(); private final Long reportTimestamp; private final Integer reportDurationInMinutes; private AppDynamicsBuildAction buildAction; private AppDynamicsReport lastBuildReport; public AppDynamicsReport(final Long timestamp, final Integer durationInMinutes) { this.reportTimestamp = timestamp; this.reportDurationInMinutes = durationInMinutes; } public void addMetrics(final MetricData metrics) { keyedMetricDataMap.put(metrics.getMetricPath(), metrics); } public MetricData getMetricByKey(final String metricKey) { final MetricData selectedMetric = keyedMetricDataMap.get(metricKey); if (selectedMetric == null) { throw new IllegalArgumentException("Provided Metric Key is not available, tried to select; " + metricKey); } return selectedMetric; } public List<MetricData> getMetricsList() { return new ArrayList<MetricData>(keyedMetricDataMap.values()); } public double getAverageForMetric(final String metricKey) { final MetricData selectedMetric = getMetricByKey(metricKey); long calculatedSum = 0; for (MetricValues value : selectedMetric.getMetricValues()) { calculatedSum += value.getValue(); } final int numberOfMeasurements = selectedMetric.getMetricValues().size(); double result = -1; if (numberOfMeasurements > 0) { result = calculatedSum / numberOfMeasurements; } return result; } public long getMaxForMetric(final String metricKey) { final MetricData selectedMetric = getMetricByKey(metricKey); long max = Long.MIN_VALUE; for (MetricValues value : selectedMetric.getMetricValues()) { max = Math.max(value.getMax(), max); } return max; } public long getMinForMetric(final String metricKey) { final MetricData selectedMetric = getMetricByKey(metricKey); long min = Long.MAX_VALUE; for (MetricValues value : selectedMetric.getMetricValues()) { min = Math.min(value.getMin(), min); } return min; } public String getName() { DateTimeFormatter dateTimeFormat = DateTimeFormat.mediumDateTime(); return String.format("AppDynamics Metric Report for time %s - with a duration of %d minutes", dateTimeFormat.print(this.reportTimestamp), reportDurationInMinutes); } public long getTimestamp() { return reportTimestamp; } public AbstractBuild<?, ?> getBuild() { return buildAction.getBuild(); } AppDynamicsBuildAction getBuildAction() { return buildAction; } void setBuildAction(AppDynamicsBuildAction buildAction) { this.buildAction = buildAction; } public void setLastBuildReport(AppDynamicsReport lastBuildReport) { this.lastBuildReport = lastBuildReport; } }