You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by ch...@apache.org on 2015/12/23 07:24:46 UTC

svn commit: r1721498 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/plugins/blob/ main/java/org/apache/jackrabbit/oak/plugins/metric/ main/java/org/apache/jackrabbit/oak/stats/ test/java/org/apache/jackrabbit/oak/plugins/m...

Author: chetanm
Date: Wed Dec 23 06:24:45 2015
New Revision: 1721498

URL: http://svn.apache.org/viewvc?rev=1721498&view=rev
Log:
OAK-3791 - StatisticsProvider should provide a way to disable TimeSeries for certain metrics

Introducing StatsOptions which can be passed as part of metric creation call to control the various options.

Added:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/metric/CounterImpl.java   (with props)
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/metric/HistogramImpl.java   (with props)
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/metric/MeterImpl.java   (with props)
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/metric/TimerImpl.java   (with props)
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/StatsOptions.java   (with props)
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/metric/MetricImplTest.java   (with props)
Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/BlobStoreStats.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/metric/MetricStatisticsProvider.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/DefaultStatisticsProvider.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/StatisticManager.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/StatisticsProvider.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/metric/MetricStatisticsProviderTest.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/stats/DefaultStatisticsProviderTest.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/stats/StatisticManagerTest.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/BlobStoreStats.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/BlobStoreStats.java?rev=1721498&r1=1721497&r2=1721498&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/BlobStoreStats.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/blob/BlobStoreStats.java Wed Dec 23 06:24:45 2015
@@ -28,6 +28,7 @@ import org.apache.jackrabbit.oak.spi.blo
 import org.apache.jackrabbit.oak.stats.HistogramStats;
 import org.apache.jackrabbit.oak.stats.MeterStats;
 import org.apache.jackrabbit.oak.stats.StatisticsProvider;
+import org.apache.jackrabbit.oak.stats.StatsOptions;
 import org.apache.jackrabbit.stats.TimeSeriesStatsUtil;
 
 import static org.apache.jackrabbit.oak.commons.IOUtils.humanReadableByteCount;
@@ -49,15 +50,15 @@ public class BlobStoreStats implements B
     public BlobStoreStats(StatisticsProvider sp) {
         this.statisticsProvider = sp;
 
-        this.uploadHisto = sp.getHistogram(BLOB_UPLOADS);
+        this.uploadHisto = sp.getHistogram(BLOB_UPLOADS, StatsOptions.DEFAULT);
         //TODO Need to expose an API in StatisticsProvider to register for avg
         //That would give us upload and download *rate*
-        this.uploadSizeMeter = sp.getMeter("BLOB_UPLOAD_SIZE");
-        this.uploadTimeMeter = sp.getMeter("BLOB_UPLOAD_TIME");
+        this.uploadSizeMeter = sp.getMeter("BLOB_UPLOAD_SIZE", StatsOptions.DEFAULT);
+        this.uploadTimeMeter = sp.getMeter("BLOB_UPLOAD_TIME", StatsOptions.DEFAULT);
 
-        this.downloadHisto = sp.getHistogram(BLOB_DOWNLOADS);
-        this.downloadSizeMeter = sp.getMeter("BLOB_DOWNLOAD_SIZE");
-        this.downloadTimeMeter = sp.getMeter("BLOB_DOWNLOAD_TIME");
+        this.downloadHisto = sp.getHistogram(BLOB_DOWNLOADS, StatsOptions.DEFAULT);
+        this.downloadSizeMeter = sp.getMeter("BLOB_DOWNLOAD_SIZE", StatsOptions.DEFAULT);
+        this.downloadTimeMeter = sp.getMeter("BLOB_DOWNLOAD_TIME", StatsOptions.DEFAULT);
     }
 
     @Override

Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/metric/CounterImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/metric/CounterImpl.java?rev=1721498&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/metric/CounterImpl.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/metric/CounterImpl.java Wed Dec 23 06:24:45 2015
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.jackrabbit.oak.plugins.metric;
+
+import com.codahale.metrics.Counter;
+import org.apache.jackrabbit.oak.stats.CounterStats;
+
+final class CounterImpl implements CounterStats {
+    private final Counter counter;
+
+    CounterImpl(Counter counter) {
+        this.counter = counter;
+    }
+
+    @Override
+    public void inc() {
+        counter.inc();
+    }
+
+    @Override
+    public void dec() {
+        counter.dec();
+    }
+
+    @Override
+    public void inc(long n) {
+        counter.inc(n);
+    }
+
+    @Override
+    public void dec(long n) {
+        counter.dec(n);
+    }
+
+    @Override
+    public long getCount() {
+        return counter.getCount();
+    }
+}

Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/metric/CounterImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/metric/HistogramImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/metric/HistogramImpl.java?rev=1721498&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/metric/HistogramImpl.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/metric/HistogramImpl.java Wed Dec 23 06:24:45 2015
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.jackrabbit.oak.plugins.metric;
+
+import com.codahale.metrics.Histogram;
+import org.apache.jackrabbit.oak.stats.HistogramStats;
+
+final class HistogramImpl implements HistogramStats {
+    private final Histogram histogram;
+
+    HistogramImpl(Histogram histogram) {
+        this.histogram = histogram;
+    }
+
+    @Override
+    public void update(long value) {
+        histogram.update(value);
+    }
+
+    @Override
+    public long getCount() {
+        return histogram.getCount();
+    }
+}

Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/metric/HistogramImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/metric/MeterImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/metric/MeterImpl.java?rev=1721498&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/metric/MeterImpl.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/metric/MeterImpl.java Wed Dec 23 06:24:45 2015
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.jackrabbit.oak.plugins.metric;
+
+import com.codahale.metrics.Meter;
+import org.apache.jackrabbit.oak.stats.MeterStats;
+
+final class MeterImpl implements MeterStats {
+    private final Meter meter;
+
+    MeterImpl(Meter meter) {
+        this.meter = meter;
+    }
+
+    @Override
+    public void mark() {
+        meter.mark();
+    }
+
+    @Override
+    public void mark(long n) {
+        meter.mark(n);
+    }
+
+    @Override
+    public long getCount() {
+        return meter.getCount();
+    }
+}

Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/metric/MeterImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

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=1721498&r1=1721497&r2=1721498&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 Wed Dec 23 06:24:45 2015
@@ -22,9 +22,9 @@ package org.apache.jackrabbit.oak.plugin
 import java.io.Closeable;
 import java.util.Hashtable;
 import java.util.Map;
