package org.terracotta.statistics.derived.latency;
import org.terracotta.statistics.derived.OperationResultSampler;
import org.terracotta.statistics.observer.ChainedOperationObserver;
import java.util.Set;
import java.util.concurrent.atomic.AtomicReference;
public class Jsr107LatencyMonitor<T extends Enum<T>> implements ChainedOperationObserver<T>, LatencyStatistic {
private final OperationResultSampler<T> sampling;
private final AtomicReference<LatencyAccumulator> statistic = new AtomicReference<>(LatencyAccumulator.empty());
public Jsr107LatencyMonitor(Set<T> targets, double sampling) {
this.sampling = new OperationResultSampler<>(targets, sampling, (time, latency) -> statistic.get().accumulate(latency));
}
@Override
public void begin(long time) {
sampling.begin(time);
}
@Override
public void end(long time, long latency, T result) {
sampling.end(time, latency, result);
}
@Override
public double average() {
LatencyAccumulator accumulator = statistic.get();
long count = accumulator.count();
if (count == 0) {
return 0d;
} else {
return accumulator.total() / 1_000.0 / count;
}
}
@Override
public Long minimum() {
LatencyAccumulator accumulator = statistic.get();
return accumulator.isEmpty() ? 0L : accumulator.minimum() / 1_000L;
}
@Override
public Long maximum() {
LatencyAccumulator accumulator = statistic.get();
return accumulator.isEmpty() ? 0L : accumulator.maximum() / 1_000L;
}
public synchronized void clear() {
statistic.set(LatencyAccumulator.empty());
}
}