Author: chetanm
Date: Tue Nov 24 15:52:36 2015
New Revision: 1716185

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

Refactored to allow turning metric off for specific type in a simpler way. 
Metrics is turned off for all session related metric

Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/metric/MetricStatisticsProvider.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/metric/MetricStatisticsProviderTest.java
    
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/ReadPropertyTest.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/metric/MetricStatisticsProvider.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/metric/MetricStatisticsProvider.java?rev=1716185&r1=1716184&r2=1716185&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/metric/MetricStatisticsProvider.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/metric/MetricStatisticsProvider.java
 Tue Nov 24 15:52:36 2015
@@ -44,6 +44,7 @@ import org.apache.jackrabbit.oak.stats.C
 import org.apache.jackrabbit.oak.stats.MeterStats;
 import org.apache.jackrabbit.oak.stats.SimpleStats;
 import org.apache.jackrabbit.oak.stats.StatisticsProvider;
+import org.apache.jackrabbit.oak.stats.Stats;
 import org.apache.jackrabbit.oak.stats.TimerStats;
 import org.apache.jackrabbit.stats.RepositoryStatisticsImpl;
 import org.slf4j.Logger;
@@ -55,16 +56,16 @@ public class MetricStatisticsProvider im
     private static final String JMX_TYPE_METRICS = "Metrics";
 
     /**
-     * Name of Meters for which NoopMeter is to be returned as there are 
corresponding
-     * Timer instances which internally manage the Meter
+     * Types for which Noop Variant has to be used
      */
