Author: mduerig
Date: Thu Feb  6 14:30:05 2014
New Revision: 1565278

URL: http://svn.apache.org/r1565278
Log:
OAK-1338: Implement QueryStat from Jackrabbit API
Implement repository statistics: observation count, duration and average

Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/RepositoryStatsMBean.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/RepositoryStats.java
    
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ChangeProcessor.java
    
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java
    
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/RepositoryStatsMBean.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/RepositoryStatsMBean.java?rev=1565278&r1=1565277&r2=1565278&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/RepositoryStatsMBean.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/RepositoryStatsMBean.java
 Thu Feb  6 14:30:05 2014
@@ -84,4 +84,19 @@ public interface RepositoryStatsMBean {
      * @see 
org.apache.jackrabbit.api.stats.RepositoryStatistics.Type#QUERY_AVERAGE
      */
     CompositeData getQueryAverage();
+
+    /**
+     * @see 
org.apache.jackrabbit.api.stats.RepositoryStatistics.Type#OBSERVATION_EVENT_COUNTER
+     */
+    CompositeData getObservationEventCount();
+
+    /**
+     * @see 
org.apache.jackrabbit.api.stats.RepositoryStatistics.Type#OBSERVATION_EVENT_DURATION
+     */
+    CompositeData getObservationEventDuration();
+
+    /**
+     * @see 
org.apache.jackrabbit.api.stats.RepositoryStatistics.Type#OBSERVATION_EVENT_AVERAGE
+     */
+    CompositeData getObservationEventAverage();
 }

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/RepositoryStats.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/RepositoryStats.java?rev=1565278&r1=1565277&r2=1565278&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/RepositoryStats.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/stats/RepositoryStats.java
 Thu Feb  6 14:30:05 2014
@@ -20,6 +20,10 @@
 package org.apache.jackrabbit.oak.stats;
 
 import static org.apache.jackrabbit.api.stats.RepositoryStatistics.Type;
+import static 
org.apache.jackrabbit.api.stats.RepositoryStatistics.Type.OBSERVATION_EVENT_AVERAGE;
+import static 
org.apache.jackrabbit.api.stats.RepositoryStatistics.Type.OBSERVATION_EVENT_COUNTER;
+import static 
org.apache.jackrabbit.api.stats.RepositoryStatistics.Type.OBSERVATION_EVENT_DURATION;
+import static 
org.apache.jackrabbit.api.stats.RepositoryStatistics.Type.QUERY_AVERAGE;
 import static 
org.apache.jackrabbit.api.stats.RepositoryStatistics.Type.QUERY_COUNT;
 import static 
org.apache.jackrabbit.api.stats.RepositoryStatistics.Type.QUERY_DURATION;
 import static 
