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());
}
}