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 ch...@apache.org on 2014/08/28 19:35:03 UTC

svn commit: r1621168 - in /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak: api/jmx/CacheStatsMBean.java api/jmx/ConsolidatedCacheStatsMBean.java cache/CacheStats.java cache/ConsolidatedCacheStats.java

Author: chetanm
Date: Thu Aug 28 17:35:03 2014
New Revision: 1621168

URL: http://svn.apache.org/r1621168
Log:
OAK-2060 - MBean to provide consolidated cache stats

Added:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/ConsolidatedCacheStatsMBean.java   (with props)
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/cache/ConsolidatedCacheStats.java   (with props)
Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/CacheStatsMBean.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/cache/CacheStats.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/CacheStatsMBean.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/CacheStatsMBean.java?rev=1621168&r1=1621167&r2=1621168&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/CacheStatsMBean.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/CacheStatsMBean.java Thu Aug 28 17:35:03 2014
@@ -19,6 +19,8 @@ package org.apache.jackrabbit.oak.api.jm
 public interface CacheStatsMBean {
     String TYPE = "CacheStats";
 
+    String getName();
+
     /**
      * Returns the number of times {@link com.google.common.cache.Cache} lookup methods have returned either a cached or
      * uncached value. This is defined as {@code getHitCount + getMissCount}.

Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/ConsolidatedCacheStatsMBean.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/ConsolidatedCacheStatsMBean.java?rev=1621168&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/ConsolidatedCacheStatsMBean.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/ConsolidatedCacheStatsMBean.java Thu Aug 28 17:35:03 2014
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.jackrabbit.oak.api.jmx;
+
+import javax.management.openmbean.TabularData;
+
+public interface ConsolidatedCacheStatsMBean {
+    String TYPE = "ConsolidatedCacheStats";
+
+    TabularData getCacheStats();
+}

Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/jmx/ConsolidatedCacheStatsMBean.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/cache/CacheStats.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/cache/CacheStats.java?rev=1621168&r1=1621167&r2=1621168&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/cache/CacheStats.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/cache/CacheStats.java Thu Aug 28 17:35:03 2014
@@ -166,7 +166,7 @@ public class CacheStats implements Cache
         return cache.stats().minus(lastSnapshot);
     }
 
-    private static String timeInWords(long nanos) {
+    static String timeInWords(long nanos) {
         long millis = TimeUnit.NANOSECONDS.toMillis(nanos);
         return String.format("%d min, %d sec",
                 TimeUnit.MILLISECONDS.toMinutes(millis),
@@ -178,7 +178,7 @@ public class CacheStats implements Cache
     /**
      * Based on http://stackoverflow.com/a/3758880/1035417
      */
-    private static String humanReadableByteCount(long bytes, boolean si) {
+    static String humanReadableByteCount(long bytes, boolean si) {
         if (bytes < 0) {
             return "0";
         }

Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/cache/ConsolidatedCacheStats.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/cache/ConsolidatedCacheStats.java?rev=1621168&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/cache/ConsolidatedCacheStats.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/cache/ConsolidatedCacheStats.java Thu Aug 28 17:35:03 2014
@@ -0,0 +1,182 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.jackrabbit.oak.cache;
+
+import java.math.BigDecimal;
+import java.math.MathContext;
+import java.util.concurrent.TimeUnit;
+
+import javax.management.openmbean.CompositeDataSupport;
+import javax.management.openmbean.CompositeType;
+import javax.management.openmbean.OpenDataException;
+import javax.management.openmbean.OpenType;
+import javax.management.openmbean.SimpleType;
+import javax.management.openmbean.TabularData;
+import javax.management.openmbean.TabularDataSupport;
+import javax.management.openmbean.TabularType;
+
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.jackrabbit.oak.api.jmx.CacheStatsMBean;
+import org.apache.jackrabbit.oak.api.jmx.ConsolidatedCacheStatsMBean;
+import org.apache.jackrabbit.oak.osgi.OsgiWhiteboard;
+import org.apache.jackrabbit.oak.spi.whiteboard.Registration;
+import org.apache.jackrabbit.oak.spi.whiteboard.Tracker;
+import org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard;
+import org.osgi.framework.BundleContext;
+
+import static org.apache.jackrabbit.oak.cache.CacheStats.humanReadableByteCount;
+import static org.apache.jackrabbit.oak.cache.CacheStats.timeInWords;
+import static org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardUtils.registerMBean;
+
+@Component
+public class ConsolidatedCacheStats implements ConsolidatedCacheStatsMBean {
+
+    private Tracker<CacheStatsMBean> cacheStats;
+
+    private Registration mbeanReg;
+
+    @Override
+    public TabularData getCacheStats() {
+        TabularDataSupport tds;
+        try {
+            TabularType tt = new TabularType(CacheStatsData.class.getName(),
+                    "Consolidated Cache Stats", CacheStatsData.TYPE, new String[]{"name"});
+            tds = new TabularDataSupport(tt);
+            for(CacheStatsMBean stats : cacheStats.getServices()){
+                tds.put(new CacheStatsData(stats).toCompositeData());
+            }
+        } catch (OpenDataException e) {
+            throw new IllegalStateException(e);
+        }
+        return tds;
+    }
+
+    @Activate
+    private void activate(BundleContext context){
+        Whiteboard wb = new OsgiWhiteboard(context);
+        cacheStats = wb.track(CacheStatsMBean.class);
+        mbeanReg = registerMBean(wb,
+                ConsolidatedCacheStatsMBean.class,
+                this,
+                ConsolidatedCacheStatsMBean.TYPE,
+                "Consolidated Cache statistics");
+    }
+
+    @Deactivate
+    private void deactivate(){
+        if(mbeanReg != null){
+            mbeanReg.unregister();
+        }
+
+        if(cacheStats != null){
+            cacheStats.stop();
+        }
+    }
+
+    private static class CacheStatsData {
+        static final String[] FIELD_NAMES = new String[]{
+                "name",
+                "requestCount",
+                "hitCount",
+                "hitRate",
+                "missCount",
+                "missRate",
+                "loadCount",
+                "loadSuccessCount",
+                "loadExceptionCount",
+                "totalLoadTime",
+                "averageLoadPenalty",
+                "evictionCount",
+                "elementCount",
+                "totalWeight",
+                "maxWeight",
+        };
+
+        static final String[] FIELD_DESCRIPTIONS = FIELD_NAMES;
+
+        @SuppressWarnings("rawtypes")
+        static final OpenType[] FIELD_TYPES = new OpenType[]{
+                SimpleType.STRING,
+                SimpleType.LONG,
+                SimpleType.LONG,
+                SimpleType.BIGDECIMAL,
+                SimpleType.LONG,
+                SimpleType.BIGDECIMAL,
+                SimpleType.LONG,
+                SimpleType.LONG,
+                SimpleType.LONG,
+                SimpleType.STRING,
+                SimpleType.STRING,
+                SimpleType.LONG,
+                SimpleType.LONG,
+                SimpleType.STRING,
+                SimpleType.STRING,
+        };
+
+        static final CompositeType TYPE = createCompositeType();
+
+        static CompositeType createCompositeType() {
+            try {
+                return new CompositeType(
+                        CacheStatsData.class.getName(),
+                        "Composite data type for Cache statistics",
+                        CacheStatsData.FIELD_NAMES,
+                        CacheStatsData.FIELD_DESCRIPTIONS,
+                        CacheStatsData.FIELD_TYPES);
+            } catch (OpenDataException e) {
+                throw new IllegalStateException(e);
+            }
+        }
+
+        private final CacheStatsMBean stats;
+
+        public CacheStatsData(CacheStatsMBean stats){
+            this.stats = stats;
+        }
+
+        CompositeDataSupport toCompositeData() {
+            Object[] values = new Object[]{
+                    stats.getName(),
+                    stats.getRequestCount(),
+                    stats.getHitCount(),
+                    new BigDecimal(stats.getHitRate(),new MathContext(2)),
+                    stats.getMissCount(),
+                    new BigDecimal(stats.getMissRate(), new MathContext(2)),
+                    stats.getLoadCount(),
+                    stats.getLoadSuccessCount(),
+                    stats.getLoadExceptionCount(),
+                    timeInWords(stats.getTotalLoadTime()),
+                    TimeUnit.NANOSECONDS.toMillis((long) stats.getAverageLoadPenalty()) + "ms",
+                    stats.getEvictionCount(),
+                    stats.getElementCount(),
+                    humanReadableByteCount(stats.estimateCurrentWeight(), true),
+                    humanReadableByteCount(stats.getMaxTotalWeight(), true),
+            };
+            try {
+                return new CompositeDataSupport(TYPE, FIELD_NAMES, values);
+            } catch (OpenDataException e) {
+                throw new IllegalStateException(e);
+            }
+        }
+    }
+
+}

Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/cache/ConsolidatedCacheStats.java
------------------------------------------------------------------------------
    svn:eol-style = native