Author: [email protected]
Date: Tue Mar 22 14:26:56 2011
New Revision: 893
Log:
[AMDATU-332] Fixed proper working of -omit
Modified:
trunk/etc/performancetest/src/main/java/org/amdatu/test/performance/analysis/ReportSummary.java
trunk/etc/performancetest/src/main/java/org/amdatu/test/performance/analysis/Statistics.java
trunk/etc/performancetest/src/main/java/org/amdatu/test/performance/analysis/ZSamples.java
trunk/etc/performancetest/src/main/java/org/amdatu/test/performance/main/Main.java
trunk/etc/performancetest/src/main/java/org/amdatu/test/performance/runtest/AmdatuLauncher.java
trunk/etc/performancetest/src/main/java/org/amdatu/test/performance/runtest/JMeterRunner.java
Modified:
trunk/etc/performancetest/src/main/java/org/amdatu/test/performance/analysis/ReportSummary.java
==============================================================================
---
trunk/etc/performancetest/src/main/java/org/amdatu/test/performance/analysis/ReportSummary.java
(original)
+++
trunk/etc/performancetest/src/main/java/org/amdatu/test/performance/analysis/ReportSummary.java
Tue Mar 22 14:26:56 2011
@@ -34,14 +34,12 @@
*/
public class ReportSummary {
private String m_resultDir;
- private int m_omit;
private List<JMeterPlanReport> m_reports = new
ArrayList<JMeterPlanReport>();
-
- public ReportSummary(String resultDir, int omit) {
+
+ public ReportSummary(String resultDir) {
m_resultDir = resultDir;
- m_omit = omit;
}
-
+
public void mergeAndAdd(JMeterResultsParser x, JMeterResultsParser y)
throws IOException, MathException {
JMeterPlanReport report = new JMeterPlanReport(x.getName());
Map<String, List<XYSample>> resultsX = x.getResults();
@@ -49,13 +47,13 @@
for (String key : resultsX.keySet()) {
List<XYSample> samplesX = resultsX.get(key);
List<XYSample> samplesY = resultsY.get(key);
- ZSamples mergedReport = new ZSamples(m_resultDir, samplesX,
samplesY, m_omit);
+ ZSamples mergedReport = new ZSamples(m_resultDir, samplesX,
samplesY);
report.addSampleResult(mergedReport);
}
report.setThroughput(x.getThroughput(), y.getThroughput());
m_reports.add(report);
}
-
+
public List<JMeterPlanReport> getReports() {
return m_reports;
}
@@ -96,11 +94,15 @@
pw.println("<style type=\"text/css\">");
pw.println("body { background:#19233E; font-family: Arial,
Helvetica, sans-serif; font-size: 14px; color: #ffffff;}");
pw.println("h1, h2 { margin: 0; font-weight: normal; color:
#ffffff;}");
- pw.println("table { border-bottom: 1px solid #24130F; border-left:
1px solid #24130F; border-right: 1px solid #24130F; background: #323C52;}");
+ pw.println("table { border-top: 1px solid #24130F; border-bottom:
1px solid #24130F; border-left: 1px solid #24130F; border-right: 1px solid
#24130F; background: #323C52;}");
pw.println("td.good {background: #325552;}");
pw.println("td.reallygood {background: #007F0E;}");
pw.println("td.bad {background: #5D3C52;}");
pw.println("td.reallybad {background: #FF0000;}");
+ pw.println("table.results th {width:120px;}");
+ pw.println("table.results td {text-align:center;}");
+ pw.println("th {border-right: 1px solid #24130F; background:
#323C62;}");
+ pw.println("td {border-top: 1px solid #24130F; border-right: 1px
solid #24130F; }");
pw.println("h1 { font-size: 44px; }");
pw.println("h2 { font-size: 18px; }");
pw.println("</style>");
@@ -117,71 +119,71 @@
pw.println("<tr><td>Throughput X</td><td>" +
report.getThroughputX() + " req/s</td></tr>");
pw.println("<tr><td>Throughput Y</td><td>" +
report.getThroughputY() + " req/s</td></tr></table>");
pw.println("<br/>");
- pw.println("<table>");
-
+ pw.println("<table class=\"results\">");
+
// Print headers
pw.println("<tr><th/>");
for (ZSamples sample : report.getSamples()) {
pw.println("<th>" + sample.name+ "</th>");
}
pw.println("</tr>");
-
+
// Sample mean size (m)
pw.println("<tr><td>m</td>");
for (ZSamples sample : report.getSamples()) {
pw.println("<td>" + sample.sampleMeanSize + "</td>");
}
pw.println("</tr>");
-
+
// Sample size (n)
pw.println("<tr><td>n</td>");
for (ZSamples sample : report.getSamples()) {
pw.println("<td>" + sample.sampleSize + "</td>");
}
pw.println("</tr>");
-
+
// Mean of X
pw.println("<tr><td>M<sub>x</sub></td>");
for (ZSamples sample : report.getSamples()) {
pw.println("<td>" + round(sample.sampleMeanX) + "</td>");
}
pw.println("</tr>");
-
+
// Mean of Y
pw.println("<tr><td>M<sub>y</sub></td>");
for (ZSamples sample : report.getSamples()) {
pw.println("<td>" + round(sample.sampleMeanY) + "</td>");
}
pw.println("</tr>");
-
+
// Mean of Z
pw.println("<tr><td>M<sub>z</sub></td>");
for (ZSamples sample : report.getSamples()) {
pw.println("<td>" + round(sample.sampleMean) + "</td>");
}
pw.println("</tr>");
-
+
// Standard deviation of Z
pw.println("<tr><td>S<sub>z</sub></td>");
for (ZSamples sample : report.getSamples()) {
pw.println("<td>" + round(sample.sampleSD) + "</td>");
}
pw.println("</tr>");
-
+
// t-value of Z
pw.println("<tr><td>t<sub>z</sub></td>");
for (ZSamples sample : report.getSamples()) {
pw.println("<td>" + round(sample.t) + "</td>");
}
pw.println("</tr>");
-
+
// Probability of t-value
pw.println("<tr><td>Pt<sub>z</sub></td>");
for (ZSamples sample : report.getSamples()) {
pw.println("<td>" + round(sample.p) + "</td>");
}
pw.println("</tr>");
-
+
// [power] difference between X and Y
pw.println("<tr><td>D<sub>z</sub></td>");
for (ZSamples sample : report.getSamples()) {
@@ -190,10 +192,10 @@
} else {
pw.println(bad(round(sample.D)));
}
-
+
}
pw.println("</tr>");
-
+
// Percentile [power] difference between X and Y
pw.println("<tr><td>Δ<sub>z</sub></td>");
for (ZSamples sample : report.getSamples()) {
@@ -208,21 +210,21 @@
}
}
pw.println("</tr>");
-
+
// H0 hypothesis
pw.println("<tr><td>H<sub>0</sub></td>");
for (ZSamples sample : report.getSamples()) {
pw.println("<td>" + (sample.H0 ? "accepted" : "rejected")
+ "</td>");
}
pw.println("</tr>");
-
+
// H0 hypothesis power
pw.println("<tr><td>H<sub>0</sub> power</td>");
for (ZSamples sample : report.getSamples()) {
pw.println("<td>" + sample.power + "</td>");
}
pw.println("</tr>");
-
+
// Success rate X
pw.println("<tr><td>Success rate X</td>");
for (ZSamples sample : report.getSamples()) {
@@ -233,7 +235,7 @@
}
}
pw.println("</tr>");
-
+
// Success rate Y
pw.println("<tr><td>Success rate Y</td>");
for (ZSamples sample : report.getSamples()) {
@@ -244,7 +246,7 @@
}
}
pw.println("</tr>");
-
+
pw.println("</table></p>");
}
pw.println("</body></html>");
@@ -261,12 +263,12 @@
}
}
}
-
+
private String toMegaBytes(long bytes) {
long mb = bytes/(1024*1024);
return mb + " Mb";
}
-
+
private void addLegend(PrintWriter pw) {
pw.println("<h2>Legend</h2>");
pw.println("Version X represents the new version, compared against the
original version Y</br/><p>");
@@ -287,7 +289,7 @@
pw.println("<tr>" + reallyBad("really bad") + "</tr></table>");
pw.println("</p>");
}
-
+
private String round(double d) {
DecimalFormat df = new DecimalFormat("####0.00");
return df.format(d);
@@ -297,15 +299,15 @@
private String good(Object value) {
return "<td class=\"good\">" + value + "</td>";
}
-
+
private String bad(Object value) {
return "<td class=\"bad\">" + value + "</td>";
}
-
+
private String reallyGood(Object value) {
return "<td class=\"reallygood\">" + value + "</td>";
}
-
+
private String reallyBad(Object value) {
return "<td class=\"reallybad\">" + value + "</td>";
}
Modified:
trunk/etc/performancetest/src/main/java/org/amdatu/test/performance/analysis/Statistics.java
==============================================================================
---
trunk/etc/performancetest/src/main/java/org/amdatu/test/performance/analysis/Statistics.java
(original)
+++
trunk/etc/performancetest/src/main/java/org/amdatu/test/performance/analysis/Statistics.java
Tue Mar 22 14:26:56 2011
@@ -45,9 +45,9 @@
m_resultsDir = resultsDir;
}
- public void analyze(int omit) throws ParserConfigurationException,
SAXException, IOException, MathException {
+ public void analyze() throws ParserConfigurationException, SAXException,
IOException, MathException {
// Analyze
- m_report = new ReportSummary(m_resultsDir, omit);
+ m_report = new ReportSummary(m_resultsDir);
for (String sample : getJMeterReports()) {
File reportX = new File(sample + "X");
File reportY = new File(sample + "Y");
Modified:
trunk/etc/performancetest/src/main/java/org/amdatu/test/performance/analysis/ZSamples.java
==============================================================================
---
trunk/etc/performancetest/src/main/java/org/amdatu/test/performance/analysis/ZSamples.java
(original)
+++
trunk/etc/performancetest/src/main/java/org/amdatu/test/performance/analysis/ZSamples.java
Tue Mar 22 14:26:56 2011
@@ -53,11 +53,9 @@
int sampleMeanSize = 0;
int sampleSize = 0;
private String m_resultsDir;
- private int m_omit;
- public ZSamples(String resultsDir, List<XYSample> x, List<XYSample> y, int
omit) throws IOException, MathException {
+ public ZSamples(String resultsDir, List<XYSample> x, List<XYSample> y)
throws IOException, MathException {
m_resultsDir = resultsDir;
- m_omit = omit;
preProcess(x, y);
@@ -166,7 +164,7 @@
successRateY = 0;
double meanX = 0, meanY = 0;
int count = 0;
- for (int i=m_omit; i<Math.min(x.size(), y.size()); i++) {
+ for (int i=0; i<Math.min(x.size(), y.size()); i++) {
if (count > 0 && count == newSampleSize) {
m_samplesX.add(meanX / newSampleSize);
m_samplesY.add(meanY / newSampleSize);
@@ -190,7 +188,7 @@
meanY = 0;
}
- successRateX /= (x.size() - m_omit);
- successRateY /= (y.size() - m_omit);
+ successRateX /= Math.min(x.size(), y.size());
+ successRateY /= Math.min(x.size(), y.size());
}
}
Modified:
trunk/etc/performancetest/src/main/java/org/amdatu/test/performance/main/Main.java
==============================================================================
---
trunk/etc/performancetest/src/main/java/org/amdatu/test/performance/main/Main.java
(original)
+++
trunk/etc/performancetest/src/main/java/org/amdatu/test/performance/main/Main.java
Tue Mar 22 14:26:56 2011
@@ -34,7 +34,7 @@
* @author ivol
*/
public class Main {
- private final static int TEST_LOOPS = 4;
+ private final static int TEST_LOOPS = 1;
private static String VERBOSE_ARG = "-verbose";
private static String ANALYZE_ARG = "-analyze";
@@ -167,14 +167,14 @@
}
try {
launcherX.start();
- jmeterX.run();
+ jmeterX.run(omit);
} finally {
launcherX.stop();
}
try {
launcherY.start();
- jmeterY.run();
+ jmeterY.run(omit);
} finally {
launcherY.stop();
}
@@ -183,7 +183,7 @@
int h0Count = 0;
int h0Accepted = 0;
Statistics stats = new Statistics(resultsDir);
- stats.analyze(omit);
+ stats.analyze();
stats.printHtml(n);
for (JMeterPlanReport report :
stats.getReport().getReports()) {
for (ZSamples sample : report.getSamples()) {
@@ -211,11 +211,10 @@
if (!arguments.containsKey(RESULTSDIR_ARG)) {
printUsage();
} else {
- int omit = arguments.containsKey(OMIT_ARG) ?
Integer.parseInt(arguments.get(OMIT_ARG).toString()) : 0;
String resultsDir =
arguments.get(RESULTSDIR_ARG).toString();
Statistics stats = new Statistics(resultsDir);
- stats.analyze(omit);
- stats.print(n);
+ stats.analyze();
+ stats.print(n-1);
System.out.println("Amdatu performance test analysis
completed.");
}
}
Modified:
trunk/etc/performancetest/src/main/java/org/amdatu/test/performance/runtest/AmdatuLauncher.java
==============================================================================
---
trunk/etc/performancetest/src/main/java/org/amdatu/test/performance/runtest/AmdatuLauncher.java
(original)
+++
trunk/etc/performancetest/src/main/java/org/amdatu/test/performance/runtest/AmdatuLauncher.java
Tue Mar 22 14:26:56 2011
@@ -99,8 +99,8 @@
}
// For safety, additional wait for 5 seconds
- System.out.println("Amdatu seems up and running, waiting another 3
seconds...");
- Thread.sleep(3000);
+ System.out.println("Amdatu seems up and running, waiting another 5
seconds...");
+ Thread.sleep(5000);
long diff = System.currentTimeMillis() - before;
System.out.println("Amdatu startup completed in " + diff + " ms,
running JMeter test plans");
Modified:
trunk/etc/performancetest/src/main/java/org/amdatu/test/performance/runtest/JMeterRunner.java
==============================================================================
---
trunk/etc/performancetest/src/main/java/org/amdatu/test/performance/runtest/JMeterRunner.java
(original)
+++
trunk/etc/performancetest/src/main/java/org/amdatu/test/performance/runtest/JMeterRunner.java
Tue Mar 22 14:26:56 2011
@@ -16,17 +16,22 @@
*/
package org.amdatu.test.performance.runtest;
+import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
+import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
+import java.io.RandomAccessFile;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import org.amdatu.test.performance.Utils;
+import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
+import org.apache.commons.io.LineIterator;
/**
* This class is responsible to run all JMeter plans present in the configured
directory.
@@ -37,13 +42,14 @@
public final static String SAMPLES = "-samples.";
public final static String SAMPLES_X = SAMPLES + "X";
public final static String SAMPLES_Y = SAMPLES + "Y";
-
+
private File m_rootTmpDir;
private String m_jmeterPlansDir;
private String m_resultsDir;
private String m_version;
private Process m_jmeterProcess;
-
+ private File m_sampleFile;
+
public JMeterRunner(String jmeterPlansDir, String version, String
resultsDir, File rootTmpDir) {
m_jmeterPlansDir = jmeterPlansDir;
m_version = version;
@@ -51,18 +57,18 @@
m_rootTmpDir = rootTmpDir;
}
- public void run() throws FileNotFoundException, IOException,
InterruptedException {
+ public void run(int omit) throws FileNotFoundException, IOException,
InterruptedException {
File resultDir = new File(m_resultsDir);
File jmeterLogFile = new File(resultDir, "jmeter.log");
-
+
File jmeterDir = installJMeter();
jmeterDir = new File(jmeterDir, "bin");
File plans = new File(m_jmeterPlansDir);
-
+
for (File jmeterPlan : plans.listFiles()) {
if (jmeterPlan.isFile()) {
// Run the JMeter plan!
- File sampleFile = new File(resultDir, jmeterPlan.getName() +
SAMPLES + m_version);
+ m_sampleFile = new File(resultDir, jmeterPlan.getName() +
SAMPLES + m_version);
List<String> command = new ArrayList<String>();
command.add("cmd.exe");
command.add("/C");
@@ -71,7 +77,11 @@
command.add("-t");
command.add(jmeterPlan.getAbsolutePath());
command.add("-l");
- command.add(sampleFile.getAbsolutePath());
+ if (omit <= 0) {
+ command.add(m_sampleFile.getAbsolutePath());
+ } else {
+ command.add(m_sampleFile.getAbsolutePath()+ ".tmp");
+ }
command.add("-j");
command.add(jmeterLogFile.getAbsolutePath());
ProcessBuilder processBuilder = new ProcessBuilder(command);
@@ -79,8 +89,13 @@
System.out.println("Running JMeter plan '" +
jmeterPlan.getAbsolutePath() + "' from directory '" +
jmeterDir.getAbsolutePath() + "'");
m_jmeterProcess = processBuilder.start();
Utils.dispatchOutput(m_jmeterProcess);
-
+
m_jmeterProcess.waitFor();
+
+ if (omit > 0) {
+ merge(m_sampleFile.getAbsolutePath()+ ".tmp", omit);
+ new File(m_sampleFile.getAbsolutePath()+ ".tmp").delete();
+ }
}
}
}
@@ -96,7 +111,7 @@
is = url.openStream();
File jmeterFile = new File(m_rootTmpDir, "jmeter-2.4.zip");
IOUtils.copy(is, new FileOutputStream(jmeterFile));
-
+
// And unzip
File target = new File(m_rootTmpDir, "jmeter-2.4");
Utils.unzip(jmeterFile, target);
@@ -110,4 +125,59 @@
return jmeter;
}
}
+
+ private void merge(String file, int omit) throws IOException {
+ // Merge the results of this temporary file in the large results file,
but omitting omit results
+ File targetFile = new File(file.replace(".tmp", ""));
+ boolean isNewFile = !targetFile.exists();
+ LineIterator iter = FileUtils.lineIterator(new File(file));
+ int count = 0;
+ BufferedWriter bw = new BufferedWriter(new FileWriter(targetFile,
true));
+ String eol = System.getProperty("line.separator");
+ if (!isNewFile) {
+ removeEndTestResults();
+ }
+ try {
+ while (iter.hasNext()) {
+ String line = iter.next();
+ boolean write = false;
+ if (line.startsWith("<httpSample") ||
line.startsWith("</testResults>")) {
+ count++;
+ if (count >= omit) {
+ write = true;
+ }
+ } else if (isNewFile) {
+ write = true;
+ }
+ if (write) {
+ bw.append(line + eol);
+ }
+ }
+ } finally {
+ iter.close();
+ bw.flush();
+ bw.close();
+ }
+ }
+
+ public void removeEndTestResults() throws IOException {
+ long length = m_sampleFile.length();
+ long offset = m_sampleFile.length()-1;
+ boolean endFound = false;
+ RandomAccessFile fis = new RandomAccessFile(m_sampleFile, "rw");
+ try {
+ while(!endFound && offset >= 0) {
+ offset--;
+ byte[] bytes = new byte[(int) (length-offset)];
+ fis.seek(offset);
+ fis.read(bytes, 0, (int) (length-offset));
+ endFound = new String(bytes,
"UTF-8").indexOf("</testResults>") != -1;
+ if (endFound) {
+ fis.setLength(offset);
+ }
+ }
+ } finally {
+ fis.close();
+ }
+ }
}
_______________________________________________
Amdatu-commits mailing list
[email protected]
http://lists.amdatu.org/mailman/listinfo/amdatu-commits