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 md...@apache.org on 2014/02/06 15:29:29 UTC

svn commit: r1565276 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/ oak-core/src/main/java/org/apache/jackrabbit/oak/stats/ oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/ oak-jcr/src/main/java/org/a...

Author: mduerig
Date: Thu Feb  6 14:29:28 2014
New Revision: 1565276

URL: http://svn.apache.org/r1565276
Log:
OAK-1338: Implement QueryStat from Jackrabbit API
Implement repository statistics: session read and write statistics

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/delegate/SessionDelegate.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.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=1565276&r1=1565275&r2=1565276&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:29:28 2014
@@ -39,4 +39,49 @@ public interface RepositoryStatsMBean {
      * @see org.apache.jackrabbit.api.stats.RepositoryStatistics.Type#SESSION_LOGIN_COUNTER
      */
     CompositeData getSessionLogin();
+
+    /**
+     * @see org.apache.jackrabbit.api.stats.RepositoryStatistics.Type#SESSION_READ_COUNTER
+     */
+    CompositeData getSessionReadCount();
+
+    /**
+     * @see org.apache.jackrabbit.api.stats.RepositoryStatistics.Type#SESSION_READ_DURATION
+     */
+    CompositeData getSessionReadDuration();
+
+    /**
+     * @see org.apache.jackrabbit.api.stats.RepositoryStatistics.Type#SESSION_READ_AVERAGE
+     */
+    CompositeData getSessionReadAverage();
+
+    /**
+     * @see org.apache.jackrabbit.api.stats.RepositoryStatistics.Type#SESSION_WRITE_COUNTER
+     */
+    CompositeData getSessionWriteCount();
+
+    /**
+     * @see org.apache.jackrabbit.api.stats.RepositoryStatistics.Type#SESSION_READ_DURATION
+     */
+    CompositeData getSessionWriteDuration();
+
+    /**
+     * @see org.apache.jackrabbit.api.stats.RepositoryStatistics.Type#SESSION_WRITE_AVERAGE
+     */
+    CompositeData getSessionWriteAverage();
+
+    /**
+     * @see org.apache.jackrabbit.api.stats.RepositoryStatistics.Type#QUERY_COUNT
+     */
+    CompositeData getQueryCount();
+
+    /**
+     * @see org.apache.jackrabbit.api.stats.RepositoryStatistics.Type#QUERY_DURATION
+     */
+    CompositeData getQueryDuration();
+
+    /**
+     * @see org.apache.jackrabbit.api.stats.RepositoryStatistics.Type#QUERY_AVERAGE
+     */
+    CompositeData getQueryAverage();
 }

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=1565276&r1=1565275&r2=1565276&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:29:28 2014
@@ -20,8 +20,16 @@
 package org.apache.jackrabbit.oak.stats;
 
 import static org.apache.jackrabbit.api.stats.RepositoryStatistics.Type;
+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;
 import static org.apache.jackrabbit.api.stats.RepositoryStatistics.Type.SESSION_LOGIN_COUNTER;
+import static org.apache.jackrabbit.api.stats.RepositoryStatistics.Type.SESSION_READ_AVERAGE;
+import static org.apache.jackrabbit.api.stats.RepositoryStatistics.Type.SESSION_READ_COUNTER;
+import static org.apache.jackrabbit.api.stats.RepositoryStatistics.Type.SESSION_READ_DURATION;
+import static org.apache.jackrabbit.api.stats.RepositoryStatistics.Type.SESSION_WRITE_AVERAGE;
+import static org.apache.jackrabbit.api.stats.RepositoryStatistics.Type.SESSION_WRITE_COUNTER;
+import static org.apache.jackrabbit.api.stats.RepositoryStatistics.Type.SESSION_WRITE_DURATION;
 
 import javax.management.openmbean.ArrayType;
 import javax.management.openmbean.CompositeData;
@@ -56,6 +64,51 @@ public class RepositoryStats implements 
         return asCompositeData(SESSION_LOGIN_COUNTER);
     }
 
+    @Override
+    public CompositeData getSessionReadCount() {
+        return asCompositeData(SESSION_READ_COUNTER);
+    }
+
+    @Override
+    public CompositeData getSessionReadDuration() {
+        return asCompositeData(SESSION_READ_DURATION);
+    }
+
+    @Override
+    public CompositeData getSessionReadAverage() {
+        return asCompositeData(SESSION_READ_AVERAGE);
+    }
+
+    @Override
+    public CompositeData getSessionWriteCount() {
+        return asCompositeData(SESSION_WRITE_COUNTER);
+    }
+
+    @Override
+    public CompositeData getSessionWriteDuration() {
+        return asCompositeData(SESSION_WRITE_DURATION);
+    }
+
+    @Override
+    public CompositeData getSessionWriteAverage() {
+        return asCompositeData(SESSION_WRITE_AVERAGE);
+    }
+
+    @Override
+    public CompositeData getQueryCount() {
+        return asCompositeData(QUERY_COUNT);
+    }
+
+    @Override
+    public CompositeData getQueryDuration() {
+        return asCompositeData(QUERY_DURATION);
+    }
+
+    @Override
+    public CompositeData getQueryAverage() {
+        return asCompositeData(Type.QUERY_AVERAGE);
+    }
+
     public static final String[] ITEM_NAMES = new String[] {
             "per second", "per minute", "per hour", "per week"};
 

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionDelegate.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionDelegate.java?rev=1565276&r1=1565275&r2=1565276&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionDelegate.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionDelegate.java Thu Feb  6 14:29:28 2014
@@ -17,10 +17,15 @@
 package org.apache.jackrabbit.oak.jcr.delegate;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static org.apache.jackrabbit.api.stats.RepositoryStatistics.Type.SESSION_READ_COUNTER;
