9e97cb530a
When removing the pull based timers in the API the sum method in the APITimer was left stubed by mistake. This patch take the sum from the histogram as it should be. Another missed changes are the units, in the yammer library the Timer does unit conversion before returning the values. This patch takes the unit conversion from the yammer library to be compatible. Signed-off-by: Amnon Heiman <amnon@scylladb.com> Message-Id: <1464173726-7482-1-git-send-email-amnon@scylladb.com>
135 lines
3.1 KiB
Java
135 lines
3.1 KiB
Java
/*
|
|
* Copyright 2015 Cloudius Systems
|
|
*
|
|
*/
|
|
package com.yammer.metrics.core;
|
|
|
|
import java.util.concurrent.ScheduledExecutorService;
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
import javax.json.JsonObject;
|
|
|
|
import com.scylladb.jmx.api.APIClient;
|
|
import com.yammer.metrics.core.Histogram.SampleType;
|
|
import com.yammer.metrics.stats.Snapshot;
|
|
|
|
/**
|
|
* A timer metric which aggregates timing durations and provides duration
|
|
* statistics, plus throughput statistics via {@link Meter}.
|
|
*/
|
|
public class APITimer extends Timer {
|
|
public final static long CACHE_DURATION = 1000;
|
|
|
|
final TimeUnit durationUnit, rateUnit;
|
|
final APIMeter meter;
|
|
final APIHistogram histogram;
|
|
APIClient c = new APIClient();
|
|
|
|
private double convertFromNS(double ns) {
|
|
return ns / TimeUnit.NANOSECONDS.convert(1, durationUnit);
|
|
}
|
|
|
|
String url;
|
|
|
|
public APITimer(String url, ScheduledExecutorService tickThread,
|
|
TimeUnit durationUnit, TimeUnit rateUnit) {
|
|
super(tickThread, durationUnit, rateUnit);
|
|
super.stop();
|
|
this.url = url;
|
|
this.durationUnit = durationUnit;
|
|
this.rateUnit = rateUnit;
|
|
meter = new APIMeter(null, tickThread, "calls", rateUnit);
|
|
histogram = new APIHistogram(null, SampleType.BIASED);
|
|
}
|
|
|
|
public void fromJson(JsonObject obj) {
|
|
meter.fromJson(obj.getJsonObject("meter"));
|
|
histogram.updateValue(APIClient.json2histogram(obj.getJsonObject("hist")));
|
|
}
|
|
|
|
public void update_fields() {
|
|
if (url != null) {
|
|
fromJson(c.getJsonObj(url, null, CACHE_DURATION));
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public double max() {
|
|
update_fields();
|
|
return convertFromNS(histogram.max());
|
|
}
|
|
|
|
@Override
|
|
public double min() {
|
|
update_fields();
|
|
return convertFromNS(histogram.min());
|
|
}
|
|
|
|
@Override
|
|
public double mean() {
|
|
update_fields();
|
|
return convertFromNS(histogram.mean());
|
|
}
|
|
|
|
@Override
|
|
public double stdDev() {
|
|
update_fields();
|
|
return convertFromNS(histogram.stdDev());
|
|
}
|
|
|
|
@Override
|
|
public double sum() {
|
|
update_fields();
|
|
return convertFromNS(histogram.sum());
|
|
}
|
|
|
|
@Override
|
|
public Snapshot getSnapshot() {
|
|
update_fields();
|
|
return histogram.getSnapshot();
|
|
}
|
|
|
|
@Override
|
|
public TimeUnit rateUnit() {
|
|
update_fields();
|
|
return meter.rateUnit();
|
|
}
|
|
|
|
@Override
|
|
public String eventType() {
|
|
update_fields();
|
|
return meter.eventType();
|
|
}
|
|
|
|
@Override
|
|
public long count() {
|
|
update_fields();
|
|
return meter.count();
|
|
}
|
|
|
|
@Override
|
|
public double fifteenMinuteRate() {
|
|
update_fields();
|
|
return meter.fifteenMinuteRate();
|
|
}
|
|
|
|
@Override
|
|
public double fiveMinuteRate() {
|
|
update_fields();
|
|
return meter.fiveMinuteRate();
|
|
}
|
|
|
|
@Override
|
|
public double meanRate() {
|
|
update_fields();
|
|
return meter.meanRate();
|
|
}
|
|
|
|
@Override
|
|
public double oneMinuteRate() {
|
|
update_fields();
|
|
return meter.oneMinuteRate();
|
|
}
|
|
|
|
}
|