diff --git a/core/src/main/java/com/yahoo/ycsb/measurements/Measurements.java b/core/src/main/java/com/yahoo/ycsb/measurements/Measurements.java index faa81ba04d564cde80061f5d1635cebd2180cbd5..e91375849e09c018bdd8f61bfa69f4e308086e17 100644 --- a/core/src/main/java/com/yahoo/ycsb/measurements/Measurements.java +++ b/core/src/main/java/com/yahoo/ycsb/measurements/Measurements.java @@ -33,8 +33,8 @@ public class Measurements { public static final String MEASUREMENT_TYPE_PROPERTY = "measurementtype"; - - private static final String MEASUREMENT_TYPE_PROPERTY_DEFAULT = "histogram"; + private static final String MEASUREMENT_TYPE_PROPERTY_DEFAULT = "hdrhistogram"; + public static final String MEASUREMENT_INTERVAL = "measurement.interval"; private static final String MEASUREMENT_INTERVAL_DEFAULT = "op"; diff --git a/core/src/main/java/com/yahoo/ycsb/measurements/OneMeasurement.java b/core/src/main/java/com/yahoo/ycsb/measurements/OneMeasurement.java index 45c6a561375363a59a8d490a902c4e13b5ab2b74..3c613fe30c707e11079eb0ca4e9f11e36db35b4c 100644 --- a/core/src/main/java/com/yahoo/ycsb/measurements/OneMeasurement.java +++ b/core/src/main/java/com/yahoo/ycsb/measurements/OneMeasurement.java @@ -29,8 +29,8 @@ import com.yahoo.ycsb.measurements.exporter.MeasurementsExporter; */ public abstract class OneMeasurement { - String _name; - final ConcurrentHashMap<Integer, AtomicInteger> returncodes; + private final String _name; + private final ConcurrentHashMap<Integer, AtomicInteger> _returncodes; public String getName() { return _name; @@ -41,7 +41,7 @@ public abstract class OneMeasurement { */ public OneMeasurement(String _name) { this._name = _name; - this.returncodes = new ConcurrentHashMap<Integer, AtomicInteger>(); + this._returncodes = new ConcurrentHashMap<Integer, AtomicInteger>(); } public abstract void measure(int latency); @@ -53,10 +53,10 @@ public abstract class OneMeasurement { */ public void reportReturnCode(int code) { Integer Icode = code; - AtomicInteger counter = returncodes.get(Icode); + AtomicInteger counter = _returncodes.get(Icode); if (counter == null) { - AtomicInteger other = returncodes.putIfAbsent(Icode, counter = new AtomicInteger()); + AtomicInteger other = _returncodes.putIfAbsent(Icode, counter = new AtomicInteger()); if (other != null) { counter = other; } @@ -73,4 +73,9 @@ public abstract class OneMeasurement { */ public abstract void exportMeasurements(MeasurementsExporter exporter) throws IOException; + protected final void exportReturnCodes(MeasurementsExporter exporter) throws IOException { + for (Map.Entry<Integer, AtomicInteger> entry : _returncodes.entrySet()) { + exporter.write(getName(), "Return=" + entry.getKey(), entry.getValue().get()); + } + } } diff --git a/core/src/main/java/com/yahoo/ycsb/measurements/OneMeasurementHdrHistogram.java b/core/src/main/java/com/yahoo/ycsb/measurements/OneMeasurementHdrHistogram.java index 4754825f35888ee2e36c7193bc322f4a3c08c659..6712d78b38a59ab8ddbe546e641ee3cfed4c0937 100644 --- a/core/src/main/java/com/yahoo/ycsb/measurements/OneMeasurementHdrHistogram.java +++ b/core/src/main/java/com/yahoo/ycsb/measurements/OneMeasurementHdrHistogram.java @@ -34,8 +34,8 @@ import org.HdrHistogram.Recorder; import com.yahoo.ycsb.measurements.exporter.MeasurementsExporter; /** - * Take measurements and maintain a HdrHistogram of a given metric, such as - * READ LATENCY. + * Take measurements and maintain a HdrHistogram of a given metric, such as READ + * LATENCY. * * @author nitsanw * @@ -92,7 +92,7 @@ public class OneMeasurementHdrHistogram extends OneMeasurement { public void exportMeasurements(MeasurementsExporter exporter) throws IOException { // accumulate the last interval which was not caught by status thread Histogram intervalHistogram = getIntervalHistogramAndAccumulate(); - if(histogramLogWriter != null) { + if (histogramLogWriter != null) { histogramLogWriter.outputIntervalHistogram(intervalHistogram); // we can close now log.close(); @@ -101,49 +101,45 @@ public class OneMeasurementHdrHistogram extends OneMeasurement { exporter.write(getName(), "AverageLatency(us)", totalHistogram.getMean()); exporter.write(getName(), "MinLatency(us)", totalHistogram.getMinValue()); exporter.write(getName(), "MaxLatency(us)", totalHistogram.getMaxValue()); - exporter.write(getName(), "95thPercentileLatency(ms)", totalHistogram.getValueAtPercentile(90)/1000); - exporter.write(getName(), "99thPercentileLatency(ms)", totalHistogram.getValueAtPercentile(99)/1000); - - for (Map.Entry<Integer, AtomicInteger> entry : returncodes.entrySet()) { - exporter.write(getName(), "Return=" + entry.getKey(), entry.getValue().get()); - } + exporter.write(getName(), "95thPercentileLatency(us)", totalHistogram.getValueAtPercentile(90)); + exporter.write(getName(), "99thPercentileLatency(us)", totalHistogram.getValueAtPercentile(99)); + + exportReturnCodes(exporter); } - /** - * This is called periodically from the StatusThread. There's a single StatusThread per Client process. - * We optionally serialize the interval to log on this opportunity. - * @see com.yahoo.ycsb.measurements.OneMeasurement#getSummary() - */ - @Override - public String getSummary() { - Histogram intervalHistogram = getIntervalHistogramAndAccumulate(); - // we use the summary interval as the histogram file interval. - if(histogramLogWriter != null) { - histogramLogWriter.outputIntervalHistogram(intervalHistogram); - } + /** + * This is called periodically from the StatusThread. There's a single + * StatusThread per Client process. We optionally serialize the interval to + * log on this opportunity. + * + * @see com.yahoo.ycsb.measurements.OneMeasurement#getSummary() + */ + @Override + public String getSummary() { + Histogram intervalHistogram = getIntervalHistogramAndAccumulate(); + // we use the summary interval as the histogram file interval. + if (histogramLogWriter != null) { + histogramLogWriter.outputIntervalHistogram(intervalHistogram); + } - DecimalFormat d = new DecimalFormat("#.##"); - return "[" + getName() + - ": Count=" + intervalHistogram.getTotalCount() + - ", Max=" + intervalHistogram.getMaxValue() + - ", Min=" + intervalHistogram.getMinValue() + - ", Avg=" + d.format(intervalHistogram.getMean()) + - ", 90=" + d.format(intervalHistogram.getValueAtPercentile(90)) + - ", 99=" + d.format(intervalHistogram.getValueAtPercentile(99)) + - ", 99.9=" + d.format(intervalHistogram.getValueAtPercentile(99.9)) + - ", 99.99=" + d.format(intervalHistogram.getValueAtPercentile(99.99)) +"]"; - } + DecimalFormat d = new DecimalFormat("#.##"); + return "[" + getName() + ": Count=" + intervalHistogram.getTotalCount() + ", Max=" + + intervalHistogram.getMaxValue() + ", Min=" + intervalHistogram.getMinValue() + ", Avg=" + + d.format(intervalHistogram.getMean()) + ", 90=" + d.format(intervalHistogram.getValueAtPercentile(90)) + + ", 99=" + d.format(intervalHistogram.getValueAtPercentile(99)) + ", 99.9=" + + d.format(intervalHistogram.getValueAtPercentile(99.9)) + ", 99.99=" + + d.format(intervalHistogram.getValueAtPercentile(99.99)) + "]"; + } - private Histogram getIntervalHistogramAndAccumulate() { - Histogram intervalHistogram = histogram.getIntervalHistogram(); - // add this to the total time histogram. - if (totalHistogram == null) { - totalHistogram = intervalHistogram; - } - else { - totalHistogram.add(intervalHistogram); - } - return intervalHistogram; - } + private Histogram getIntervalHistogramAndAccumulate() { + Histogram intervalHistogram = histogram.getIntervalHistogram(); + // add this to the total time histogram. + if (totalHistogram == null) { + totalHistogram = intervalHistogram; + } else { + totalHistogram.add(intervalHistogram); + } + return intervalHistogram; + } } diff --git a/core/src/main/java/com/yahoo/ycsb/measurements/OneMeasurementHistogram.java b/core/src/main/java/com/yahoo/ycsb/measurements/OneMeasurementHistogram.java index d8305b30f32d7f730d78457600441d5f3414e88f..1c96e8db94e0e20815357b576fb9b6ee72c24c35 100644 --- a/core/src/main/java/com/yahoo/ycsb/measurements/OneMeasurementHistogram.java +++ b/core/src/main/java/com/yahoo/ycsb/measurements/OneMeasurementHistogram.java @@ -109,19 +109,17 @@ public class OneMeasurementHistogram extends OneMeasurement opcounter+=histogram[i]; if ( (!done95th) && (((double)opcounter)/((double)operations)>=0.95) ) { - exporter.write(getName(), "95thPercentileLatency(ms)", i); + exporter.write(getName(), "95thPercentileLatency(us)", i*1000); done95th=true; } if (((double)opcounter)/((double)operations)>=0.99) { - exporter.write(getName(), "99thPercentileLatency(ms)", i); + exporter.write(getName(), "99thPercentileLatency(us)", i*1000); break; } } - for (Map.Entry<Integer, AtomicInteger> entry : returncodes.entrySet()) { - exporter.write(getName(), "Return=" + entry.getKey(), entry.getValue().get()); - } + exportReturnCodes(exporter); for (int i=0; i<_buckets; i++) { diff --git a/core/src/main/java/com/yahoo/ycsb/measurements/OneMeasurementTimeSeries.java b/core/src/main/java/com/yahoo/ycsb/measurements/OneMeasurementTimeSeries.java index d4871660ac8dd8051c1756238e819f04da1af996..8794f89639e1af72bac55b2013f7ba21175bb135 100644 --- a/core/src/main/java/com/yahoo/ycsb/measurements/OneMeasurementTimeSeries.java +++ b/core/src/main/java/com/yahoo/ycsb/measurements/OneMeasurementTimeSeries.java @@ -125,24 +125,18 @@ public class OneMeasurementTimeSeries extends OneMeasurement @Override - public void exportMeasurements(MeasurementsExporter exporter) throws IOException - { + public void exportMeasurements(MeasurementsExporter exporter) throws IOException { checkEndOfUnit(true); exporter.write(getName(), "Operations", operations); - exporter.write(getName(), "AverageLatency(us)", (((double)totallatency)/((double)operations))); + exporter.write(getName(), "AverageLatency(us)", (((double) totallatency) / ((double) operations))); exporter.write(getName(), "MinLatency(us)", min); exporter.write(getName(), "MaxLatency(us)", max); - //TODO: 95th and 99th percentile latency - + // TODO: 95th and 99th percentile latency - for (Map.Entry<Integer, AtomicInteger> entry : returncodes.entrySet()) { - exporter.write(getName(), "Return=" + entry.getKey(), entry.getValue().get()); - } - - for (SeriesUnit unit : _measurements) - { + exportReturnCodes(exporter); + for (SeriesUnit unit : _measurements) { exporter.write(getName(), Long.toString(unit.time), unit.average); } } diff --git a/core/src/test/java/com/yahoo/ycsb/measurements/exporter/TestMeasurementsExporter.java b/core/src/test/java/com/yahoo/ycsb/measurements/exporter/TestMeasurementsExporter.java index 2b33aec39948c022db54bfeb67c80fe0290cd3e1..1d852bb6a23cbffdfb9128a74a9ec9b16701b083 100644 --- a/core/src/test/java/com/yahoo/ycsb/measurements/exporter/TestMeasurementsExporter.java +++ b/core/src/test/java/com/yahoo/ycsb/measurements/exporter/TestMeasurementsExporter.java @@ -32,7 +32,9 @@ import static org.testng.AssertJUnit.assertTrue; public class TestMeasurementsExporter { @Test public void testJSONArrayMeasurementsExporter() throws IOException { - Measurements mm = new Measurements(new Properties()); + Properties props = new Properties(); + props.put(Measurements.MEASUREMENT_TYPE_PROPERTY, "histogram"); + Measurements mm = new Measurements(props); ByteArrayOutputStream out = new ByteArrayOutputStream(); JSONArrayMeasurementsExporter export = new JSONArrayMeasurementsExporter(out);