From c6720c99687e3ef83e1eb83c3940c7e2ef1bc598 Mon Sep 17 00:00:00 2001 From: Chris Larsen Date: Mon, 29 Jan 2018 17:07:39 -0800 Subject: [PATCH] [core] Address another issue from #981 by adding "measurement.histogram.verbose" as a configuration option to print out the histogram buckets and default to NOT printing out the buckets. --- .../OneMeasurementHdrHistogram.java | 29 ++++++++++++++----- .../measurements/OneMeasurementHistogram.java | 16 ++++++++-- .../exporter/TestMeasurementsExporter.java | 3 ++ workloads/workload_template | 4 +++ 4 files changed, 41 insertions(+), 11 deletions(-) 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 28c284dc33..86af751f79 100644 --- a/core/src/main/java/com/yahoo/ycsb/measurements/OneMeasurementHdrHistogram.java +++ b/core/src/main/java/com/yahoo/ycsb/measurements/OneMeasurementHdrHistogram.java @@ -54,12 +54,23 @@ public class OneMeasurementHdrHistogram extends OneMeasurement { * The default value for the hdrhistogram.percentiles property. */ public static final String PERCENTILES_PROPERTY_DEFAULT = "95,99"; + + /** + * The name of the property for determining if we should print out the buckets. + */ + public static final String VERBOSE_PROPERTY = "measurement.histogram.verbose"; + /** + * Whether or not to emit the histogram buckets. + */ + private final boolean verbose; + private final List percentiles; public OneMeasurementHdrHistogram(String name, Properties props) { super(name); percentiles = getPercentileValues(props.getProperty(PERCENTILES_PROPERTY, PERCENTILES_PROPERTY_DEFAULT)); + verbose = Boolean.valueOf(props.getProperty(VERBOSE_PROPERTY, String.valueOf(false))); boolean shouldLog = Boolean.parseBoolean(props.getProperty("hdrhistogram.fileoutput", "false")); if (!shouldLog) { log = null; @@ -115,15 +126,17 @@ public void exportMeasurements(MeasurementsExporter exporter) throws IOException exportStatusCounts(exporter); // also export totalHistogram - for (HistogramIterationValue v : totalHistogram.recordedValues()) { - int value; - if (v.getValueIteratedTo() > (long)Integer.MAX_VALUE) { - value = Integer.MAX_VALUE; - } else { - value = (int)v.getValueIteratedTo(); + if (verbose) { + for (HistogramIterationValue v : totalHistogram.recordedValues()) { + int value; + if (v.getValueIteratedTo() > (long)Integer.MAX_VALUE) { + value = Integer.MAX_VALUE; + } else { + value = (int)v.getValueIteratedTo(); + } + + exporter.write(getName(), Integer.toString(value), (double)v.getCountAtValueIteratedTo()); } - - exporter.write(getName(), Integer.toString(value), (double)v.getCountAtValueIteratedTo()); } } 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 de550d12b2..4a7f6f8c31 100644 --- a/core/src/main/java/com/yahoo/ycsb/measurements/OneMeasurementHistogram.java +++ b/core/src/main/java/com/yahoo/ycsb/measurements/OneMeasurementHistogram.java @@ -30,6 +30,7 @@ public class OneMeasurementHistogram extends OneMeasurement { public static final String BUCKETS = "histogram.buckets"; public static final String BUCKETS_DEFAULT = "1000"; + public static final String VERBOSE_PROPERTY = "measurement.histogram.verbose"; /** * Specify the range of latencies to track in the histogram. @@ -64,6 +65,11 @@ public class OneMeasurementHistogram extends OneMeasurement { */ private double totalsquaredlatency; + /** + * Whether or not to emit the histogram buckets. + */ + private final boolean verbose; + //keep a windowed version of these stats for printing status private long windowoperations; private long windowtotallatency; @@ -74,6 +80,7 @@ public class OneMeasurementHistogram extends OneMeasurement { public OneMeasurementHistogram(String name, Properties props) { super(name); buckets = Integer.parseInt(props.getProperty(BUCKETS, BUCKETS_DEFAULT)); + verbose = Boolean.valueOf(props.getProperty(VERBOSE_PROPERTY, String.valueOf(false))); histogram = new long[buckets]; histogramoverflow = 0; operations = 0; @@ -136,10 +143,13 @@ public void exportMeasurements(MeasurementsExporter exporter) throws IOException exportStatusCounts(exporter); - for (int i = 0; i < buckets; i++) { - exporter.write(getName(), Integer.toString(i), histogram[i]); + if (verbose) { + for (int i = 0; i < buckets; i++) { + exporter.write(getName(), Integer.toString(i), histogram[i]); + } + + exporter.write(getName(), ">" + buckets, histogramoverflow); } - exporter.write(getName(), ">" + buckets, histogramoverflow); } @Override 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 4aff094170..8479365c33 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 @@ -18,6 +18,8 @@ import com.yahoo.ycsb.generator.ZipfianGenerator; import com.yahoo.ycsb.measurements.Measurements; +import com.yahoo.ycsb.measurements.OneMeasurementHistogram; + import org.codehaus.jackson.JsonNode; import org.codehaus.jackson.map.ObjectMapper; import org.testng.annotations.Test; @@ -34,6 +36,7 @@ public class TestMeasurementsExporter { public void testJSONArrayMeasurementsExporter() throws IOException { Properties props = new Properties(); props.put(Measurements.MEASUREMENT_TYPE_PROPERTY, "histogram"); + props.put(OneMeasurementHistogram.VERBOSE_PROPERTY, "true"); Measurements mm = new Measurements(props); ByteArrayOutputStream out = new ByteArrayOutputStream(); JSONArrayMeasurementsExporter export = new JSONArrayMeasurementsExporter(out); diff --git a/workloads/workload_template b/workloads/workload_template index b66d3b6ef8..af1c32503f 100644 --- a/workloads/workload_template +++ b/workloads/workload_template @@ -133,6 +133,10 @@ measurementtype=histogram # a new output file will be created. #measurement.raw.output_file = /tmp/your_output_file_for_this_run +# Whether or not to emit individual histogram buckets when measuring +# using histograms. +# measurement.histogram.verbose = false + # JVM Reporting. # # Measure JVM information over time including GC counts, max and min memory