parent
1b79f3ce62
commit
b8b511e191
@ -0,0 +1,119 @@ |
|||||||
|
package org.libresonic.player.monitor; |
||||||
|
|
||||||
|
import com.codahale.metrics.JmxReporter; |
||||||
|
import com.codahale.metrics.MetricRegistry; |
||||||
|
|
||||||
|
import java.util.concurrent.TimeUnit; |
||||||
|
|
||||||
|
/** |
||||||
|
* Created by remi on 17/01/17. |
||||||
|
*/ |
||||||
|
public class MetricsManager { |
||||||
|
|
||||||
|
private static final MetricRegistry metrics = new MetricRegistry(); |
||||||
|
private static JmxReporter reporter; |
||||||
|
private static final NullTimer nullTimerSingleton = new NullTimer(null); |
||||||
|
|
||||||
|
static { |
||||||
|
reporter = JmxReporter.forRegistry(metrics) |
||||||
|
.convertRatesTo(TimeUnit.SECONDS.SECONDS) |
||||||
|
.convertDurationsTo(TimeUnit.MILLISECONDS) |
||||||
|
.build(); |
||||||
|
reporter.start(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public static TimerBuilder buildTimer(Class clazz, String name) { |
||||||
|
return new TimerBuilder(clazz,name); |
||||||
|
} |
||||||
|
|
||||||
|
public static TimerBuilder buildTimer(Object ref, String name) { |
||||||
|
return new TimerBuilder(ref.getClass(),name); |
||||||
|
} |
||||||
|
|
||||||
|
public interface TimerExecutor { |
||||||
|
void doWithTimer() throws Exception; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public static class TimerBuilder { |
||||||
|
private Timer theTimer; |
||||||
|
private Class clazz; |
||||||
|
private String name; |
||||||
|
|
||||||
|
public TimerBuilder() { |
||||||
|
} |
||||||
|
|
||||||
|
public TimerBuilder(Timer theTimer) { |
||||||
|
this.theTimer = theTimer; |
||||||
|
} |
||||||
|
|
||||||
|
public TimerBuilder(Class clazz, String name) { |
||||||
|
this.clazz = clazz; |
||||||
|
this.name = name; |
||||||
|
} |
||||||
|
|
||||||
|
public TimerBuilder condition(boolean ifTrue) { |
||||||
|
if (ifTrue == false) { |
||||||
|
theTimer = nullTimerSingleton; |
||||||
|
} |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
public Timer timer() { |
||||||
|
if (theTimer == null) { |
||||||
|
com.codahale.metrics.Timer t = metrics.timer(MetricRegistry.name(clazz,name)); |
||||||
|
com.codahale.metrics.Timer.Context tContext = t.time(); |
||||||
|
theTimer = new Timer(tContext); |
||||||
|
} |
||||||
|
return theTimer; |
||||||
|
} |
||||||
|
|
||||||
|
public void exec(TimerExecutor executor) throws Exception { |
||||||
|
if (theTimer == null) { |
||||||
|
com.codahale.metrics.Timer t = metrics.timer(MetricRegistry.name(clazz, name)); |
||||||
|
com.codahale.metrics.Timer.Context tContext = t.time(); |
||||||
|
theTimer = new Timer(tContext); |
||||||
|
} |
||||||
|
|
||||||
|
executor.doWithTimer(); |
||||||
|
|
||||||
|
theTimer.close(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
*/ |
||||||
|
public static class Timer implements AutoCloseable { |
||||||
|
|
||||||
|
private com.codahale.metrics.Timer.Context timerContext; |
||||||
|
|
||||||
|
protected Timer(com.codahale.metrics.Timer.Context timerContext) { |
||||||
|
this.timerContext = timerContext; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void close() { |
||||||
|
timerContext.stop(); |
||||||
|
} |
||||||
|
|
||||||
|
public Timer condition() { |
||||||
|
return null; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private static class NullTimer extends Timer { |
||||||
|
|
||||||
|
protected NullTimer(com.codahale.metrics.Timer.Context timerContext) { |
||||||
|
super(timerContext); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void close() { |
||||||
|
// Does nothing
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue