On 28 December 2014 at 14:09, Philippe Mouawad <[email protected]> wrote: > Hi, > I also think Summariser is not accurate anymore now . > As you have analyzed it more deeply, would you mind updating it as per your > new implementation details ?
No idea what you mean here. > Thanks > > On Sun, Dec 28, 2014 at 3:03 PM, Philippe Mouawad < > [email protected]> wrote: > >> Hi sebb, >> Nice you fixed it. >> >> Few notes: >> - I have updated javadocs and removed index useless field >> - Any reason for keeping AccumListener and RunningSample ? They do not >> look to be used ? >> >> Regards >> Philippe >> >> >> On Sun, Dec 28, 2014 at 3:55 AM, <[email protected]> wrote: >> >>> Author: sebb >>> Date: Sun Dec 28 02:55:22 2014 >>> New Revision: 1648146 >>> >>> URL: http://svn.apache.org/r1648146 >>> Log: >>> Summariser : The + (difference) reports show wrong elapsed time and >>> throughput >>> Bugzilla Id: 57346 >>> >>> Added: >>> >>> jmeter/trunk/src/core/org/apache/jmeter/reporters/SummariserRunningSample.java >>> Modified: >>> jmeter/trunk/src/core/org/apache/jmeter/reporters/Summariser.java >>> jmeter/trunk/xdocs/changes.xml >>> >>> Modified: >>> jmeter/trunk/src/core/org/apache/jmeter/reporters/Summariser.java >>> URL: >>> http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/reporters/Summariser.java?rev=1648146&r1=1648145&r2=1648146&view=diff >>> >>> ============================================================================== >>> --- jmeter/trunk/src/core/org/apache/jmeter/reporters/Summariser.java >>> (original) >>> +++ jmeter/trunk/src/core/org/apache/jmeter/reporters/Summariser.java Sun >>> Dec 28 02:55:22 2014 >>> @@ -35,7 +35,6 @@ import org.apache.jmeter.testelement.Tes >>> import org.apache.jmeter.threads.JMeterContextService; >>> import org.apache.jmeter.threads.JMeterContextService.ThreadCounts; >>> import org.apache.jmeter.util.JMeterUtils; >>> -import org.apache.jmeter.visualizers.RunningSample; >>> import org.apache.jorphan.logging.LoggingManager; >>> import org.apache.jorphan.util.JOrphanUtils; >>> import org.apache.log.Logger; >>> @@ -147,9 +146,9 @@ public class Summariser extends Abstract >>> /** Time of last summary (to prevent double reporting) */ >>> private long last = 0; >>> >>> - private final RunningSample delta = new RunningSample("DELTA",0); >>> + private final SummariserRunningSample delta = new >>> SummariserRunningSample("DELTA",0); >>> >>> - private final RunningSample total = new RunningSample("TOTAL",0); >>> + private final SummariserRunningSample total = new >>> SummariserRunningSample("TOTAL",0); >>> >>> /** >>> * Add the delta values to the total values and clear the delta >>> @@ -172,8 +171,8 @@ public class Summariser extends Abstract >>> >>> long now = System.currentTimeMillis() / 1000;// in seconds >>> >>> - RunningSample myDelta = null; >>> - RunningSample myTotal = null; >>> + SummariserRunningSample myDelta = null; >>> + SummariserRunningSample myTotal = null; >>> boolean reportNow = false; >>> >>> /* >>> @@ -190,9 +189,9 @@ public class Summariser extends Abstract >>> reportNow = true; >>> >>> // copy the data to minimise the synch time >>> - myDelta = new RunningSample(myTotals.delta); >>> + myDelta = new SummariserRunningSample(myTotals.delta); >>> myTotals.moveDelta(); >>> - myTotal = new RunningSample(myTotals.total); >>> + myTotal = new SummariserRunningSample(myTotals.total); >>> >>> myTotals.last = now; // stop double-reporting >>> } >>> @@ -239,7 +238,7 @@ public class Summariser extends Abstract >>> * @param string >>> * @return the sunnary information >>> */ >>> - private static String format(String name, RunningSample s, String >>> type) { >>> + private static String format(String name, SummariserRunningSample s, >>> String type) { >>> DecimalFormat dfDouble = new DecimalFormat("#0.0"); // >>> $NON-NLS-1$ >>> StringBuilder tmp = new StringBuilder(20); // for intermediate >>> use >>> StringBuilder sb = new StringBuilder(100); // output line buffer >>> @@ -369,6 +368,7 @@ public class Summariser extends Abstract >>> String str; >>> String name = entry.getKey(); >>> Totals total = entry.getValue(); >>> + total.delta.setEndTime(); // ensure delta has correct end >>> time >>> // Only print final delta if there were some samples in the >>> delta >>> // and there has been at least one sample reported previously >>> if (total.delta.getNumSamples() > 0 && >>> total.total.getNumSamples() > 0) { >>> @@ -380,7 +380,7 @@ public class Summariser extends Abstract >>> System.out.println(str); >>> } >>> } >>> - total.moveDelta(); >>> + total.moveDelta(); // This will update the total endTime >>> str = format(name, total.total, "="); >>> if (TOLOG) { >>> log.info(str); >>> >>> Added: >>> jmeter/trunk/src/core/org/apache/jmeter/reporters/SummariserRunningSample.java >>> URL: >>> http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/reporters/SummariserRunningSample.java?rev=1648146&view=auto >>> >>> ============================================================================== >>> --- >>> jmeter/trunk/src/core/org/apache/jmeter/reporters/SummariserRunningSample.java >>> (added) >>> +++ >>> jmeter/trunk/src/core/org/apache/jmeter/reporters/SummariserRunningSample.java >>> Sun Dec 28 02:55:22 2014 >>> @@ -0,0 +1,202 @@ >>> +package org.apache.jmeter.reporters; >>> + >>> +import java.text.DecimalFormat; >>> + >>> +import org.apache.jmeter.samplers.SampleResult; >>> + >>> +class SummariserRunningSample { >>> + >>> + private final DecimalFormat errorFormatter = new >>> DecimalFormat("#0.00%"); // $NON-NLS-1$ >>> + >>> + private long counter; >>> + >>> + private long runningSum; >>> + >>> + private long max; >>> + >>> + private long min; >>> + >>> + private long errorCount; >>> + >>> + private long startTime; >>> + >>> + private long endTime; >>> + >>> + private final String label; >>> + >>> + private final int index; >>> + >>> + public SummariserRunningSample(String label, int index) { >>> + this.label = label; >>> + this.index = index; >>> + init(); >>> + } >>> + >>> + /** >>> + * Copy constructor >>> + * @param src the instance to copy >>> + */ >>> + public SummariserRunningSample(SummariserRunningSample src) { >>> + label = src.label; >>> + index = src.index; >>> + counter = src.counter; >>> + errorCount = src.errorCount; >>> + startTime = src.startTime; >>> + endTime = src.endTime; >>> + max = src.max; >>> + min = src.min; >>> + runningSum = src.runningSum; >>> + } >>> + >>> + private void init() { >>> + counter = 0L; >>> + runningSum = 0L; >>> + max = Long.MIN_VALUE; >>> + min = Long.MAX_VALUE; >>> + errorCount = 0L; >>> + startTime = System.currentTimeMillis(); >>> + endTime = startTime; >>> + } >>> + >>> + public void clear() { >>> + init(); >>> + } >>> + >>> + public void addSample(SummariserRunningSample rs) { >>> + counter += rs.counter; >>> + errorCount += rs.errorCount; >>> + runningSum += rs.runningSum; >>> + if (max < rs.max) { >>> + max = rs.max; >>> + } >>> + if (min > rs.min) { >>> + min = rs.min; >>> + } >>> + // We want end time to be current time so sample rates reflect >>> real time >>> + endTime = System.currentTimeMillis(); >>> + } >>> + >>> + public void addSample(SampleResult res) { >>> + counter += res.getSampleCount(); >>> + errorCount += res.getErrorCount(); >>> + long aTimeInMillis = res.getTime(); >>> + runningSum += aTimeInMillis; >>> + if (aTimeInMillis > max) { >>> + max = aTimeInMillis; >>> + } >>> + if (aTimeInMillis < min) { >>> + min = aTimeInMillis; >>> + } >>> + // We want end time to be current time so sample rates reflect >>> real time >>> + endTime = System.currentTimeMillis(); >>> + } >>> + >>> + /** >>> + * Returns the number of samples that have been recorded by this >>> instance of >>> + * the RunningSample class. >>> + * >>> + * @return the number of samples that have been recorded by this >>> instance of >>> + * the RunningSample class. >>> + */ >>> + public long getNumSamples() { >>> + return counter; >>> + } >>> + >>> + /** >>> + * Get the elapsed time for the samples >>> + * >>> + * @return how long the samples took >>> + */ >>> + public long getElapsed() { >>> + if (counter == 0) { >>> + return 0;// No samples collected ... >>> + } >>> + return endTime - startTime; >>> + } >>> + >>> + /** >>> + * Returns the throughput associated to this sampler in requests per >>> second. >>> + */ >>> + public double getRate() { >>> + if (counter == 0) { >>> + return 0.0;// No samples collected ... >>> + } >>> + >>> + long howLongRunning = endTime - startTime; >>> + >>> + if (howLongRunning == 0) { >>> + return Double.MAX_VALUE; >>> + } >>> + >>> + return (double) counter / howLongRunning * 1000.0; >>> + } >>> + >>> + /** >>> + * Returns the average time in milliseconds that samples ran in. >>> + * >>> + * @return the average time in milliseconds that samples ran in. >>> + */ >>> + public long getAverage() { >>> + if (counter == 0) { >>> + return 0; >>> + } >>> + return runningSum / counter; >>> + } >>> + >>> + /** >>> + * @return errorCount >>> + */ >>> + public long getErrorCount() { >>> + return errorCount; >>> + } >>> + >>> + /** >>> + * Returns a String which represents the percentage of sample errors >>> that >>> + * have occurred. ("0.00%" through "100.00%") >>> + * >>> + * @return a String which represents the percentage of sample errors >>> that >>> + * have occurred. >>> + */ >>> + public String getErrorPercentageString() { >>> + return errorFormatter.format(getErrorPercentage()); >>> + } >>> + >>> + /** >>> + * Returns the raw double value of the percentage of samples with >>> errors >>> + * that were recorded. (Between 0.0 and 1.0) If you want a nicer >>> return >>> + * format, see {@link #getErrorPercentageString()}. >>> + * >>> + * @return the raw double value of the percentage of samples with >>> errors >>> + * that were recorded. Returns 0.0 if there are no samples >>> + */ >>> + public double getErrorPercentage() { >>> + if (counter == 0) { >>> + return 0.0; >>> + } >>> + double rval = (double) errorCount / (double) counter; >>> + return rval; >>> + } >>> + >>> + /** >>> + * Returns the time in milliseconds of the slowest sample. >>> + * >>> + * @return the time in milliseconds of the slowest sample. >>> + */ >>> + public long getMax() { >>> + return max; >>> + } >>> + >>> + /** >>> + * Returns the time in milliseconds of the quickest sample. >>> + * >>> + * @return the time in milliseconds of the quickest sample. >>> + */ >>> + public long getMin() { >>> + return min; >>> + } >>> + >>> + public void setEndTime() { >>> + endTime = System.currentTimeMillis(); >>> + } >>> + >>> +} >>> >>> Modified: jmeter/trunk/xdocs/changes.xml >>> URL: >>> http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes.xml?rev=1648146&r1=1648145&r2=1648146&view=diff >>> >>> ============================================================================== >>> --- jmeter/trunk/xdocs/changes.xml (original) >>> +++ jmeter/trunk/xdocs/changes.xml Sun Dec 28 02:55:22 2014 >>> @@ -154,6 +154,7 @@ See <bugzilla>56357</bugzilla> for deta >>> <h3>Listeners</h3> >>> <ul> >>> <li><bug>57262</bug>Aggregate Report, Aggregate Graph and Summary Report >>> export : headers use keys instead of labels</li> >>> +<li><bug>57346</bug>Summariser : The + (difference) reports show wrong >>> elapsed time and throughput</li> >>> </ul> >>> >>> <h3>Timers, Assertions, Config, Pre- & Post-Processors</h3> >>> >>> >>> >> >> >> -- >> Cordialement. >> Philippe Mouawad. >> >> >> > > > -- > Cordialement. > Philippe Mouawad.
