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 mr...@apache.org on 2017/12/13 13:59:18 UTC

svn commit: r1818017 - in /jackrabbit/oak/trunk/oak-core-spi/src: main/java/org/apache/jackrabbit/oak/stats/ test/java/org/apache/jackrabbit/oak/stats/

Author: mreutegg
Date: Wed Dec 13 13:59:18 2017
New Revision: 1818017

URL: http://svn.apache.org/viewvc?rev=1818017&view=rev
Log:
OAK-7055: Expose observation queue max length as metric

Modified:
    jackrabbit/oak/trunk/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/stats/RepositoryStats.java
    jackrabbit/oak/trunk/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/stats/StatisticManager.java
    jackrabbit/oak/trunk/oak-core-spi/src/test/java/org/apache/jackrabbit/oak/stats/StatisticManagerTest.java

Modified: jackrabbit/oak/trunk/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/stats/RepositoryStats.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/stats/RepositoryStats.java?rev=1818017&r1=1818016&r2=1818017&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/stats/RepositoryStats.java (original)
+++ jackrabbit/oak/trunk/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/stats/RepositoryStats.java Wed Dec 13 13:59:18 2017
@@ -45,6 +45,8 @@ import org.apache.jackrabbit.stats.TimeS
 
 public class RepositoryStats extends AnnotatedStandardMBean implements RepositoryStatsMBean {
 
+    static final String OBSERVATION_QUEUE_MAX_LENGTH = "OBSERVATION_QUEUE_MAX_LENGTH";
+
     private final RepositoryStatistics repoStats;
     private final TimeSeries maxQueueLength;
 

Modified: jackrabbit/oak/trunk/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/stats/StatisticManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/stats/StatisticManager.java?rev=1818017&r1=1818016&r2=1818017&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/stats/StatisticManager.java (original)
+++ jackrabbit/oak/trunk/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/stats/StatisticManager.java Wed Dec 13 13:59:18 2017
@@ -44,6 +44,7 @@ public class StatisticManager {
     private final QueryStatImpl queryStat = new QueryStatImpl();
     private final StatisticsProvider repoStats;
     private final TimeSeriesMax maxQueueLength;
+    private final CounterStats maxQueueLengthCounter;
     private final CompositeRegistration registration;
 
     /**
@@ -65,7 +66,16 @@ public class StatisticManager {
     public StatisticManager(Whiteboard whiteboard, ScheduledExecutorService executor) {
         queryStat.setEnabled(true);
         repoStats = getStatsProvider(whiteboard, executor);
-        maxQueueLength = new TimeSeriesMax(-1);
+        maxQueueLengthCounter = repoStats.getCounterStats(
+                RepositoryStats.OBSERVATION_QUEUE_MAX_LENGTH, StatsOptions.METRICS_ONLY);
+        maxQueueLength = new TimeSeriesMax(-1) {
+            @Override
+            public void recordValue(long value) {
+                super.recordValue(value);
+                long currentValue = maxQueueLengthCounter.getCount();
+                maxQueueLengthCounter.inc(Math.max(value, currentValue) - currentValue);
+            }
+        };
         registration = new CompositeRegistration(
             registerMBean(whiteboard, QueryStatManagerMBean.class, new QueryStatManager(queryStat),
                     "QueryStat", "Oak Query Statistics"),
@@ -75,6 +85,8 @@ public class StatisticManager {
                     @Override
                     public void run() {
                         maxQueueLength.recordOneSecond();
+                        // reset counter to missing value (-1)
+                        maxQueueLengthCounter.dec(maxQueueLengthCounter.getCount() + 1);
                     }
                 }, 1));
     }

Modified: jackrabbit/oak/trunk/oak-core-spi/src/test/java/org/apache/jackrabbit/oak/stats/StatisticManagerTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core-spi/src/test/java/org/apache/jackrabbit/oak/stats/StatisticManagerTest.java?rev=1818017&r1=1818016&r2=1818017&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core-spi/src/test/java/org/apache/jackrabbit/oak/stats/StatisticManagerTest.java (original)
+++ jackrabbit/oak/trunk/oak-core-spi/src/test/java/org/apache/jackrabbit/oak/stats/StatisticManagerTest.java Wed Dec 13 13:59:18 2017
@@ -19,9 +19,11 @@
 
 package org.apache.jackrabbit.oak.stats;
 
+import java.util.List;
 import java.util.Map;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.atomic.AtomicLong;
 
 import com.google.common.collect.Maps;
 import org.apache.jackrabbit.api.jmx.QueryStatManagerMBean;
@@ -31,6 +33,7 @@ import org.apache.jackrabbit.oak.api.jmx
 import org.apache.jackrabbit.oak.spi.whiteboard.DefaultWhiteboard;
 import org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard;
 import org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardUtils;
+import org.apache.jackrabbit.stats.TimeSeriesMax;
 import org.junit.After;
 import org.junit.Test;
 
@@ -84,6 +87,46 @@ public class StatisticManagerTest {
         assertEquals(StatsOptions.DEFAULT, optionsPassed.get(Type.SESSION_WRITE_COUNTER.name()));
     }
 
+    @Test
+    public void observationQueueMaxLength() {
+        AtomicLong maxQueueLength = new AtomicLong();
+        SimpleStats stats = new SimpleStats(maxQueueLength, SimpleStats.Type.COUNTER);
+        Whiteboard wb = new DefaultWhiteboard();
+        wb.register(StatisticsProvider.class, new DummyStatsProvider() {
+            @Override
+            public CounterStats getCounterStats(String name,
+                                                StatsOptions options) {
+                if (name.equals(RepositoryStats.OBSERVATION_QUEUE_MAX_LENGTH)) {
+                    return stats;
+                }
+                return super.getCounterStats(name, options);
+            }
+        }, null);
+        StatisticManager mgr = new StatisticManager(wb, executorService);
+
+        TimeSeriesMax rec = mgr.maxQueLengthRecorder();
+        List<Runnable> services = wb.track(Runnable.class).getServices();
+        assertEquals(1, services.size());
+        // this is the scheduled task registered by the StatisticsManager
+        // updating the TimeSeries every second
+        Runnable pulse = services.get(0);
+
+        // must reset the stats to 'unknown' (-1)
+        pulse.run();
+        assertEquals(-1L, maxQueueLength.get());
+
+        rec.recordValue(7);
+        rec.recordValue(5);
+        rec.recordValue(-1);
+
+        // must return the max value
+        assertEquals(7L, maxQueueLength.get());
+
+        // must reset the stats to 'unknown' (-1)
+        pulse.run();
+        assertEquals(-1L, maxQueueLength.get());
+    }
+
     @After
     public void cleanup() {
         executorService.shutdownNow();