package io.github.resilience4j.metrics.internal;
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.Snapshot;
import io.github.resilience4j.metrics.Timer;
import static com.codahale.metrics.MetricRegistry.name;
import static com.codahale.metrics.Timer.*;
public class TimerContext implements Timer{
private final String timerName;
private final MetricRegistry metricRegistry;
private com.codahale.metrics.Timer successfulCallsTimer;
private com.codahale.metrics.Counter totalCallsCounter;
private com.codahale.metrics.Counter failedCallsCounter;
private final TimerMetrics metrics;
public TimerContext(String timerName, MetricRegistry metricRegistry){
this.timerName = timerName;
this.metricRegistry = metricRegistry;
this.successfulCallsTimer = metricRegistry.timer(name(timerName, "successful"));
this.totalCallsCounter = metricRegistry.counter(name(timerName, "total"));
this.failedCallsCounter = metricRegistry.counter(name(timerName, "failed"));
this.metrics = new TimerMetrics();
}
@Override
public Context time() {
totalCallsCounter.inc();
return successfulCallsTimer.time();
}
@Override
public void onError(Context context) {
failedCallsCounter.inc();
}
@Override
public void onSuccess(Context context) {
context.stop();
}
@Override
public String getName() {
return timerName;
}
@Override
public MetricRegistry getMetricRegistry() {
return metricRegistry;
}
@Override
public Metrics getMetrics() {
return metrics;
}
private final class TimerMetrics implements Metrics {
private TimerMetrics() {
}
@Override
public long getNumberOfTotalCalls() {
return totalCallsCounter.getCount();
}
@Override
public long getNumberOfSuccessfulCalls() {
return successfulCallsTimer.getCount();
}
@Override
public long getNumberOfFailedCalls() {
return failedCallsCounter.getCount();
}
@Override
public double getFifteenMinuteRate() {
return successfulCallsTimer.getFifteenMinuteRate();
}
@Override
public double getFiveMinuteRate() {
return successfulCallsTimer.getFiveMinuteRate();
}
@Override
public double getMeanRate() {
return successfulCallsTimer.getMeanRate();
}
@Override
public double getOneMinuteRate() {
return successfulCallsTimer.getOneMinuteRate();
}
@Override
public Snapshot getSnapshot() {
return successfulCallsTimer.getSnapshot();
}
}
}