+import static org.apache.jackrabbit.api.stats.RepositoryStatistics.Type.SESSION_READ_DURATION;
+import static org.apache.jackrabbit.api.stats.RepositoryStatistics.Type.SESSION_WRITE_COUNTER;
+import static org.apache.jackrabbit.api.stats.RepositoryStatistics.Type.SESSION_WRITE_DURATION;
 import static org.apache.jackrabbit.oak.commons.PathUtils.denotesRoot;
 
 import java.io.IOException;
 import java.util.Iterator;
+import java.util.concurrent.atomic.AtomicLong;
 
 import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
@@ -40,6 +45,7 @@ import org.apache.jackrabbit.oak.jcr.ses
 import org.apache.jackrabbit.oak.jcr.session.SessionStats;
 import org.apache.jackrabbit.oak.jcr.session.operation.SessionOperation;
 import org.apache.jackrabbit.oak.plugins.identifier.IdentifierManager;
+import org.apache.jackrabbit.oak.stats.StatisticManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.Marker;
@@ -59,6 +65,11 @@ public class SessionDelegate {
     private final IdentifierManager idManager;
     private final SessionStats sessionStats;
 
+    private final AtomicLong readCounter;
+    private final AtomicLong readDuration;
+    private final AtomicLong writeCounter;
+    private final AtomicLong writeDuration;
+
     private boolean isAlive = true;
     private int sessionOpCount;
     private long updateCount = 0;
@@ -75,13 +86,22 @@ public class SessionDelegate {
      *
      * @param contentSession  the content session
      * @param refreshStrategy  the refresh strategy used for auto refreshing this session
+     * @param statisticManager the statistics manager for tracking session operations
      */
-    public SessionDelegate(@Nonnull ContentSession contentSession, RefreshStrategy refreshStrategy) {
+    public SessionDelegate(
+            @Nonnull ContentSession contentSession,
+            @Nonnull RefreshStrategy refreshStrategy,
+            @Nonnull StatisticManager statisticManager) {
         this.contentSession = checkNotNull(contentSession);
         this.refreshStrategy = checkNotNull(refreshStrategy);
         this.root = contentSession.getLatestRoot();
         this.idManager = new IdentifierManager(root);
         this.sessionStats = new SessionStats(this);
+        checkNotNull(statisticManager);
+        readCounter = statisticManager.getCounter(SESSION_READ_COUNTER);
+        readDuration = statisticManager.getCounter(SESSION_READ_DURATION);
+        writeCounter = statisticManager.getCounter(SESSION_WRITE_COUNTER);
+        writeDuration = statisticManager.getCounter(SESSION_WRITE_DURATION);
     }
 
     @Nonnull
@@ -128,18 +148,24 @@ public class SessionDelegate {
             }
             sessionOperation.checkPreconditions();
         }
+        long t0 = System.nanoTime();
         try {
             sessionOpCount++;
             T result =  sessionOperation.perform();
             logOperationDetails(sessionOperation);
             return result;
         } finally {
+            long dt = System.nanoTime() - t0;
             sessionOpCount--;
             if (sessionOperation.isUpdate()) {
                 sessionStats.write();
+                writeCounter.incrementAndGet();
+                writeDuration.addAndGet(dt);
                 updateCount++;
             } else {
                 sessionStats.read();
+                readCounter.incrementAndGet();
+                readDuration.addAndGet(dt);
             }
             if (sessionOperation.isSave()) {
                 refreshStrategy.saved();

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java?rev=1565276&r1=1565275&r2=1565276&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java Thu Feb  6 14:29:28 2014
@@ -235,7 +235,7 @@ public class RepositoryImpl implements J
     private SessionDelegate createSessionDelegate(
             final RefreshStrategy refreshStrategy,
             final ContentSession contentSession) {
-        return new SessionDelegate(contentSession, refreshStrategy) {
+        return new SessionDelegate(contentSession, refreshStrategy, statisticManager) {
             // Defer session MBean registration to avoid cluttering the
             // JMX name space with short lived sessions
             ListenableScheduledFuture<Registration> registration = scheduledExecutor.schedule(