Skip to content

Commit d6f1eae

Browse files
committed
[core] Merge Pull Request #371 from 'YCSB-hdr-default/master'
- *incompatible* Default measurement changed from histogram to hdrhistogram Users who want previous behavior can set the 'measurementtype' property to 'histogram' - *incompatible* Reported 95th and 99th percentile latencies now in microseconds (previously in milliseconds) Conflicts: core/src/main/java/com/yahoo/ycsb/measurements/OneMeasurementHdrHistogram.java closes #371
2 parents 9a6bb42 + 5adc3dd commit d6f1eae

File tree

6 files changed

+62
-67
lines changed

6 files changed

+62
-67
lines changed

core/src/main/java/com/yahoo/ycsb/measurements/Measurements.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ public class Measurements
3333
{
3434

3535
public static final String MEASUREMENT_TYPE_PROPERTY = "measurementtype";
36-
37-
private static final String MEASUREMENT_TYPE_PROPERTY_DEFAULT = "histogram";
36+
private static final String MEASUREMENT_TYPE_PROPERTY_DEFAULT = "hdrhistogram";
37+
3838
public static final String MEASUREMENT_INTERVAL = "measurement.interval";
3939
private static final String MEASUREMENT_INTERVAL_DEFAULT = "op";
4040

core/src/main/java/com/yahoo/ycsb/measurements/OneMeasurement.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@
2929
*/
3030
public abstract class OneMeasurement {
3131

32-
String _name;
33-
final ConcurrentHashMap<Integer, AtomicInteger> returncodes;
32+
private final String _name;
33+
private final ConcurrentHashMap<Integer, AtomicInteger> _returncodes;
3434

3535
public String getName() {
3636
return _name;
@@ -41,7 +41,7 @@ public String getName() {
4141
*/
4242
public OneMeasurement(String _name) {
4343
this._name = _name;
44-
this.returncodes = new ConcurrentHashMap<Integer, AtomicInteger>();
44+
this._returncodes = new ConcurrentHashMap<Integer, AtomicInteger>();
4545
}
4646

4747
public abstract void measure(int latency);
@@ -53,10 +53,10 @@ public OneMeasurement(String _name) {
5353
*/
5454
public void reportReturnCode(int code) {
5555
Integer Icode = code;
56-
AtomicInteger counter = returncodes.get(Icode);
56+
AtomicInteger counter = _returncodes.get(Icode);
5757

5858
if (counter == null) {
59-
AtomicInteger other = returncodes.putIfAbsent(Icode, counter = new AtomicInteger());
59+
AtomicInteger other = _returncodes.putIfAbsent(Icode, counter = new AtomicInteger());
6060
if (other != null) {
6161
counter = other;
6262
}
@@ -73,4 +73,9 @@ public void reportReturnCode(int code) {
7373
*/
7474
public abstract void exportMeasurements(MeasurementsExporter exporter) throws IOException;
7575

76+
protected final void exportReturnCodes(MeasurementsExporter exporter) throws IOException {
77+
for (Map.Entry<Integer, AtomicInteger> entry : _returncodes.entrySet()) {
78+
exporter.write(getName(), "Return=" + entry.getKey(), entry.getValue().get());
79+
}
80+
}
7681
}

core/src/main/java/com/yahoo/ycsb/measurements/OneMeasurementHdrHistogram.java

Lines changed: 39 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@
3434
import com.yahoo.ycsb.measurements.exporter.MeasurementsExporter;
3535

3636
/**
37-
* Take measurements and maintain a HdrHistogram of a given metric, such as
38-
* READ LATENCY.
37+
* Take measurements and maintain a HdrHistogram of a given metric, such as READ
38+
* LATENCY.
3939
*
4040
* @author nitsanw
4141
*
@@ -92,7 +92,7 @@ public void measure(int latencyInMicros) {
9292
public void exportMeasurements(MeasurementsExporter exporter) throws IOException {
9393
// accumulate the last interval which was not caught by status thread
9494
Histogram intervalHistogram = getIntervalHistogramAndAccumulate();
95-
if(histogramLogWriter != null) {
95+
if (histogramLogWriter != null) {
9696
histogramLogWriter.outputIntervalHistogram(intervalHistogram);
9797
// we can close now
9898
log.close();
@@ -101,49 +101,45 @@ public void exportMeasurements(MeasurementsExporter exporter) throws IOException
101101
exporter.write(getName(), "AverageLatency(us)", totalHistogram.getMean());
102102
exporter.write(getName(), "MinLatency(us)", totalHistogram.getMinValue());
103103
exporter.write(getName(), "MaxLatency(us)", totalHistogram.getMaxValue());
104-
exporter.write(getName(), "95thPercentileLatency(ms)", totalHistogram.getValueAtPercentile(90)/1000);
105-
exporter.write(getName(), "99thPercentileLatency(ms)", totalHistogram.getValueAtPercentile(99)/1000);
106-
107-
for (Map.Entry<Integer, AtomicInteger> entry : returncodes.entrySet()) {
108-
exporter.write(getName(), "Return=" + entry.getKey(), entry.getValue().get());
109-
}
104+
exporter.write(getName(), "95thPercentileLatency(us)", totalHistogram.getValueAtPercentile(90));
105+
exporter.write(getName(), "99thPercentileLatency(us)", totalHistogram.getValueAtPercentile(99));
106+
107+
exportReturnCodes(exporter);
110108
}
111109

112-
/**
113-
* This is called periodically from the StatusThread. There's a single StatusThread per Client process.
114-
* We optionally serialize the interval to log on this opportunity.
115-
* @see com.yahoo.ycsb.measurements.OneMeasurement#getSummary()
116-
*/
117-
@Override
118-
public String getSummary() {
119-
Histogram intervalHistogram = getIntervalHistogramAndAccumulate();
120-
// we use the summary interval as the histogram file interval.
121-
if(histogramLogWriter != null) {
122-
histogramLogWriter.outputIntervalHistogram(intervalHistogram);
123-
}
110+
/**
111+
* This is called periodically from the StatusThread. There's a single
112+
* StatusThread per Client process. We optionally serialize the interval to
113+
* log on this opportunity.
114+
*
115+
* @see com.yahoo.ycsb.measurements.OneMeasurement#getSummary()
116+
*/
117+
@Override
118+
public String getSummary() {
119+
Histogram intervalHistogram = getIntervalHistogramAndAccumulate();
120+
// we use the summary interval as the histogram file interval.
121+
if (histogramLogWriter != null) {
122+
histogramLogWriter.outputIntervalHistogram(intervalHistogram);
123+
}
124124

125-
DecimalFormat d = new DecimalFormat("#.##");
126-
return "[" + getName() +
127-
": Count=" + intervalHistogram.getTotalCount() +
128-
", Max=" + intervalHistogram.getMaxValue() +
129-
", Min=" + intervalHistogram.getMinValue() +
130-
", Avg=" + d.format(intervalHistogram.getMean()) +
131-
", 90=" + d.format(intervalHistogram.getValueAtPercentile(90)) +
132-
", 99=" + d.format(intervalHistogram.getValueAtPercentile(99)) +
133-
", 99.9=" + d.format(intervalHistogram.getValueAtPercentile(99.9)) +
134-
", 99.99=" + d.format(intervalHistogram.getValueAtPercentile(99.99)) +"]";
135-
}
125+
DecimalFormat d = new DecimalFormat("#.##");
126+
return "[" + getName() + ": Count=" + intervalHistogram.getTotalCount() + ", Max="
127+
+ intervalHistogram.getMaxValue() + ", Min=" + intervalHistogram.getMinValue() + ", Avg="
128+
+ d.format(intervalHistogram.getMean()) + ", 90=" + d.format(intervalHistogram.getValueAtPercentile(90))
129+
+ ", 99=" + d.format(intervalHistogram.getValueAtPercentile(99)) + ", 99.9="
130+
+ d.format(intervalHistogram.getValueAtPercentile(99.9)) + ", 99.99="
131+
+ d.format(intervalHistogram.getValueAtPercentile(99.99)) + "]";
132+
}
136133

137-
private Histogram getIntervalHistogramAndAccumulate() {
138-
Histogram intervalHistogram = histogram.getIntervalHistogram();
139-
// add this to the total time histogram.
140-
if (totalHistogram == null) {
141-
totalHistogram = intervalHistogram;
142-
}
143-
else {
144-
totalHistogram.add(intervalHistogram);
145-
}
146-
return intervalHistogram;
147-
}
134+
private Histogram getIntervalHistogramAndAccumulate() {
135+
Histogram intervalHistogram = histogram.getIntervalHistogram();
136+
// add this to the total time histogram.
137+
if (totalHistogram == null) {
138+
totalHistogram = intervalHistogram;
139+
} else {
140+
totalHistogram.add(intervalHistogram);
141+
}
142+
return intervalHistogram;
143+
}
148144

149145
}

core/src/main/java/com/yahoo/ycsb/measurements/OneMeasurementHistogram.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -109,19 +109,17 @@ public void exportMeasurements(MeasurementsExporter exporter) throws IOException
109109
opcounter+=histogram[i];
110110
if ( (!done95th) && (((double)opcounter)/((double)operations)>=0.95) )
111111
{
112-
exporter.write(getName(), "95thPercentileLatency(ms)", i);
112+
exporter.write(getName(), "95thPercentileLatency(us)", i*1000);
113113
done95th=true;
114114
}
115115
if (((double)opcounter)/((double)operations)>=0.99)
116116
{
117-
exporter.write(getName(), "99thPercentileLatency(ms)", i);
117+
exporter.write(getName(), "99thPercentileLatency(us)", i*1000);
118118
break;
119119
}
120120
}
121121

122-
for (Map.Entry<Integer, AtomicInteger> entry : returncodes.entrySet()) {
123-
exporter.write(getName(), "Return=" + entry.getKey(), entry.getValue().get());
124-
}
122+
exportReturnCodes(exporter);
125123

126124
for (int i=0; i<_buckets; i++)
127125
{

core/src/main/java/com/yahoo/ycsb/measurements/OneMeasurementTimeSeries.java

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -125,24 +125,18 @@ public void measure(int latency)
125125

126126

127127
@Override
128-
public void exportMeasurements(MeasurementsExporter exporter) throws IOException
129-
{
128+
public void exportMeasurements(MeasurementsExporter exporter) throws IOException {
130129
checkEndOfUnit(true);
131130

132131
exporter.write(getName(), "Operations", operations);
133-
exporter.write(getName(), "AverageLatency(us)", (((double)totallatency)/((double)operations)));
132+
exporter.write(getName(), "AverageLatency(us)", (((double) totallatency) / ((double) operations)));
134133
exporter.write(getName(), "MinLatency(us)", min);
135134
exporter.write(getName(), "MaxLatency(us)", max);
136135

137-
//TODO: 95th and 99th percentile latency
138-
136+
// TODO: 95th and 99th percentile latency
139137

140-
for (Map.Entry<Integer, AtomicInteger> entry : returncodes.entrySet()) {
141-
exporter.write(getName(), "Return=" + entry.getKey(), entry.getValue().get());
142-
}
143-
144-
for (SeriesUnit unit : _measurements)
145-
{
138+
exportReturnCodes(exporter);
139+
for (SeriesUnit unit : _measurements) {
146140
exporter.write(getName(), Long.toString(unit.time), unit.average);
147141
}
148142
}

core/src/test/java/com/yahoo/ycsb/measurements/exporter/TestMeasurementsExporter.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@
3232
public class TestMeasurementsExporter {
3333
@Test
3434
public void testJSONArrayMeasurementsExporter() throws IOException {
35-
Measurements mm = new Measurements(new Properties());
35+
Properties props = new Properties();
36+
props.put(Measurements.MEASUREMENT_TYPE_PROPERTY, "histogram");
37+
Measurements mm = new Measurements(props);
3638
ByteArrayOutputStream out = new ByteArrayOutputStream();
3739
JSONArrayMeasurementsExporter export = new JSONArrayMeasurementsExporter(out);
3840

0 commit comments

Comments
 (0)