org.apache.jackrabbit.api.stats.RepositoryStatistics.Type.SESSION_COUNT;
@@ -106,7 +110,22 @@ public class RepositoryStats implements 
 
     @Override
     public CompositeData getQueryAverage() {
-        return asCompositeData(Type.QUERY_AVERAGE);
+        return asCompositeData(QUERY_AVERAGE);
+    }
+
+    @Override
+    public CompositeData getObservationEventCount() {
+        return asCompositeData(OBSERVATION_EVENT_COUNTER);
+    }
+
+    @Override
+    public CompositeData getObservationEventDuration() {
+        return asCompositeData(OBSERVATION_EVENT_DURATION);
+    }
+
+    @Override
+    public CompositeData getObservationEventAverage() {
+        return asCompositeData(OBSERVATION_EVENT_AVERAGE);
     }
 
     public static final String[] ITEM_NAMES = new String[] {

Modified: 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ChangeProcessor.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ChangeProcessor.java?rev=1565278&r1=1565277&r2=1565278&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ChangeProcessor.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ChangeProcessor.java
 Thu Feb  6 14:30:05 2014
@@ -19,17 +19,21 @@
 package org.apache.jackrabbit.oak.jcr.observation;
 
 import static com.google.common.base.Preconditions.checkState;
+import static 
org.apache.jackrabbit.api.stats.RepositoryStatistics.Type.OBSERVATION_EVENT_COUNTER;
+import static 
org.apache.jackrabbit.api.stats.RepositoryStatistics.Type.OBSERVATION_EVENT_DURATION;
 
+import java.util.Iterator;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicLong;
 import java.util.concurrent.atomic.AtomicReference;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.jcr.observation.EventListener;
 
+import com.google.common.collect.ForwardingIterator;
 import com.google.common.util.concurrent.Monitor;
 import com.google.common.util.concurrent.Monitor.Guard;
-
 import org.apache.jackrabbit.api.jmx.EventListenerMBean;
 import org.apache.jackrabbit.commons.iterator.EventIteratorAdapter;
 import org.apache.jackrabbit.commons.observation.ListenerTracker;
@@ -46,6 +50,7 @@ import org.apache.jackrabbit.oak.spi.sta
 import org.apache.jackrabbit.oak.spi.whiteboard.Registration;
 import org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard;
 import org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardUtils;
+import org.apache.jackrabbit.oak.stats.StatisticManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -66,6 +71,8 @@ class ChangeProcessor implements Observe
     private final ListenerTracker tracker;
     private final EventListener eventListener;
     private final AtomicReference<FilterProvider> filterProvider;
+    private final AtomicLong eventCount;
+    private final AtomicLong eventDuration;
 
     private Registration observerSubscription;
     private Registration mBeanSubscription;
@@ -75,13 +82,17 @@ class ChangeProcessor implements Observe
             ContentSession contentSession,
             NamePathMapper namePathMapper,
             PermissionProvider permissionProvider,
-            ListenerTracker tracker, FilterProvider filter) {
+            ListenerTracker tracker,
+            FilterProvider filter,
+            StatisticManager statisticManager) {
         this.contentSession = contentSession;
         this.namePathMapper = namePathMapper;
         this.permissionProvider = permissionProvider;
         this.tracker = tracker;
         eventListener = tracker.getTrackedListener();
         filterProvider = new AtomicReference<FilterProvider>(filter);
+        this.eventCount = 
statisticManager.getCounter(OBSERVATION_EVENT_COUNTER);
+        this.eventDuration = 
statisticManager.getCounter(OBSERVATION_EVENT_DURATION);
     }
 
     /**
@@ -163,7 +174,8 @@ class ChangeProcessor implements Observe
                             Filters.all(userFilter, acFilter));
                     if (events.hasNext() && runningMonitor.enterIf(running)) {
                         try {
-                            eventListener.onEvent(new 
EventIteratorAdapter(events));
+                            eventListener.onEvent(
+                                    new 
EventIteratorAdapter(statisticProvider(events)));
                         } finally {
                             runningMonitor.leave();
                         }
@@ -176,6 +188,26 @@ class ChangeProcessor implements Observe
         previousRoot = root;
     }
 
+    private <T> Iterator<T> statisticProvider(final Iterator<T> events) {
+        return new ForwardingIterator<T>() {
+            @Override
+            protected Iterator<T> delegate() {
+                return events;
+            }
+
+            @Override
+            public T next() {
+                long t0 = System.nanoTime();
+                try {
+                    return super.next();
+                } finally {
+                    eventCount.incrementAndGet();
+                    eventDuration.addAndGet(System.nanoTime() - t0);
+                }
+            }
+        };
+    }
+
     private static class RunningGuard extends Guard {
         private boolean stopped;
 

Modified: 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java?rev=1565278&r1=1565277&r2=1565278&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java
 Thu Feb  6 14:30:05 2014
@@ -41,6 +41,7 @@ import org.apache.jackrabbit.commons.ite
 import org.apache.jackrabbit.commons.observation.ListenerTracker;
 import org.apache.jackrabbit.oak.api.ContentSession;
 import org.apache.jackrabbit.oak.jcr.delegate.SessionDelegate;
+import org.apache.jackrabbit.oak.jcr.session.SessionContext;
 import org.apache.jackrabbit.oak.namepath.NamePathMapper;
 import org.apache.jackrabbit.oak.plugins.nodetype.ReadOnlyNodeTypeManager;
 import org.apache.jackrabbit.oak.plugins.observation.ExcludeExternal;
@@ -50,6 +51,7 @@ import org.apache.jackrabbit.oak.plugins
 import org.apache.jackrabbit.oak.spi.commit.Observable;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.permission.PermissionProvider;
 import org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard;
+import org.apache.jackrabbit.oak.stats.StatisticManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.Marker;
@@ -73,28 +75,29 @@ public class ObservationManagerImpl impl
     private final PermissionProvider permissionProvider;
     private final NamePathMapper namePathMapper;
     private final Whiteboard whiteboard;
+    private final StatisticManager statisticManager;
 
     /**
      * Create a new instance based on a {@link ContentSession} that needs to 
implement
      * {@link Observable}.
      *
-     * @param sessionDelegate  session delegate of the session in whose 
context this observation manager
+     * @param sessionContext   session delegate of the session in whose 
context this observation manager
      *                         operates.
      * @param nodeTypeManager  node type manager for the content session
-     * @param namePathMapper   name path mapper for the content session
      * @param whiteboard
      * @throws IllegalArgumentException if {@code contentSession} doesn't 
implement {@code Observable}.
      */
     public ObservationManagerImpl(
-            SessionDelegate sessionDelegate, ReadOnlyNodeTypeManager 
nodeTypeManager,
+            SessionContext sessionContext, ReadOnlyNodeTypeManager 
nodeTypeManager,
             PermissionProvider permissionProvider,
-            NamePathMapper namePathMapper, Whiteboard whiteboard) {
+            Whiteboard whiteboard) {
 
-        this.sessionDelegate = sessionDelegate;
+        this.sessionDelegate = sessionContext.getSessionDelegate();
         this.ntMgr = nodeTypeManager;
         this.permissionProvider = permissionProvider;
-        this.namePathMapper = namePathMapper;
+        this.namePathMapper = sessionContext;
         this.whiteboard = whiteboard;
+        statisticManager = sessionContext.getStatisticManager();
     }
 
     public void dispose() {
@@ -117,7 +120,7 @@ public class ObservationManagerImpl impl
             LOG.info(OBSERVATION,
                     "Registering event listener {} with filter {}", listener, 
filterProvider);
             processor = new 
ChangeProcessor(sessionDelegate.getContentSession(), namePathMapper,
-                    permissionProvider, tracker, filterProvider);
+                    permissionProvider, tracker, filterProvider, 
statisticManager);
             processors.put(listener, processor);
             processor.start(whiteboard);
         } else {

Modified: 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java?rev=1565278&r1=1565277&r2=1565278&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/SessionContext.java
 Thu Feb  6 14:30:05 2014
@@ -262,10 +262,10 @@ public class SessionContext implements N
     public ObservationManager getObservationManager() throws 
UnsupportedRepositoryOperationException {
         if (observationManager == null) {
             observationManager = new ObservationManagerImpl(
-                delegate,
+                this,
                 ReadOnlyNodeTypeManager.getInstance(delegate.getRoot(), 
namePathMapper),
                 getPermissionProvider(),
-                namePathMapper, whiteboard);
+                whiteboard);
         }
         return observationManager;
     }


Reply via email to