Author: chetanm
Date: Fri Dec 18 06:57:43 2015
New Revision: 1720724

URL: http://svn.apache.org/viewvc?rev=1720724&view=rev
Log:
OAK-3805 - Add support for Metrics Histogram

Added:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/HistogramStats.java
      - copied, changed from r1720720, 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/StatisticsProvider.java
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/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/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/StatisticsProvider.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/package-info.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/plugins/metric/MetricStatisticsProviderTest.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=1720724&r1=1720723&r2=1720724&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
 Fri Dec 18 06:57:43 2015
@@ -22,9 +22,11 @@ package org.apache.jackrabbit.oak.plugin
 import java.util.concurrent.TimeUnit;
 
 import com.codahale.metrics.Counter;
+import com.codahale.metrics.Histogram;
 import com.codahale.metrics.Meter;
 import com.codahale.metrics.Timer;
 import org.apache.jackrabbit.oak.stats.CounterStats;
+import org.apache.jackrabbit.oak.stats.HistogramStats;
 import org.apache.jackrabbit.oak.stats.MeterStats;
 import org.apache.jackrabbit.oak.stats.SimpleStats;
 import org.apache.jackrabbit.oak.stats.TimerStats;
@@ -34,30 +36,36 @@ import org.apache.jackrabbit.oak.stats.T
  * and Metrics based meters so as to allow both systems to collect
  * stats
  */
-final class CompositeStats implements CounterStats, MeterStats, TimerStats {
+final class CompositeStats implements CounterStats, MeterStats, TimerStats, 
HistogramStats {
     private final SimpleStats delegate;
     private final Counter counter;
     private final Timer timer;
     private final Meter meter;
+    private final Histogram histogram;
 
     public CompositeStats(SimpleStats delegate, Counter counter) {
-        this(delegate, counter, null, null);
+        this(delegate, counter, null, null, null);
     }
 
     public CompositeStats(SimpleStats delegate, Timer timer) {
-        this(delegate, null, timer, null);
+        this(delegate, null, timer, null, null);
     }
 
     public CompositeStats(SimpleStats delegate, Meter meter) {
-        this(delegate, null, null, meter);
+        this(delegate, null, null, meter, null);
+    }
+
+    public CompositeStats(SimpleStats delegate, Histogram histogram) {
+        this(delegate, null, null, null, histogram);
     }
 
     private CompositeStats(SimpleStats delegate, Counter counter,
-                           Timer timer, Meter meter) {
+                           Timer timer, Meter meter, Histogram histogram) {
         this.delegate = delegate;
         this.counter = counter;
         this.timer = timer;
         this.meter = meter;
+        this.histogram = histogram;
     }
 
     @Override
@@ -96,20 +104,30 @@ final class CompositeStats implements Co
     }
 
     @Override
+    public void update(long value) {
+        delegate.update(value);
+        histogram.update(value);
+    }
+
+    @Override
     public Context time() {
         return new StatsContext(timer.time(), delegate);
     }
 
     boolean isMeter() {
-        return meter != null && timer == null && counter == null;
+        return meter != null;
     }
 
     boolean isTimer() {
-        return meter == null && timer != null && counter == null;
+        return timer != null;
     }
 
     boolean isCounter() {
-        return meter == null && timer == null && counter != null;
+        return counter != null;
+    }
+
+    boolean isHistogram(){
+        return histogram != null;
     }
 
     Counter getCounter() {
@@ -124,6 +142,11 @@ final class CompositeStats implements Co
         return meter;
     }
 
+    Histogram getHistogram(){
+        return histogram;
+    }
+
+
     private static final class StatsContext implements Context {
         private final Timer.Context context ;
         private final SimpleStats simpleStats;

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=1720724&r1=1720723&r2=1720724&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
 Fri Dec 18 06:57:43 2015
@@ -44,6 +44,7 @@ import org.apache.jackrabbit.oak.commons
 import org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardUtils;
 import org.apache.jackrabbit.oak.stats.Clock;
 import org.apache.jackrabbit.oak.stats.CounterStats;
+import org.apache.jackrabbit.oak.stats.HistogramStats;
 import org.apache.jackrabbit.oak.stats.MeterStats;
 import org.apache.jackrabbit.oak.stats.SimpleStats;
 import org.apache.jackrabbit.oak.stats.StatisticsProvider;
@@ -122,6 +123,11 @@ public class MetricStatisticsProvider im
         return getStats(name, StatsBuilder.TIMERS);
     }
 
+    @Override
+    public HistogramStats getHistogram(String name) {
+        return getStats(name, StatsBuilder.HISTOGRAMS);
+    }
+
     public MetricRegistry getRegistry() {
         return registry;
     }
@@ -213,6 +219,19 @@ public class MetricStatisticsProvider im
             }
         };
 