-import java.util.Set;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicLong;
 
 import javax.management.MBeanServer;
 import javax.management.MalformedObjectNameException;
@@ -36,7 +36,6 @@ import com.codahale.metrics.MetricRegist
 import com.codahale.metrics.ObjectNameFactory;
 import com.codahale.metrics.RatioGauge;
 import com.codahale.metrics.Timer;
-import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Maps;
 import org.apache.jackrabbit.api.stats.RepositoryStatistics;
 import org.apache.jackrabbit.api.stats.RepositoryStatistics.Type;
@@ -49,6 +48,7 @@ import org.apache.jackrabbit.oak.stats.M
 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.StatsOptions;
 import org.apache.jackrabbit.oak.stats.TimerStats;
 import org.apache.jackrabbit.stats.RepositoryStatisticsImpl;
 import org.slf4j.Logger;
@@ -59,17 +59,6 @@ public class MetricStatisticsProvider im
 
     private static final String JMX_TYPE_METRICS = "Metrics";
 
-    /**
-     * Types for which Metrics based stats would not be collected
-     * and only default stats would be collected
-     */
-    private static final Set<String> NOOP_METRIC_TYPES = ImmutableSet.of(
-            Type.SESSION_READ_COUNTER.name(),
-            Type.SESSION_READ_DURATION.name(),
-            Type.SESSION_WRITE_DURATION.name(),
-            Type.QUERY_COUNT.name()
-    );
-
     private final Map<String, Stats> statsRegistry = Maps.newHashMap();
     private final MetricRegistry registry;
     private final JmxReporter reporter;
@@ -109,23 +98,23 @@ public class MetricStatisticsProvider im
     }
 
     @Override
