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