package nl.codecentric.jenkins.appd; import hudson.Extension; import hudson.ExtensionPoint; import hudson.model.*; import nl.codecentric.jenkins.appd.rest.types.MetricData; import nl.codecentric.jenkins.appd.rest.RestConnection; import org.kohsuke.stapler.DataBoundConstructor; import java.util.logging.Logger; /** * The {@link AppDynamicsDataCollector} will eventually fetch the performance statistics from the * AppDynamics REST interface and parse them into a {@link AppDynamicsReport}.<br /> * <br /> * Perhaps create separate Collectors again when this is more logical to create separate graphs. For * now this single collector should get all data. */ public class AppDynamicsDataCollector { private static final Logger LOG = Logger.getLogger(AppDynamicsDataCollector.class.getName()); private static final String[] METRIC_PATHS = { "Overall Application Performance|Average Response Time (ms)", "Overall Application Performance|Calls per Minute", "Overall Application Performance|Normal Average Response Time (ms)", "Overall Application Performance|Number of Slow Calls", "Overall Application Performance|Number of Very Slow Calls", "Overall Application Performance|Errors per Minute", "Overall Application Performance|Exceptions per Minute", "Overall Application Performance|Infrastructure Errors per Minute"}; private final RestConnection restConnection; private final AbstractBuild<?, ?> build; private final int minimumDurationInMinutes; public AppDynamicsDataCollector(final RestConnection connection, final AbstractBuild<?, ?> build, final int minimumDurationInMinutes) { this.restConnection = connection; this.build = build; this.minimumDurationInMinutes = minimumDurationInMinutes; } public static String[] getAvailableMetricPaths() { return METRIC_PATHS; } /** Parses the specified reports into {@link AppDynamicsReport}s. */ public AppDynamicsReport createReportFromMeasurements() { long buildStartTime = build.getRootBuild().getTimeInMillis(); int durationInMinutes = calculateDurationToFetch(buildStartTime); LOG.fine(String.format("Current time: %d - Build time: %d - Duration: %d", System.currentTimeMillis(), buildStartTime, durationInMinutes)); AppDynamicsReport adReport = new AppDynamicsReport(buildStartTime, durationInMinutes); for (String metricPath : METRIC_PATHS) { final MetricData metric = restConnection.fetchMetricData(metricPath, durationInMinutes); if (adReport != null && metric != null) { adReport.addMetrics(metric); } } return adReport; } private int calculateDurationToFetch(final Long buildStartTime) { long duration = System.currentTimeMillis() - buildStartTime; int durationInMinutes = (int) (duration / (1000*60)); if (durationInMinutes < minimumDurationInMinutes) { durationInMinutes = minimumDurationInMinutes; } return durationInMinutes; } }