Author: chetanm
Date: Wed Nov 25 06:30:47 2015
New Revision: 1716310

URL: http://svn.apache.org/viewvc?rev=1716310&view=rev
Log:
OAK-3654 - Integrate with Metrics for various stats collection

Introduce Context in TimerStats to simply duration handling

Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/metric/CompositeStats.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/NoopStats.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/SimpleStats.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/TimerStats.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/metric/CompositeStatsTest.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/stats/SimpleStatsTest.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/metric/CompositeStats.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/metric/CompositeStats.java?rev=1716310&r1=1716309&r2=1716310&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/metric/CompositeStats.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/metric/CompositeStats.java
 Wed Nov 25 06:30:47 2015
@@ -34,7 +34,7 @@ import org.apache.jackrabbit.oak.stats.T
  * and Metrics based meters so as to allow both systems to collect
  * stats
  */
-class CompositeStats implements CounterStats, MeterStats, TimerStats {
+final class CompositeStats implements CounterStats, MeterStats, TimerStats {
     private final SimpleStats delegate;
     private final Counter counter;
     private final Timer timer;
@@ -95,6 +95,11 @@ class CompositeStats implements CounterS
         timer.update(duration, unit);
     }
 
+    @Override
+    public Context time() {
+        return new StatsContext(timer.time(), delegate);
+    }
+
     boolean isMeter() {
         return meter != null && timer == null && counter == null;
     }
@@ -118,4 +123,26 @@ class CompositeStats implements CounterS
     Meter getMeter() {
         return meter;
     }
+
+    private static final class StatsContext implements Context {
+        private final Timer.Context context ;
+        private final SimpleStats simpleStats;
+
+        private StatsContext(Timer.Context context, SimpleStats delegate) {
+            this.context = context;
+            this.simpleStats = delegate;
+        }
+
+        public long stop() {
+            long nanos = context.stop();
+            simpleStats.update(nanos, TimeUnit.NANOSECONDS);
+            return nanos;
+        }
+
+        /** Equivalent to calling {@link #stop()}. */
+        @Override
+        public void close() {
+            stop();
+        }
+    }
 }

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/NoopStats.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/NoopStats.java?rev=1716310&r1=1716309&r2=1716310&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/NoopStats.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/NoopStats.java
 Wed Nov 25 06:30:47 2015
@@ -59,4 +59,23 @@ public final class NoopStats implements
 
     }
 
+    @Override
+    public Context time() {
+        return NoopContext.INSTANCE;
+    }
+
+    private static final class NoopContext implements Context {
+        public static final NoopContext INSTANCE = new NoopContext();
+
+        @Override
+        public long stop() {
+            return 0;
+        }
+
+        @Override
+        public void close() {
+
+        }
+    }
+
 }

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/SimpleStats.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/SimpleStats.java?rev=1716310&r1=1716309&r2=1716310&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/SimpleStats.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/SimpleStats.java
 Wed Nov 25 06:30:47 2015
@@ -58,4 +58,31 @@ public final class SimpleStats implement
     public void update(long duration, TimeUnit unit) {
         statsHolder.getAndAdd(unit.toMillis(duration));
     }
+
+    @Override
+    public Context time() {
+        return new SimpleContext(this);
+    }
+
+    private static final class SimpleContext implements Context {
+        private final TimerStats timer;
+        private final long startTime;
+
+        private SimpleContext(TimerStats timer) {
+            this.timer = timer;
+            this.startTime = System.nanoTime();
+        }
+
+        @Override
+        public long stop() {
+            final long elapsed = System.nanoTime() - startTime;
+            timer.update(elapsed, TimeUnit.NANOSECONDS);
+            return elapsed;
+        }
+
+        @Override
+        public void close() {
+            stop();
+        }
+    }
 }

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/TimerStats.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/TimerStats.java?rev=1716310&r1=1716309&r2=1716310&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/TimerStats.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/TimerStats.java
 Wed Nov 25 06:30:47 2015
@@ -19,6 +19,7 @@
 
 package org.apache.jackrabbit.oak.stats;
 
+import java.io.Closeable;
 import java.util.concurrent.TimeUnit;
 
 import aQute.bnd.annotation.ProviderType;
@@ -26,10 +27,32 @@ import aQute.bnd.annotation.ProviderType
 @ProviderType
 public interface TimerStats extends Stats{
     /**
+     * A timing context.
+     *
+     * @see TimerStats#time()
+     */
+    interface Context extends Closeable {
+        /**
+         * Updates the timer with the difference between current and start 
time. Call to this method will
+         * not reset the start time. Multiple calls result in multiple updates.
+         * @return the elapsed time in nanoseconds
+         */
+        long stop();
+    }
+
+    /**
      * Adds a recorded duration.
      *
      * @param duration the length of the duration
      * @param unit     the scale unit of {@code duration}
      */
     void update(long duration, TimeUnit unit);
+
+    /**
+     * Returns a new {@link Context}.
+     *
+     * @return a new {@link Context}
+     * @see Context
+     */
+    Context time();
 }

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/metric/CompositeStatsTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/metric/CompositeStatsTest.java?rev=1716310&r1=1716309&r2=1716310&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/metric/CompositeStatsTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/metric/CompositeStatsTest.java
 Wed Nov 25 06:30:47 2015