-    private static final Set<String> NOOP_METERS = ImmutableSet.of(
-            Type.SESSION_READ_COUNTER.name(), //Meter managed in 
SESSION_READ_DURATION
-            Type.SESSION_WRITE_COUNTER.name(), //Meter managed in 
SESSION_WRITE_DURATION
-            Type.QUERY_COUNT.name() //Meter managed in QUERY_DURATION
+    private static final Set<String> NOOPS_TYPES = ImmutableSet.of(
+            Type.SESSION_READ_DURATION.name(),
+            Type.SESSION_READ_COUNTER.name(),
+            Type.SESSION_WRITE_DURATION.name(),
+            Type.SESSION_WRITE_COUNTER.name()
     );
 
-    private final Map<String, CompositeStats> statsRegistry = 
Maps.newHashMap();
+    private final Map<String, Stats> statsRegistry = Maps.newHashMap();
     private final MetricRegistry registry;
     private final JmxReporter reporter;
     private final RepositoryStatisticsImpl repoStats;
@@ -99,20 +100,17 @@ public class MetricStatisticsProvider im
 
     @Override
     public MeterStats getMeter(String name) {
-        if (noopMeter(name)){
-            return NOOP.getMeter(name);
-        }
-        return getStats(name, StatsType.METER);
+        return getStats(name, StatsBuilder.METERS);
     }
 
     @Override
     public CounterStats getCounterStats(String name) {
-        return getStats(name, StatsType.COUNTER);
+        return getStats(name, StatsBuilder.COUNTERS);
     }
 
     @Override
     public TimerStats getTimer(String name) {
-        return getStats(name, StatsType.TIMER);
+        return getStats(name, StatsBuilder.TIMERS);
     }
 
     public MetricRegistry getRegistry() {
@@ -123,49 +121,38 @@ public class MetricStatisticsProvider im
         return repoStats;
     }
 
-    private synchronized CompositeStats getStats(String type, StatsType 
statsType) {
+    private synchronized <T extends Stats> T getStats(String type, 
StatsBuilder<T> builder) {
         String name = type;
         Type enumType = Type.getType(type);
-        CompositeStats stats = statsRegistry.get(type);
+        Stats stats = statsRegistry.get(type);
         if (stats == null) {
             SimpleStats delegate;
             if (enumType != null) {
                 delegate = new SimpleStats(repoStats.getCounter(enumType));
                 name = typeToName(enumType);
             } else {
-                boolean resetValueEachSecond = statsType != StatsType.COUNTER;
+                boolean resetValueEachSecond = builder != 
StatsBuilder.COUNTERS;
                 delegate = new SimpleStats(repoStats.getCounter(type, 
resetValueEachSecond));
             }
-            stats = createStat(name, statsType, delegate);
+
+            if (NOOPS_TYPES.contains(name)) {
+                stats = delegate;
+            } else {
+                stats = builder.newComposite(delegate, registry, name);
+            }
+
             statsRegistry.put(type, stats);
         }
-        return stats;
-    }
 
-    private CompositeStats createStat(String name, StatsType statsType, 
SimpleStats delegate) {
-        switch (statsType) {
-            case COUNTER:
-                MetricCounterStats counter = new 
MetricCounterStats(registry.counter(name));
-                return new CompositeStats(delegate, counter);
-            case TIMER:
-                MetricTimerStats timer = new 
MetricTimerStats(registry.timer(name));
-                return new CompositeStats(delegate, timer);
-            case METER:
-                MetricMeterStats meter = new 
MetricMeterStats(registry.meter(name));
-                return new CompositeStats(delegate, meter);
+        if (builder.isInstance(stats)) {
+            //noinspection unchecked
+            return (T) stats;
         }
+
         throw new IllegalStateException();
     }
 
     private void registerAverages() {
-        registry.register(typeToName(Type.SESSION_READ_AVERAGE),
-                new 
AvgGauge(registry.meter(typeToName(Type.SESSION_READ_COUNTER)),
-                        
registry.timer(typeToName(Type.SESSION_READ_DURATION))));
-
-        registry.register(typeToName(Type.SESSION_WRITE_AVERAGE),
-                new 
AvgGauge(registry.meter(typeToName(Type.SESSION_WRITE_COUNTER)),
-                        
registry.timer(typeToName(Type.SESSION_WRITE_DURATION))));
-
         registry.register(typeToName(Type.QUERY_AVERAGE),
                 new AvgGauge(registry.meter(typeToName(Type.QUERY_COUNT)),
                         registry.timer(typeToName(Type.QUERY_DURATION))));
@@ -175,11 +162,49 @@ public class MetricStatisticsProvider im
                         
registry.timer(typeToName(Type.OBSERVATION_EVENT_DURATION))));
     }
 
-    private boolean noopMeter(String name) {
-        return NOOP_METERS.contains(name);
-    }
+    @SuppressWarnings("unused")
+    private interface StatsBuilder<T extends Stats> {
+        StatsBuilder<CounterStats> COUNTERS = new StatsBuilder<CounterStats>() 
{
+            @Override
+            public CompositeStats newComposite(SimpleStats delegate, 
MetricRegistry registry,String name) {
+                return new CompositeStats(delegate, new 
MetricCounterStats(registry.counter(name)));
+            }
+
+            @Override
+            public boolean isInstance(Stats metric) {
+                return CounterStats.class.isInstance(metric);
+            }
+        };
 
-    private enum StatsType {METER, COUNTER, TIMER}
+        StatsBuilder<MeterStats> METERS = new StatsBuilder<MeterStats>() {
+            @Override
+            public CompositeStats newComposite(SimpleStats delegate, 
MetricRegistry registry,String name) {
+                return new CompositeStats(delegate, new 
MetricMeterStats(registry.meter(name)));
+            }
+
+            @Override
+            public boolean isInstance(Stats metric) {
+                return MeterStats.class.isInstance(metric);
+            }
+        };
+
+        StatsBuilder<TimerStats> TIMERS = new StatsBuilder<TimerStats>() {
+
+            @Override
+            public CompositeStats newComposite(SimpleStats delegate, 
MetricRegistry registry,String name) {
+                return new CompositeStats(delegate, new 
MetricTimerStats(registry.timer(name)));
+            }
+
+            @Override
+            public boolean isInstance(Stats metric) {
+                return TimerStats.class.isInstance(metric);
+            }
+        };
+
+        CompositeStats newComposite(SimpleStats delegate, MetricRegistry 
registry,String name);
+
+        boolean isInstance(Stats stats);
+    }
 
     private static class AvgGauge extends RatioGauge {
         private final Meter meter;

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/metric/MetricStatisticsProviderTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/metric/MetricStatisticsProviderTest.java?rev=1716185&r1=1716184&r2=1716185&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/metric/MetricStatisticsProviderTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/metric/MetricStatisticsProviderTest.java
 Tue Nov 24 15:52:36 2015
@@ -36,6 +36,7 @@ import org.apache.jackrabbit.api.stats.R
 import org.apache.jackrabbit.oak.stats.CounterStats;
 import org.apache.jackrabbit.oak.stats.MeterStats;
 import org.apache.jackrabbit.oak.stats.NoopStats;
+import org.apache.jackrabbit.oak.stats.SimpleStats;
 import org.apache.jackrabbit.oak.stats.TimerStats;
 import org.junit.After;
 import org.junit.Test;
@@ -53,8 +54,8 @@ public class MetricStatisticsProviderTes
     @Test
     public void basicSetup() throws Exception {
         statsProvider = new MetricStatisticsProvider(server, executorService);
-        assertEquals(4, statsProvider.getRegistry().getMeters().size());
-        assertEquals(4, statsProvider.getRegistry().getTimers().size());
+        assertEquals(2, statsProvider.getRegistry().getMeters().size());
+        assertEquals(2, statsProvider.getRegistry().getTimers().size());
 
         assertNotNull(statsProvider.getStats());
         assertEquals(statsProvider.getRegistry().getMetrics().size(), 
getMetricMbeans().size());
@@ -110,11 +111,10 @@ public class MetricStatisticsProviderTes
     }
 
     @Test
-    public void noopMeter() throws Exception{
+    public void noopMeter() throws Exception {
         statsProvider = new MetricStatisticsProvider(server, executorService);
-        assertEquals(statsProvider.getMeter(Type.SESSION_READ_COUNTER.name()), 
NoopStats.INSTANCE);
-        
assertEquals(statsProvider.getMeter(Type.SESSION_WRITE_COUNTER.name()), 
NoopStats.INSTANCE);
-        assertEquals(statsProvider.getMeter(Type.QUERY_COUNT.name()), 
NoopStats.INSTANCE);
+        assertTrue(statsProvider.getTimer(Type.SESSION_READ_DURATION.name()) 
instanceof SimpleStats);
+        assertTrue(statsProvider.getTimer(Type.SESSION_WRITE_DURATION.name()) 
instanceof SimpleStats);
         
assertNotEquals(statsProvider.getMeter(Type.OBSERVATION_EVENT_COUNTER.name()), 
NoopStats.INSTANCE);
     }
 

Modified: 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/ReadPropertyTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/ReadPropertyTest.java?rev=1716185&r1=1716184&r2=1716185&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/ReadPropertyTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/ReadPropertyTest.java
 Tue Nov 24 15:52:36 2015
@@ -99,7 +99,7 @@ public class ReadPropertyTest extends Ab
                                 .filter(new MetricFilter() {
                                     @Override
                                     public boolean matches(String name, Metric 
metric) {
-                                        return 
"SESSION_READ_DURATION".equals(name);
+                                        return name.startsWith("SESSION_READ");
                                     }
                                 })
                                 .convertDurationsTo(TimeUnit.MICROSECONDS)


Reply via email to