+        StatsBuilder<HistogramStats> HISTOGRAMS = new 
StatsBuilder<HistogramStats>() {
+
+            @Override
+            public CompositeStats newComposite(SimpleStats delegate, 
MetricStatisticsProvider provider,String name) {
+                return new CompositeStats(delegate, 
provider.registry.histogram(name));
+            }
+
+            @Override
+            public boolean isInstance(Stats metric) {
+                return HistogramStats.class.isInstance(metric);
+            }
+        };
+
         CompositeStats newComposite(SimpleStats delegate, 
MetricStatisticsProvider provider,String name);
 
         boolean isInstance(Stats stats);

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=1720724&r1=1720723&r2=1720724&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
 Fri Dec 18 06:57:43 2015
@@ -55,6 +55,11 @@ public final class DefaultStatisticsProv
         return getStats(name, true);
     }
 
+    @Override
+    public HistogramStats getHistogram(String name) {
+        return getStats(name, true);
+    }
+
     private synchronized SimpleStats getStats(String type, boolean 
resetValueEachSecond){
         Type enumType = Type.getType(type);
         SimpleStats stats = statsMeters.get(type);

Copied: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/HistogramStats.java
 (from r1720720, 
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/HistogramStats.java?p2=jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/HistogramStats.java&p1=jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/StatisticsProvider.java&r1=1720720&r2=1720724&rev=1720724&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/HistogramStats.java
 Fri Dec 18 06:57:43 2015
@@ -20,39 +20,18 @@
 package org.apache.jackrabbit.oak.stats;
 
 import aQute.bnd.annotation.ProviderType;
-import org.apache.jackrabbit.api.stats.RepositoryStatistics;
 
+/**
+ * /**
+ * A metric which calculates the distribution of a value.
+ */
 @ProviderType
-public interface StatisticsProvider {
+public interface HistogramStats extends Stats{
 
-    StatisticsProvider NOOP = new StatisticsProvider() {
-        @Override
-        public RepositoryStatistics getStats() {
-            return NoopRepositoryStatistics.INSTANCE;
-        }
-
-        @Override
-        public MeterStats getMeter(String name) {
-            return NoopStats.INSTANCE;
-        }
-
-        @Override
-        public CounterStats getCounterStats(String name) {
-            return NoopStats.INSTANCE;
-        }
-
-        @Override
-        public TimerStats getTimer(String name) {
-            return NoopStats.INSTANCE;
-        }
-    };
-
-
-    RepositoryStatistics getStats();
-
-    MeterStats getMeter(String name);
-
-    CounterStats getCounterStats(String name);
-
-    TimerStats getTimer(String name);
+    /**
+     * Adds a recorded value.
+     *
+     * @param value the length of the value
+     */
+    void update(long value);
 }

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=1720724&r1=1720723&r2=1720724&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
 Fri Dec 18 06:57:43 2015
@@ -21,7 +21,7 @@ package org.apache.jackrabbit.oak.stats;
 
 import java.util.concurrent.TimeUnit;
 
-public final class NoopStats implements TimerStats, MeterStats, CounterStats {
+public final class NoopStats implements TimerStats, MeterStats, CounterStats, 
HistogramStats {
 
     public static final NoopStats INSTANCE = new NoopStats();
 
@@ -64,6 +64,11 @@ public final class NoopStats implements
         return NoopContext.INSTANCE;
     }
 
+    @Override
+    public void update(long value) {
+
+    }
+
     private static final class NoopContext implements Context {
         public static final NoopContext INSTANCE = new NoopContext();
 

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=1720724&r1=1720723&r2=1720724&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
 Fri Dec 18 06:57:43 2015
@@ -22,7 +22,7 @@ package org.apache.jackrabbit.oak.stats;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
 
-public final class SimpleStats implements TimerStats, MeterStats, CounterStats 
{
+public final class SimpleStats implements TimerStats, MeterStats, 
CounterStats, HistogramStats {
     private final AtomicLong statsHolder;
 
     public SimpleStats(AtomicLong statsHolder) {
@@ -64,6 +64,11 @@ public final class SimpleStats implement
         return new SimpleContext(this);
     }
 
+    @Override
+    public void update(long value) {
+        statsHolder.getAndAdd(value);
+    }
+
     private static final class SimpleContext implements Context {
         private final TimerStats timer;
         private final long startTime;

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=1720724&r1=1720723&r2=1720724&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
 Fri Dec 18 06:57:43 2015
@@ -45,6 +45,11 @@ public interface StatisticsProvider {
         public TimerStats getTimer(String name) {
             return NoopStats.INSTANCE;
         }
+
+        @Override
+        public HistogramStats getHistogram(String name) {
+            return NoopStats.INSTANCE;
+        }
     };
 
 
@@ -55,4 +60,6 @@ public interface StatisticsProvider {
     CounterStats getCounterStats(String name);
 
     TimerStats getTimer(String name);
+
+    HistogramStats getHistogram(String name);
 }

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/package-info.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/package-info.java?rev=1720724&r1=1720723&r2=1720724&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/package-info.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/package-info.java
 Fri Dec 18 06:57:43 2015
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-@Version("2.0.0")
+@Version("2.1.0")
 @Export(optional = "provide:=true")
 package org.apache.jackrabbit.oak.stats;
 

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=1720724&r1=1720723&r2=1720724&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
 Fri Dec 18 06:57:43 2015
@@ -24,12 +24,10 @@ import java.util.concurrent.atomic.Atomi
 
 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.Clock;
-import org.apache.jackrabbit.oak.stats.CounterStats;
-import org.apache.jackrabbit.oak.stats.MeterStats;
 import org.apache.jackrabbit.oak.stats.SimpleStats;
 import org.apache.jackrabbit.oak.stats.TimerStats;
 import org.junit.Test;
@@ -101,6 +99,22 @@ public class CompositeStatsTest {
     }
 
     @Test
+    public void histogram() throws Exception {
+        Histogram histo = registry.histogram("test");
+        CompositeStats histoStats = new CompositeStats(simpleStats, histo);
+
+        histoStats.update(100);
+        assertEquals(1, histo.getCount());
+        assertEquals(100, histo.getSnapshot().getMax());
+
+        assertFalse(histoStats.isMeter());
+        assertFalse(histoStats.isTimer());
+        assertFalse(histoStats.isCounter());
+        assertTrue(histoStats.isHistogram());
+        assertNotNull(histoStats.getHistogram());
+    }
+
+    @Test
     public void timerContext() throws Exception{
         VirtualClock clock = new VirtualClock();
         Timer time = new Timer(new ExponentiallyDecayingReservoir(), clock);

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=1720724&r1=1720723&r2=1720724&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
 Fri Dec 18 06:57:43 2015
@@ -34,6 +34,7 @@ import javax.management.QueryExp;
 import com.codahale.metrics.JmxReporter;
 import org.apache.jackrabbit.api.stats.RepositoryStatistics.Type;
 import org.apache.jackrabbit.oak.stats.CounterStats;
+import org.apache.jackrabbit.oak.stats.HistogramStats;
 import org.apache.jackrabbit.oak.stats.MeterStats;
 import org.apache.jackrabbit.oak.stats.NoopStats;
 import org.apache.jackrabbit.oak.stats.SimpleStats;
@@ -98,6 +99,16 @@ public class MetricStatisticsProviderTes
     }
 
     @Test
+    public void histogram() throws Exception {
+        statsProvider = new MetricStatisticsProvider(server, executorService);
+        HistogramStats histoStats = statsProvider.getHistogram("test");
+
+        assertNotNull(histoStats);
+        
assertNotNull(statsProvider.getRegistry().getHistograms().containsKey("test"));
+        assertTrue(((CompositeStats) histoStats).isHistogram());
+    }
+
+    @Test
     public void timeSeriesIntegration() throws Exception {
         statsProvider = new MetricStatisticsProvider(server, executorService);
         MeterStats meterStats = 
statsProvider.getMeter(Type.SESSION_COUNT.name());


Reply via email to