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;
}