MetricsRegistry: Solving empty histograms in nodetool

This patch fixes two issues with the histogram implementation:
* Need to all update before trying to read values from the histogram.
* The histogram values return from the API in microseconds and not nano.

See Scylladb/scylla#2155

Signed-off-by: Amnon Heiman <amnon@scylladb.com>
Message-Id: <20170315130725.22261-1-amnon@scylladb.com>
This commit is contained in:
Amnon Heiman 2017-03-15 15:07:25 +02:00 committed by Avi Kivity
parent 34c10fc91c
commit 0c541d73e7

View File

@ -196,11 +196,11 @@ public class MetricsRegistry {
private static final TimeUnit RATE_UNIT = TimeUnit.SECONDS; private static final TimeUnit RATE_UNIT = TimeUnit.SECONDS;
private static final TimeUnit DURATION_UNIT = TimeUnit.MICROSECONDS; private static final TimeUnit DURATION_UNIT = TimeUnit.MICROSECONDS;
private static final TimeUnit API_DURATION_UNIT = TimeUnit.NANOSECONDS; private static final TimeUnit API_DURATION_UNIT = TimeUnit.MICROSECONDS;
private static final double DURATION_FACTOR = 1.0 / API_DURATION_UNIT.convert(1, DURATION_UNIT); private static final double DURATION_FACTOR = 1.0 / API_DURATION_UNIT.convert(1, DURATION_UNIT);
private static double toDuration(double nanos) { private static double toDuration(double micro) {
return nanos * DURATION_FACTOR; return micro * DURATION_FACTOR;
} }
private static String unitString(TimeUnit u) { private static String unitString(TimeUnit u) {
@ -650,61 +650,73 @@ public class MetricsRegistry {
@Override @Override
public double getMin() { public double getMin() {
update();
return toDuration(histogram.getMin()); return toDuration(histogram.getMin());
} }
@Override @Override
public double getMax() { public double getMax() {
update();
return toDuration(histogram.getMax()); return toDuration(histogram.getMax());
} }
@Override @Override
public double getMean() { public double getMean() {
update();
return toDuration(histogram.getMean()); return toDuration(histogram.getMean());
} }
@Override @Override
public double getStdDev() { public double getStdDev() {
update();
return toDuration(histogram.getStdDev()); return toDuration(histogram.getStdDev());
} }
@Override @Override
public double get50thPercentile() { public double get50thPercentile() {
update();
return toDuration(histogram.getValue(.5)); return toDuration(histogram.getValue(.5));
} }
@Override @Override
public double get75thPercentile() { public double get75thPercentile() {
update();
return toDuration(histogram.getValue(.75)); return toDuration(histogram.getValue(.75));
} }
@Override @Override
public double get95thPercentile() { public double get95thPercentile() {
update();
return toDuration(histogram.getValue(.95)); return toDuration(histogram.getValue(.95));
} }
@Override @Override
public double get98thPercentile() { public double get98thPercentile() {
update();
return toDuration(histogram.getValue(.98)); return toDuration(histogram.getValue(.98));
} }
@Override @Override
public double get99thPercentile() { public double get99thPercentile() {
update();
return toDuration(histogram.getValue(.99)); return toDuration(histogram.getValue(.99));
} }
@Override @Override
public double get999thPercentile() { public double get999thPercentile() {
update();
return toDuration(histogram.getValue(.999)); return toDuration(histogram.getValue(.999));
} }
@Override @Override
public long[] values() { public long[] values() {
update();
return histogram.getValues(); return histogram.getValues();
} }
@Override @Override
public String getDurationUnit() { public String getDurationUnit() {
update();
return DURATION_UNIT.toString().toLowerCase(Locale.US); return DURATION_UNIT.toString().toLowerCase(Locale.US);
} }
} }