package hudson.plugins.performance.parsers; import hudson.Extension; import hudson.plugins.performance.data.HttpSample; import hudson.plugins.performance.descriptors.PerformanceReportParserDescriptor; import hudson.plugins.performance.reports.PerformanceReport; import org.kohsuke.stapler.DataBoundConstructor; import java.io.File; import java.text.SimpleDateFormat; import java.util.Scanner; import java.util.regex.Pattern; /** * Parses JMeter Summarized results * * @author Agoley */ public class JmeterSummarizerParser extends AbstractParser { @Extension public static class DescriptorImpl extends PerformanceReportParserDescriptor { @Override public String getDisplayName() { return "JmeterSummarizer"; } } @DataBoundConstructor public JmeterSummarizerParser(String glob) { super(glob); } @Override public String getDefaultGlobPattern() { return "**/*.log"; } public String getDefaultDatePattern() { return "yyyy/mm/dd HH:mm:ss"; } @Override PerformanceReport parse(File reportFile) throws Exception { final PerformanceReport report = new PerformanceReport(); report.setReportFileName(reportFile.getName()); Scanner fileScanner = null; try { fileScanner = new Scanner(reportFile); String key; String line; SimpleDateFormat dateFormat = new SimpleDateFormat(getDefaultDatePattern()); String lastEqualsLine = null; while (fileScanner.hasNextLine()) { line = fileScanner.nextLine(); if (line.contains("=") && line.contains("jmeter.reporters.Summariser:")) { lastEqualsLine = line; } } long reportSamples = Long.MIN_VALUE; long reportAvg = Long.MIN_VALUE; long reportMin = Long.MAX_VALUE; long reportMax = Long.MIN_VALUE; String reportErrorPercent = ""; Scanner lineScanner = null; if (lastEqualsLine != null) { try { lineScanner = new Scanner(lastEqualsLine); final Pattern delimiter = lineScanner.delimiter(); lineScanner.useDelimiter("INFO"); // as jmeter logs INFO mode final HttpSample sample = new HttpSample(); final String dateString = lineScanner.next(); sample.setDate(dateFormat.parse(dateString)); lineScanner.findInLine("jmeter.reporters.Summariser:"); lineScanner.useDelimiter("\\="); key = lineScanner.next().trim(); lineScanner.useDelimiter(delimiter); lineScanner.next(); reportSamples = lineScanner.nextLong(); sample.setSummarizerSamples(reportSamples); // set SamplesCount lineScanner.findInLine("Avg:"); // set response time sample.setDuration(lineScanner.nextLong()); reportAvg = sample.getDuration(); sample.setSuccessful(true); lineScanner.findInLine("Min:"); // set MIN long sampleMin = lineScanner.nextLong(); sample.setSummarizerMin(sampleMin); reportMin = Math.min(reportMin, sampleMin); lineScanner.findInLine("Max:"); // set MAX long sampleMax = lineScanner.nextLong(); sample.setSummarizerMax(sampleMax); reportMax = Math.max(reportMax, sampleMax); lineScanner.findInLine("Err:"); // set errors count lineScanner.findInLine("\\("); // set errors count lineScanner.useDelimiter("%"); reportErrorPercent = lineScanner.next(); sample.setSummarizerErrors(Float.parseFloat(reportErrorPercent)); // sample.setSummarizerErrors( // Float.valueOf(scanner.next().replaceAll("[()%]",""))); sample.setUri(key); report.addSample(sample); } finally { if (lineScanner != null) lineScanner.close(); } } report.setSummarizerSize(reportSamples); report.setSummarizerAvg(reportAvg); report.setSummarizerMin(reportMin); report.setSummarizerMax(reportMax); report.setSummarizerErrors(reportErrorPercent); return report; } finally { if (fileScanner != null) fileScanner.close(); } } }