-    public MeterStats getMeter(String name) {
-        return getStats(name, StatsBuilder.METERS);
+    public MeterStats getMeter(String name, StatsOptions options) {
+        return getStats(name, StatsBuilder.METERS, options);
     }
 
     @Override
-    public CounterStats getCounterStats(String name) {
-        return getStats(name, StatsBuilder.COUNTERS);
+    public CounterStats getCounterStats(String name, StatsOptions options) {
+        return getStats(name, StatsBuilder.COUNTERS, options);
     }
 
     @Override
-    public TimerStats getTimer(String name) {
-        return getStats(name, StatsBuilder.TIMERS);
+    public TimerStats getTimer(String name, StatsOptions options) {
+        return getStats(name, StatsBuilder.TIMERS, options);
     }
 
     @Override
-    public HistogramStats getHistogram(String name) {
-        return getStats(name, StatsBuilder.HISTOGRAMS);
+    public HistogramStats getHistogram(String name, StatsOptions options) {
+        return getStats(name, StatsBuilder.HISTOGRAMS, options);
     }
 
     public MetricRegistry getRegistry() {
@@ -136,27 +125,17 @@ public class MetricStatisticsProvider im
         return repoStats;
     }
 
-    private synchronized <T extends Stats> T getStats(String type, StatsBuilder<T> builder) {
-        String name = type;
-        Type enumType = Type.getType(type);
-        Stats stats = statsRegistry.get(type);
+    private synchronized <T extends Stats> T getStats(String name, StatsBuilder<T> builder, StatsOptions options) {
+        Stats stats = statsRegistry.get(name);
         if (stats == null) {
-            SimpleStats delegate;
-            if (enumType != null) {
-                delegate = new SimpleStats(repoStats.getCounter(enumType), builder.getType());
-                name = typeToName(enumType);
-            } else {
-                boolean resetValueEachSecond = builder != StatsBuilder.COUNTERS;
-                delegate = new SimpleStats(repoStats.getCounter(type, resetValueEachSecond), builder.getType());
-            }
-
-            if (NOOP_METRIC_TYPES.contains(name)) {
-                stats = delegate;
+            if (options.isOnlyMetricEnabled()) {
+                stats = builder.newMetric(this, name);
+            } else if (options.isOnlyTimeSeriesEnabled()){
+                stats = getTimerSeriesStats(name, builder);
             } else {
-                stats = builder.newComposite(delegate, this, name);
+                stats = builder.newComposite(getTimerSeriesStats(name, builder), this, name);
             }
-
-            statsRegistry.put(type, stats);
+            statsRegistry.put(name, stats);
         }
 
         if (builder.isInstance(stats)) {
@@ -167,6 +146,18 @@ public class MetricStatisticsProvider im
         throw new IllegalStateException();
     }
 
+    private SimpleStats getTimerSeriesStats(String name, StatsBuilder builder){
+        AtomicLong counter;
+        Type enumType = Type.getType(name);
+        if (enumType != null) {
+            counter = repoStats.getCounter(enumType);
+        } else {
+            boolean resetValueEachSecond = builder != StatsBuilder.COUNTERS;
+            counter = repoStats.getCounter(name, resetValueEachSecond);
+        }
+        return new SimpleStats(counter, builder.getType());
+    }
+
     private void registerAverages() {
         registry.register(typeToName(Type.OBSERVATION_EVENT_AVERAGE),
                 new AvgGauge(compStats(Type.OBSERVATION_EVENT_COUNTER, StatsBuilder.METERS).getMeter(),
@@ -174,7 +165,7 @@ public class MetricStatisticsProvider im
     }
 
     private CompositeStats compStats(Type type, StatsBuilder builder){
-        Stats stats = getStats(typeToName(type), builder);
+        Stats stats = getStats(typeToName(type), builder, StatsOptions.DEFAULT);
         return (CompositeStats) stats;
     }
 
@@ -187,6 +178,11 @@ public class MetricStatisticsProvider im
             }
 
             @Override
+            public Stats newMetric(MetricStatisticsProvider provider, String name) {
+                return new CounterImpl(provider.registry.counter(name));
+            }
+
+            @Override
             public boolean isInstance(Stats metric) {
                 return CounterStats.class.isInstance(metric);
             }
@@ -200,9 +196,12 @@ public class MetricStatisticsProvider im
         StatsBuilder<MeterStats> METERS = new StatsBuilder<MeterStats>() {
             @Override
             public CompositeStats newComposite(SimpleStats delegate, MetricStatisticsProvider provider,String name) {
-                Meter meter = new Meter(provider.metricsClock);
-                provider.registry.register(name, meter);
-                return new CompositeStats(delegate, meter);
+                return new CompositeStats(delegate, getMeter(provider, name));
+            }
+
+            @Override
+            public Stats newMetric(MetricStatisticsProvider provider, String name) {
+                return new MeterImpl(getMeter(provider, name));
             }
 
             @Override
@@ -214,6 +213,12 @@ public class MetricStatisticsProvider im
             public SimpleStats.Type getType() {
                 return SimpleStats.Type.METER;
             }
+
+            private Meter getMeter(MetricStatisticsProvider provider, String name) {
+                Meter meter = new Meter(provider.metricsClock);
+                provider.registry.register(name, meter);
+                return meter;
+            }
         };
 
         StatsBuilder<TimerStats> TIMERS = new StatsBuilder<TimerStats>() {
@@ -224,6 +229,11 @@ public class MetricStatisticsProvider im
             }
 
             @Override
+            public Stats newMetric(MetricStatisticsProvider provider, String name) {
+                return new TimerImpl(provider.registry.timer(name));
+            }
+
+            @Override
             public boolean isInstance(Stats metric) {
                 return TimerStats.class.isInstance(metric);
             }
@@ -242,6 +252,11 @@ public class MetricStatisticsProvider im
             }
 
             @Override
+            public Stats newMetric(MetricStatisticsProvider provider, String name) {
+                return new HistogramImpl(provider.registry.histogram(name));
+            }
+
+            @Override
             public boolean isInstance(Stats metric) {
                 return HistogramStats.class.isInstance(metric);
             }
@@ -254,6 +269,8 @@ public class MetricStatisticsProvider im
 
         CompositeStats newComposite(SimpleStats delegate, MetricStatisticsProvider provider,String name);
 
+        Stats newMetric(MetricStatisticsProvider provider,String name);
+
         boolean isInstance(Stats stats);
 
         SimpleStats.Type getType();

Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/metric/TimerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/metric/TimerImpl.java?rev=1721498&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/metric/TimerImpl.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/metric/TimerImpl.java Wed Dec 23 06:24:45 2015
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.jackrabbit.oak.plugins.metric;
+
+import java.util.concurrent.TimeUnit;
+
+import com.codahale.metrics.Timer;
+import org.apache.jackrabbit.oak.stats.TimerStats;
+
+final class TimerImpl implements TimerStats{
+    private final Timer timer;
+
+    TimerImpl(Timer timer) {
+        this.timer = timer;
+    }
+
+    @Override
+    public void update(long duration, TimeUnit unit) {
+        timer.update(duration, unit);
+    }
+
+    @Override
+    public Context time() {
+        return new ContextImpl(timer.time());
+    }
+
+    @Override
+    public long getCount() {
+        return timer.getCount();
+    }
+
+    private static final class ContextImpl implements Context {
+        private final Timer.Context context ;
+
+        private ContextImpl(Timer.Context context) {
+            this.context = context;
+        }
+
+        public long stop() {
+            return context.stop();
+        }
+
+        /** Equivalent to calling {@link #stop()}. */
+        @Override
+        public void close() {
+            stop();
+        }
+    }
+}

Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/metric/TimerImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/DefaultStatisticsProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/DefaultStatisticsProvider.java?rev=1721498&r1=1721497&r2=1721498&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/DefaultStatisticsProvider.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/DefaultStatisticsProvider.java Wed Dec 23 06:24:45 2015
@@ -21,6 +21,7 @@ package org.apache.jackrabbit.oak.stats;
 
 import java.util.Map;
 import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.atomic.AtomicLong;
 
 import com.google.common.collect.Maps;
 import org.apache.jackrabbit.api.stats.RepositoryStatistics;
@@ -41,33 +42,36 @@ public final class DefaultStatisticsProv
     }
 
     @Override
-    public MeterStats getMeter(String name) {
-        return getStats(name, true, SimpleStats.Type.METER);
+    public MeterStats getMeter(String name, StatsOptions options) {
+        return getStats(name, true, SimpleStats.Type.METER, options);
     }
 
     @Override
-    public CounterStats getCounterStats(String name) {
-        return getStats(name, false, SimpleStats.Type.COUNTER);
+    public CounterStats getCounterStats(String name, StatsOptions options) {
+        return getStats(name, false, SimpleStats.Type.COUNTER, options);
     }
 
     @Override
-    public TimerStats getTimer(String name) {
-        return getStats(name, true, SimpleStats.Type.TIMER);
+    public TimerStats getTimer(String name, StatsOptions options) {
+        return getStats(name, true, SimpleStats.Type.TIMER, options);
     }
 
     @Override
-    public HistogramStats getHistogram(String name) {
-        return getStats(name, true, SimpleStats.Type.HISTOGRAM);
+    public HistogramStats getHistogram(String name, StatsOptions options) {
+        return getStats(name, true, SimpleStats.Type.HISTOGRAM, options);
     }
 
-    private synchronized SimpleStats getStats(String type, boolean resetValueEachSecond, SimpleStats.Type statsType){
+    private synchronized SimpleStats getStats(String type, boolean resetValueEachSecond, SimpleStats.Type statsType,
+                                              StatsOptions options){
         Type enumType = Type.getType(type);
         SimpleStats stats = statsMeters.get(type);
         if (stats == null){
             if (enumType != null) {
                 stats = new SimpleStats(repoStats.getCounter(enumType), statsType);
-            } else {
+            } else if (options.isTimeSeriesEnabled()) {
                 stats = new SimpleStats(repoStats.getCounter(type, resetValueEachSecond), statsType);
+            } else {
+                stats = new SimpleStats(new AtomicLong(), statsType);
             }
             statsMeters.put(type, stats);
         }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/StatisticManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/StatisticManager.java?rev=1721498&r1=1721497&r2=1721498&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/StatisticManager.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/StatisticManager.java Wed Dec 23 06:24:45 2015
@@ -22,8 +22,9 @@ package org.apache.jackrabbit.oak.stats;
 import static org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardUtils.registerMBean;
 import static org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardUtils.scheduleWithFixedDelay;
 
+import java.util.EnumSet;
+import java.util.Set;
 import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.atomic.AtomicLong;
 
 import org.apache.jackrabbit.api.jmx.QueryStatManagerMBean;
 import org.apache.jackrabbit.api.stats.RepositoryStatistics.Type;
@@ -47,6 +48,17 @@ public class StatisticManager {
     private final CompositeRegistration registration;
 
     /**
+     * Types for which Metrics based stats would not be collected
+     * and only default stats would be collected
+     */
+    private static final EnumSet<Type> NOOP_METRIC_TYPES = EnumSet.of(
+            Type.SESSION_READ_COUNTER,
+            Type.SESSION_READ_DURATION,
+            Type.SESSION_WRITE_DURATION,
+            Type.QUERY_COUNT
+    );
+
+    /**
      * Create a new instance of this class registering all repository wide
      * statistics with the passed {@code whiteboard}.
      * @param whiteboard   whiteboard for registering the individual statistics with
@@ -80,15 +92,15 @@ public class StatisticManager {
     }
 
     public MeterStats getMeter(Type type){
-        return repoStats.getMeter(type.name());
+        return repoStats.getMeter(type.name(), getOption(type));
     }
 
     public CounterStats getStatsCounter(Type type){
-        return repoStats.getCounterStats(type.name());
+        return repoStats.getCounterStats(type.name(), getOption(type));
     }
 
     public TimerStats getTimer(Type type){
-        return repoStats.getTimer(type.name());
+        return repoStats.getTimer(type.name(), getOption(type));
     }
 
 
@@ -113,4 +125,11 @@ public class StatisticManager {
         return provider;
     }
 
+    private static StatsOptions getOption(Type type){
+        if (NOOP_METRIC_TYPES.contains(type)){
+            return StatsOptions.TIME_SERIES_ONLY;
+        }
+        return StatsOptions.DEFAULT;
+    }
+
 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/StatisticsProvider.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/StatisticsProvider.java?rev=1721498&r1=1721497&r2=1721498&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/StatisticsProvider.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/StatisticsProvider.java Wed Dec 23 06:24:45 2015
@@ -24,7 +24,6 @@ import org.apache.jackrabbit.api.stats.R
 
 @ProviderType
 public interface StatisticsProvider {
-
     StatisticsProvider NOOP = new StatisticsProvider() {
         @Override
         public RepositoryStatistics getStats() {
@@ -32,22 +31,22 @@ public interface StatisticsProvider {
         }
 
         @Override
-        public MeterStats getMeter(String name) {
+        public MeterStats getMeter(String name, StatsOptions options) {
             return NoopStats.INSTANCE;
         }
 
         @Override
-        public CounterStats getCounterStats(String name) {
+        public CounterStats getCounterStats(String name, StatsOptions options) {
             return NoopStats.INSTANCE;
         }
 
         @Override
-        public TimerStats getTimer(String name) {
+        public TimerStats getTimer(String name, StatsOptions options) {
             return NoopStats.INSTANCE;
         }
 
         @Override
-        public HistogramStats getHistogram(String name) {
+        public HistogramStats getHistogram(String name, StatsOptions options) {
             return NoopStats.INSTANCE;
         }
     };
@@ -55,11 +54,11 @@ public interface StatisticsProvider {
 
     RepositoryStatistics getStats();
 
-    MeterStats getMeter(String name);
+    MeterStats getMeter(String name, StatsOptions options);
 
-    CounterStats getCounterStats(String name);
+    CounterStats getCounterStats(String name, StatsOptions options);
 
-    TimerStats getTimer(String name);
+    TimerStats getTimer(String name, StatsOptions options);
 
-    HistogramStats getHistogram(String name);
+    HistogramStats getHistogram(String name, StatsOptions options);
 }

Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/StatsOptions.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/StatsOptions.java?rev=1721498&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/StatsOptions.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/StatsOptions.java Wed Dec 23 06:24:45 2015
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.jackrabbit.oak.stats;
+
+public final class StatsOptions {
+    /**
+     * Default mode where both TimeSeries data and other statistical data
+     * would be collected
+     */
+    public static final StatsOptions DEFAULT = new StatsOptions(true, true);
+    /**
+     * In this mode only TimeSeries data would be collected.
+     */
+    public static final StatsOptions TIME_SERIES_ONLY = new StatsOptions(true, false);
+    /**
+     * In this mode only statistical data would be collected.
+     */
+    public static final StatsOptions METRICS_ONLY = new StatsOptions(false, true);
+
+    private final boolean timeSeriesEnabled;
+    private final boolean metricsEnabled;
+
+    private StatsOptions(boolean timeSeriesEnabled, boolean metricsEnabled) {
+        this.metricsEnabled = metricsEnabled;
+        this.timeSeriesEnabled = timeSeriesEnabled;
+    }
+
+    public boolean isTimeSeriesEnabled() {
+        return timeSeriesEnabled;
+    }
+
+    public boolean isMetricsEnabled() {
+        return metricsEnabled;
+    }
+
+    public boolean isOnlyMetricEnabled() {
+        return !timeSeriesEnabled && metricsEnabled;
+    }
+
+    public boolean isOnlyTimeSeriesEnabled() {
+        return timeSeriesEnabled && !metricsEnabled;
+    }
+
+}

Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/StatsOptions.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/metric/MetricImplTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/metric/MetricImplTest.java?rev=1721498&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/metric/MetricImplTest.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/metric/MetricImplTest.java Wed Dec 23 06:24:45 2015
@@ -0,0 +1,121 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.jackrabbit.oak.plugins.metric;
+
+import java.util.concurrent.TimeUnit;
+
+import com.codahale.metrics.Counter;
+import com.codahale.metrics.ExponentiallyDecayingReservoir;
+import com.codahale.metrics.Histogram;
+import com.codahale.metrics.Meter;
+import com.codahale.metrics.MetricRegistry;
+import com.codahale.metrics.Timer;
+import org.apache.jackrabbit.oak.stats.TimerStats;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class MetricImplTest {
+    private MetricRegistry registry = new MetricRegistry();
+
+
+    @Test
+    public void counter() throws Exception {
+        Counter counter = registry.counter("test");
+        CounterImpl counterStats = new CounterImpl(counter);
+
+        counterStats.inc();
+        assertEquals(1, counter.getCount());
+        assertEquals(1, counterStats.getCount());
+
+        counterStats.inc();
+        counterStats.inc();
+
+        counterStats.dec();
+        assertEquals(2, counter.getCount());
+
+        counterStats.inc(7);
+        assertEquals(9, counter.getCount());
+
+        counterStats.dec(5);
+        assertEquals(4, counter.getCount());
+        assertEquals(4, counterStats.getCount());
+    }
+
+    @Test
+    public void meter() throws Exception {
+        Meter meter = registry.meter("test");
+        MeterImpl meterStats = new MeterImpl(meter);
+
+        meterStats.mark();
+        assertEquals(1, meter.getCount());
+
+        meterStats.mark(5);
+        assertEquals(6, meter.getCount());
+        assertEquals(6, meterStats.getCount());
+    }
+
+    @Test
+    public void timer() throws Exception {
+        Timer time = registry.timer("test");
+        TimerImpl timerStats = new TimerImpl(time);
+
+        timerStats.update(100, TimeUnit.SECONDS);
+        assertEquals(1, time.getCount());
+        assertEquals(TimeUnit.SECONDS.toNanos(100), time.getSnapshot().getMax());
+
+        timerStats.update(100, TimeUnit.SECONDS);
+        assertEquals(2, time.getCount());
+        assertEquals(2, timerStats.getCount());
+    }
+
+    @Test
+    public void histogram() throws Exception {
+        Histogram histo = registry.histogram("test");
+        HistogramImpl histoStats = new HistogramImpl(histo);
+
+        histoStats.update(100);
+        assertEquals(1, histo.getCount());
+        assertEquals(100, histo.getSnapshot().getMax());
+    }
+
+    @Test
+    public void timerContext() throws Exception{
+        VirtualClock clock = new VirtualClock();
+        Timer time = new Timer(new ExponentiallyDecayingReservoir(), clock);
+
+        TimerStats timerStats = new TimerImpl(time);
+        TimerStats.Context context = timerStats.time();
+
+        clock.tick = TimeUnit.SECONDS.toNanos(314);
+        context.close();
+
+        assertEquals(1, time.getCount());
+        assertEquals(TimeUnit.SECONDS.toNanos(314), time.getSnapshot().getMax());
+    }
+
+    private static class VirtualClock extends com.codahale.metrics.Clock {
+        long tick;
+        @Override
+        public long getTick() {
+            return tick;
+        }
+    }
+}

Propchange: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/metric/MetricImplTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

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=1721498&r1=1721497&r2=1721498&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 Wed Dec 23 06:24:45 2015
@@ -38,6 +38,7 @@ import org.apache.jackrabbit.oak.stats.H
 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.StatsOptions;
 import org.apache.jackrabbit.oak.stats.TimerStats;
 import org.junit.After;
 import org.junit.Test;
@@ -46,16 +47,15 @@ import static org.junit.Assert.assertEqu
 import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 public class MetricStatisticsProviderTest {
     private MBeanServer server = ManagementFactory.getPlatformMBeanServer();
     private ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
-    private MetricStatisticsProvider statsProvider;
+    private MetricStatisticsProvider statsProvider = new MetricStatisticsProvider(server, executorService);
 
     @Test
     public void basicSetup() throws Exception {
-        statsProvider = new MetricStatisticsProvider(server, executorService);
-
         //By default avg counters would be configured. So check if they are
         //configured
         assertEquals(1, statsProvider.getRegistry().getMeters().size());
@@ -70,8 +70,7 @@ public class MetricStatisticsProviderTes
 
     @Test
     public void meter() throws Exception {
-        statsProvider = new MetricStatisticsProvider(server, executorService);
-        MeterStats meterStats = statsProvider.getMeter("test");
+        MeterStats meterStats = statsProvider.getMeter("test", StatsOptions.DEFAULT);
 
         assertNotNull(meterStats);
         assertNotNull(statsProvider.getRegistry().getMeters().containsKey("test"));
@@ -80,8 +79,7 @@ public class MetricStatisticsProviderTes
 
     @Test
     public void counter() throws Exception {
-        statsProvider = new MetricStatisticsProvider(server, executorService);
-        CounterStats counterStats = statsProvider.getCounterStats("test");
+        CounterStats counterStats = statsProvider.getCounterStats("test", StatsOptions.DEFAULT);
 
         assertNotNull(counterStats);
         assertNotNull(statsProvider.getRegistry().getCounters().containsKey("test"));
@@ -90,8 +88,7 @@ public class MetricStatisticsProviderTes
 
     @Test
     public void timer() throws Exception {
-        statsProvider = new MetricStatisticsProvider(server, executorService);
-        TimerStats timerStats = statsProvider.getTimer("test");
+        TimerStats timerStats = statsProvider.getTimer("test", StatsOptions.DEFAULT);
 
         assertNotNull(timerStats);
         assertNotNull(statsProvider.getRegistry().getTimers().containsKey("test"));
@@ -100,8 +97,7 @@ public class MetricStatisticsProviderTes
 
     @Test
     public void histogram() throws Exception {
-        statsProvider = new MetricStatisticsProvider(server, executorService);
-        HistogramStats histoStats = statsProvider.getHistogram("test");
+        HistogramStats histoStats = statsProvider.getHistogram("test", StatsOptions.DEFAULT);
 
         assertNotNull(histoStats);
         assertNotNull(statsProvider.getRegistry().getHistograms().containsKey("test"));
@@ -110,8 +106,7 @@ public class MetricStatisticsProviderTes
 
     @Test
     public void timeSeriesIntegration() throws Exception {
-        statsProvider = new MetricStatisticsProvider(server, executorService);
-        MeterStats meterStats = statsProvider.getMeter(Type.SESSION_COUNT.name());
+        MeterStats meterStats = statsProvider.getMeter(Type.SESSION_COUNT.name(), StatsOptions.DEFAULT);
 
         meterStats.mark(5);
         assertEquals(5, statsProvider.getRepoStats().getCounter(Type.SESSION_COUNT).get());
@@ -119,18 +114,32 @@ public class MetricStatisticsProviderTes
 
     @Test
     public void jmxNaming() throws Exception {
-        statsProvider = new MetricStatisticsProvider(server, executorService);
-        TimerStats timerStats = statsProvider.getTimer("hello");
+        TimerStats timerStats = statsProvider.getTimer("hello", StatsOptions.DEFAULT);
         assertNotNull(server.getObjectInstance(new ObjectName("org.apache.jackrabbit.oak:type=Metrics,name=hello")));
     }
 
     @Test
     public void noopMeter() throws Exception {
-        statsProvider = new MetricStatisticsProvider(server, executorService);
-        assertTrue(statsProvider.getTimer(Type.SESSION_READ_DURATION.name()) instanceof SimpleStats);
-        assertTrue(statsProvider.getTimer(Type.SESSION_WRITE_DURATION.name()) instanceof SimpleStats);
-        assertTrue(statsProvider.getTimer(Type.QUERY_COUNT.name()) instanceof SimpleStats);
-        assertNotEquals(statsProvider.getMeter(Type.OBSERVATION_EVENT_COUNTER.name()), NoopStats.INSTANCE);
+        assertInstanceOf(statsProvider.getTimer(Type.SESSION_READ_DURATION.name(), StatsOptions.TIME_SERIES_ONLY), SimpleStats.class);
+        assertNotEquals(statsProvider.getMeter(Type.OBSERVATION_EVENT_COUNTER.name(), StatsOptions.TIME_SERIES_ONLY), NoopStats.INSTANCE);
+    }
+
+    @Test
+    public void statsOptions_MetricOnly() throws Exception{
+        assertInstanceOf(statsProvider.getTimer("fooTimer", StatsOptions.METRICS_ONLY), TimerImpl.class);
+        assertInstanceOf(statsProvider.getCounterStats("fooCounter", StatsOptions.METRICS_ONLY), CounterImpl.class);
+        assertInstanceOf(statsProvider.getMeter("fooMeter", StatsOptions.METRICS_ONLY), MeterImpl.class);
+        assertInstanceOf(statsProvider.getHistogram("fooHisto", StatsOptions.METRICS_ONLY), HistogramImpl.class);
+    }
+
+    @Test
+    public void statsOptions_TimeSeriesOnly() throws Exception{
+        assertInstanceOf(statsProvider.getTimer("fooTimer", StatsOptions.TIME_SERIES_ONLY), SimpleStats.class);
+    }
+
+    @Test
+    public void statsOptions_Default() throws Exception{
+        assertInstanceOf(statsProvider.getTimer("fooTimer", StatsOptions.DEFAULT), CompositeStats.class);
     }
 
     @After
@@ -144,4 +153,10 @@ public class MetricStatisticsProviderTes
         return server.queryMBeans(new ObjectName("org.apache.jackrabbit.oak:*"), q);
     }
 
+    private void assertInstanceOf(Object o, Class<?> clazz){
+        if (!clazz.isInstance(o)){
+            fail(String.format("%s is not an instance of %s", o.getClass(), clazz));
+        }
+    }
+
 }

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/stats/DefaultStatisticsProviderTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/stats/DefaultStatisticsProviderTest.java?rev=1721498&r1=1721497&r2=1721498&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/stats/DefaultStatisticsProviderTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/stats/DefaultStatisticsProviderTest.java Wed Dec 23 06:24:45 2015
@@ -19,59 +19,72 @@
 
 package org.apache.jackrabbit.oak.stats;
 
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.jackrabbit.api.stats.RepositoryStatistics;
+import org.apache.jackrabbit.api.stats.TimeSeries;
 import org.apache.jackrabbit.stats.RepositoryStatisticsImpl;
 import org.junit.After;
 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.assertNull;
+import static org.junit.Assert.assertTrue;
 
 public class DefaultStatisticsProviderTest {
     private ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
+    private DefaultStatisticsProvider statsProvider = new DefaultStatisticsProvider(executorService);
 
     @Test
     public void basicSetup() throws Exception {
-        DefaultStatisticsProvider statsProvider = new DefaultStatisticsProvider(executorService);
         assertNotNull(statsProvider.getStats());
 
-        CounterStats stats = statsProvider.getCounterStats(RepositoryStatistics.Type.SESSION_COUNT.name());
+        CounterStats stats = statsProvider.getCounterStats(RepositoryStatistics.Type.SESSION_COUNT.name(), StatsOptions.DEFAULT);
         stats.inc();
         assertEquals(1, statsImpl(statsProvider).getCounter(RepositoryStatistics.Type.SESSION_COUNT).get());
     }
 
     @Test
     public void meter() throws Exception {
-        DefaultStatisticsProvider statsProvider = new DefaultStatisticsProvider(executorService);
-        MeterStats meterStats = statsProvider.getMeter("test");
+        MeterStats meterStats = statsProvider.getMeter("test", StatsOptions.DEFAULT);
 
         assertNotNull(meterStats);
         meterStats.mark();
         assertEquals(1, statsImpl(statsProvider).getCounter("test", true).get());
+        assertTrue(getRegisteredTimeSeries(statsProvider).contains("test"));
     }
 
     @Test
     public void counter() throws Exception {
-        DefaultStatisticsProvider statsProvider = new DefaultStatisticsProvider(executorService);
-        CounterStats counterStats = statsProvider.getCounterStats("test");
+        CounterStats counterStats = statsProvider.getCounterStats("test", StatsOptions.DEFAULT);
 
         assertNotNull(counterStats);
         counterStats.inc();
         assertEquals(1, statsImpl(statsProvider).getCounter("test", false).get());
+        assertTrue(getRegisteredTimeSeries(statsProvider).contains("test"));
     }
 
     @Test
     public void timer() throws Exception {
-        DefaultStatisticsProvider statsProvider = new DefaultStatisticsProvider(executorService);
-        TimerStats timerStats = statsProvider.getTimer("test");
+        TimerStats timerStats = statsProvider.getTimer("test", StatsOptions.DEFAULT);
 
         assertNotNull(timerStats);
         timerStats.update(100, TimeUnit.SECONDS);
         assertEquals(TimeUnit.SECONDS.toMillis(100), statsImpl(statsProvider).getCounter("test", false).get());
+        assertTrue(getRegisteredTimeSeries(statsProvider).contains("test"));
+    }
+    
+    @Test
+    public void metricOnly() throws Exception{
+        MeterStats meterStats = statsProvider.getMeter("test", StatsOptions.METRICS_ONLY);
+        assertFalse(getRegisteredTimeSeries(statsProvider).contains("test"));
     }
 
     @After
@@ -82,4 +95,13 @@ public class DefaultStatisticsProviderTe
     private RepositoryStatisticsImpl statsImpl(DefaultStatisticsProvider statsProvider) {
         return (RepositoryStatisticsImpl) statsProvider.getStats();
     }
+
+    private Set<String> getRegisteredTimeSeries(DefaultStatisticsProvider statsProvider){
+        RepositoryStatisticsImpl stats = (RepositoryStatisticsImpl) statsProvider.getStats();
+        Set<String> names = new HashSet<String>();
+        for (Map.Entry<String, TimeSeries> e : stats){
+            names.add(e.getKey());
+        }
+        return names;
+    }
 }

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/stats/StatisticManagerTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/stats/StatisticManagerTest.java?rev=1721498&r1=1721497&r2=1721498&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/stats/StatisticManagerTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/stats/StatisticManagerTest.java Wed Dec 23 06:24:45 2015
@@ -19,11 +19,14 @@
 
 package org.apache.jackrabbit.oak.stats;
 
+import java.util.Map;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 
+import com.google.common.collect.Maps;
 import org.apache.jackrabbit.api.jmx.QueryStatManagerMBean;
 import org.apache.jackrabbit.api.stats.RepositoryStatistics;
+import org.apache.jackrabbit.api.stats.RepositoryStatistics.Type;
 import org.apache.jackrabbit.oak.api.jmx.RepositoryStatsMBean;
 import org.apache.jackrabbit.oak.spi.whiteboard.DefaultWhiteboard;
 import org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard;
@@ -31,6 +34,7 @@ import org.apache.jackrabbit.oak.spi.whi
 import org.junit.After;
 import org.junit.Test;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
 public class StatisticManagerTest {
@@ -41,7 +45,7 @@ public class StatisticManagerTest {
         Whiteboard wb = new DefaultWhiteboard();
         StatisticManager mgr = new StatisticManager(wb, executorService);
 
-        MeterStats meterStats = mgr.getMeter(RepositoryStatistics.Type.QUERY_COUNT);
+        MeterStats meterStats = mgr.getMeter(Type.QUERY_COUNT);
         meterStats.mark(5);
 
         assertNotNull(WhiteboardUtils.getServices(wb, RepositoryStatsMBean.class));
@@ -54,14 +58,62 @@ public class StatisticManagerTest {
         wb.register(StatisticsProvider.class, StatisticsProvider.NOOP, null);
         StatisticManager mgr = new StatisticManager(wb, executorService);
 
-        MeterStats meterStats = mgr.getMeter(RepositoryStatistics.Type.QUERY_COUNT);
+        MeterStats meterStats = mgr.getMeter(Type.QUERY_COUNT);
         meterStats.mark(5);
 
         //TODO Not easy to do any asserts on call. Need to figure out a way
     }
 
+    @Test
+    public void timeSeriesOnly() throws Exception{
+        Whiteboard wb = new DefaultWhiteboard();
+        final Map<String, StatsOptions> optionsPassed = Maps.newHashMap();
+        wb.register(StatisticsProvider.class, new DummyStatsProvider(){
+            @Override
+            public MeterStats getMeter(String name, StatsOptions options) {
+                optionsPassed.put(name, options);
+                return super.getMeter(name, options);
+            }
+        }, null);
+        StatisticManager mgr = new StatisticManager(wb, executorService);
+
+        mgr.getMeter(Type.SESSION_READ_COUNTER);
+        assertEquals(StatsOptions.TIME_SERIES_ONLY, optionsPassed.get(Type.SESSION_READ_COUNTER.name()));
+
+        mgr.getMeter(Type.SESSION_WRITE_COUNTER);
+        assertEquals(StatsOptions.DEFAULT, optionsPassed.get(Type.SESSION_WRITE_COUNTER.name()));
+    }
+
     @After
     public void cleanup() {
         executorService.shutdownNow();
     }
+
+    private class DummyStatsProvider implements StatisticsProvider {
+
+        @Override
+        public RepositoryStatistics getStats() {
+            return NoopRepositoryStatistics.INSTANCE;
+        }
+
+        @Override
+        public MeterStats getMeter(String name, StatsOptions options) {
+            return NoopStats.INSTANCE;
+        }
+
+        @Override
+        public CounterStats getCounterStats(String name, StatsOptions options) {
+            return NoopStats.INSTANCE;
+        }
+
+        @Override
+        public TimerStats getTimer(String name, StatsOptions options) {
+            return NoopStats.INSTANCE;
+        }
+
+        @Override
+        public HistogramStats getHistogram(String name, StatsOptions options) {
+            return NoopStats.INSTANCE;
+        }
+    }
 }