@@ -23,9 +23,11 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
 
 import com.codahale.metrics.Counter;
+import com.codahale.metrics.ExponentiallyDecayingReservoir;
 import com.codahale.metrics.Meter;
 import com.codahale.metrics.MetricRegistry;
 import com.codahale.metrics.Timer;
+import org.apache.jackrabbit.oak.stats.Clock;
 import org.apache.jackrabbit.oak.stats.CounterStats;
 import org.apache.jackrabbit.oak.stats.MeterStats;
 import org.apache.jackrabbit.oak.stats.SimpleStats;
@@ -33,6 +35,9 @@ import org.apache.jackrabbit.oak.stats.T
 import org.junit.Test;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
 
 public class CompositeStatsTest {
     private MetricRegistry registry = new MetricRegistry();
@@ -41,7 +46,7 @@ public class CompositeStatsTest {
     @Test
     public void counter() throws Exception {
         Counter counter = registry.counter("test");
-        CounterStats counterStats = new CompositeStats(simpleStats, counter);
+        CompositeStats counterStats = new CompositeStats(simpleStats, counter);
 
         counterStats.inc();
         assertEquals(1, simpleStats.getCount());
@@ -55,12 +60,17 @@ public class CompositeStatsTest {
         counterStats.dec();
         assertEquals(2, simpleStats.getCount());
         assertEquals(2, counter.getCount());
+
+        assertFalse(counterStats.isMeter());
+        assertFalse(counterStats.isTimer());
+        assertTrue(counterStats.isCounter());
+        assertNotNull(counterStats.getCounter());
     }
 
     @Test
     public void meter() throws Exception {
         Meter meter = registry.meter("test");
-        MeterStats meterStats = new CompositeStats(simpleStats, meter);
+        CompositeStats meterStats = new CompositeStats(simpleStats, meter);
 
         meterStats.mark();
         assertEquals(1, simpleStats.getCount());
@@ -69,15 +79,47 @@ public class CompositeStatsTest {
         meterStats.mark(5);
         assertEquals(6, simpleStats.getCount());
         assertEquals(6, meter.getCount());
+        assertTrue(meterStats.isMeter());
+        assertFalse(meterStats.isTimer());
+        assertFalse(meterStats.isCounter());
+        assertNotNull(meterStats.getMeter());
     }
 
     @Test
     public void timer() throws Exception {
         Timer time = registry.timer("test");
-        TimerStats timerStats = new CompositeStats(simpleStats, time);
+        CompositeStats timerStats = new CompositeStats(simpleStats, time);
 
         timerStats.update(100, TimeUnit.SECONDS);
         assertEquals(1, time.getCount());
         assertEquals(TimeUnit.SECONDS.toMillis(100), simpleStats.getCount());
+
+        assertFalse(timerStats.isMeter());
+        assertTrue(timerStats.isTimer());
+        assertFalse(timerStats.isCounter());
+        assertNotNull(timerStats.getTimer());
+    }
+
+    @Test
+    public void timerContext() throws Exception{
+        VirtualClock clock = new VirtualClock();
+        Timer time = new Timer(new ExponentiallyDecayingReservoir(), clock);
+
+        TimerStats timerStats = new CompositeStats(simpleStats, time);
+        TimerStats.Context context = timerStats.time();
+
+        clock.tick = TimeUnit.SECONDS.toNanos(314);
+        context.close();
+
+        assertEquals(1, time.getCount());
+        assertEquals(TimeUnit.SECONDS.toMillis(314), simpleStats.getCount());
+    }
+
+    private static class VirtualClock extends com.codahale.metrics.Clock {
+        long tick;
+        @Override
+        public long getTick() {
+            return tick;
+        }
     }
 }

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/stats/SimpleStatsTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/stats/SimpleStatsTest.java?rev=1716310&r1=1716309&r2=1716310&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/stats/SimpleStatsTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/stats/SimpleStatsTest.java
 Wed Nov 25 06:30:47 2015
@@ -49,6 +49,12 @@ public class SimpleStatsTest {
         counter.set(0);
         stats.update(100, TimeUnit.SECONDS);
         assertEquals(TimeUnit.MILLISECONDS.convert(100, TimeUnit.SECONDS), 
counter.get());
+
+        counter.set(0);
+        TimerStats.Context context = stats.time();
+        long delta = context.stop();
+        TimeUnit.MILLISECONDS.sleep(42);
+        assertEquals(TimeUnit.NANOSECONDS.toMillis(delta), counter.get());
     }
 
     @Test
@@ -70,5 +76,8 @@ public class SimpleStatsTest {
 
         noop.update(100, TimeUnit.SECONDS);
         assertEquals(0, noop.getCount());
+
+        TimerStats.Context context = noop.time();
+        assertEquals(0, context.stop());
     }
 }


Reply via email to