IGNITE-49 Implemented MXBean

Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/31733531
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/31733531
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/31733531

Branch: refs/heads/ignite-49
Commit: 31733531e1324b4419e072bdfc6567aa13992b6c
Parents: d8ecf41
Author: nikolay_tikhonov <ntikho...@gridgain.com>
Authored: Mon Jan 12 12:05:06 2015 +0300
Committer: nikolay_tikhonov <ntikho...@gridgain.com>
Committed: Fri Jan 16 14:13:34 2015 +0300

----------------------------------------------------------------------
 .../org/apache/ignite/IgniteCacheManager.java   | 119 ++++++++++++++++++-
 .../ignite/cache/CacheConfigurationMXBean.java  |  33 ++---
 .../apache/ignite/cache/CacheMetricsMXBean.java |  94 +++++++++++++++
 .../cache/GridCacheMetricsAdapter.java          |   1 -
 .../cache/GridCacheAbstractMetricsSelfTest.java |  80 +++++++++++--
 5 files changed, 301 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/31733531/modules/core/src/main/java/org/apache/ignite/IgniteCacheManager.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/IgniteCacheManager.java 
b/modules/core/src/main/java/org/apache/ignite/IgniteCacheManager.java
index fa4530b..dbe6838 100644
--- a/modules/core/src/main/java/org/apache/ignite/IgniteCacheManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/IgniteCacheManager.java
@@ -316,14 +316,127 @@ public class IgniteCacheManager implements CacheManager {
         }
     }
 
+
     /** {@inheritDoc} */
     @Override public void enableStatistics(String cacheName, boolean enabled) {
-        ensureNotClosed();
+        Ignite ignite = findIgnite(cacheName);
+
+        GridCache cache = ignite.cache(cacheName);
+
+        GridCacheConfiguration configuration = 
ignite.jcache(cacheName).getConfiguration(GridCacheConfiguration.class);
+
+        MBeanServer mBeanSrv = ignite.configuration().getMBeanServer();
 
         if (cacheName == null)
-            throw new NullPointerException();
+            cacheName = "null";
+
+        if (enabled) {
+            CacheMetricsMXBean mxBean = new CacheMetricsMXBean(cache);
+
+            registerCacheObject(mBeanSrv, mxBean, uri.toString(), cacheName, 
true);
+
+            configuration.setStatisticsEnabled(true);
+        }
+        else {
+            unregisterCacheObject(mBeanSrv, uri.toString(), cacheName, true);
+
+            configuration.setStatisticsEnabled(false);
+        }
+    }
+
+    /**
+     *
+     */
+    private static String mbeanSafe(String string) {
+        return string == null ? "" : string.replaceAll(",|:|=|\n", ".");
+    }
+
+    /**
+     * Finds node which has the cache.
+     *
+     * @param cacheName Cache name.
+     * @return Ignite node.
+     */
+    private Ignite findIgnite(String cacheName) {
+        for (Ignite ignite : Ignition.allGrids())
+            if (ignite.jcache(cacheName) != null)
+                return ignite;
+
+        return null;
+    }
+
+    /**
+     * @param mxbean MXBean.
+     * @param cacheManagerName name generated by URI and classloader.
+     * @param name cache name.
+     */
+    public static void registerCacheObject(MBeanServer mBeanServer, Object 
mxbean, String cacheManagerName, String name,
+                                           boolean stats) {
+        ObjectName registeredObjectName = 
calculateObjectName(cacheManagerName, name, stats);
 
-        throw new UnsupportedOperationException();
+        try {
+            if (!isRegistered(mBeanServer, registeredObjectName)) {
+                mBeanServer.registerMBean(mxbean, registeredObjectName);
+
+                System.out.println("Registered mbean with name " + 
registeredObjectName.toString());
+            }
+        }
+        catch (Exception e) {
+            throw new CacheException("Error registering cache MXBeans for 
CacheManager " + registeredObjectName
+                    + " . Error was " + e.getMessage(), e);
+        }
+    }
+
+    /**
+     * @return {@code True} if MBean registered.
+     */
+    private static boolean isRegistered(MBeanServer mBeanServer, ObjectName 
objectName) {
+        return !mBeanServer.queryNames(objectName, null).isEmpty();
+    }
+
+    /**
+     * UnRegisters the mxbean if registered already.
+     *
+     * @param mBeanSrv MBean server
+     * @param cacheManagerName name generated by URI and classloader.
+     * @param name cache name.
+     * @param stats is mxbean, a statistics mxbean.
+     */
+    public static void unregisterCacheObject(MBeanServer mBeanSrv, String 
cacheManagerName, String name, boolean stats) {
+        Set<ObjectName> registeredObjectNames = null;
+
+        ObjectName objectName = calculateObjectName(cacheManagerName, name, 
stats);
+        registeredObjectNames = mBeanSrv.queryNames(objectName, null);
+
+        System.out.println("Try UnRegistered mbean with name " + 
objectName.toString());
+
+        //should just be one
+        for (ObjectName registeredObjectName : registeredObjectNames) {
+            try {
+                mBeanSrv.unregisterMBean(registeredObjectName);
+            } catch (Exception e) {
+                throw new CacheException("Error unregistering object instance 
" + registeredObjectName
+                        + " . Error was " + e.getMessage(), e);
+            }
+        }
+    }
+
+    /**
+     * Creates an object name.
+     */
+    private static ObjectName calculateObjectName(String cacheManagerName, 
String name, boolean stats) {
+        String cacheManagerNameSafe = mbeanSafe(cacheManagerName);
+        String cacheName = mbeanSafe(name);
+
+        try {
+            String objectNameType = stats ? "Statistics" : "Configuration";
+            return new ObjectName(
+                    "javax.cache:type=Cache" + objectNameType + 
",CacheManager=" + cacheManagerNameSafe + ",Cache=" + cacheName);
+        } catch (MalformedObjectNameException e) {
+            throw new CacheException(
+                    "Illegal ObjectName for Management Bean. " + 
"CacheManager=[" + cacheManagerNameSafe + "], Cache=["
+                            + cacheName + "]", e);
+        }
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/31733531/modules/core/src/main/java/org/apache/ignite/cache/CacheConfigurationMXBean.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/cache/CacheConfigurationMXBean.java
 
b/modules/core/src/main/java/org/apache/ignite/cache/CacheConfigurationMXBean.java
index 2f04cc8..070780a 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/cache/CacheConfigurationMXBean.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/cache/CacheConfigurationMXBean.java
@@ -9,60 +9,63 @@
 
 package org.apache.ignite.cache;
 
-import javax.cache.*;
-import javax.cache.configuration.*;
+import org.gridgain.grid.cache.GridCacheConfiguration;
+
 import javax.cache.management.*;
 
 /**
- * TODO: Add class description.
+ * Implementation of {@link CacheMXBean}.
+ *
+ * It's a simple wrapper around {@link GridCacheConfiguration} for readonly
+ * access to cache configuration.
  */
-public class CacheConfigurationMXBean<K, V> implements CacheMXBean {
+public class CacheConfigurationMXBean implements CacheMXBean {
     /**
      *
      */
-    private final Cache<K, V> cache;
+    private final GridCacheConfiguration cacheCfg;
 
     /**
      * Constructor.
      *
-     * @param cache The cache.
+     * @param cacheCfg The cache configuration.
      */
-    public CacheConfigurationMXBean(Cache<K, V> cache) {
-        this.cache = cache;
+    public CacheConfigurationMXBean(GridCacheConfiguration cacheCfg) {
+        this.cacheCfg = cacheCfg;
     }
 
     /** {@inheritDoc} */
     @Override public String getKeyType() {
-        return 
cache.getConfiguration(CompleteConfiguration.class).getKeyType().getName();
+        return cacheCfg.getKeyType().getName();
     }
 
     /** {@inheritDoc} */
     @Override public String getValueType() {
-        return 
cache.getConfiguration(CompleteConfiguration.class).getValueType().getName();
+        return cacheCfg.getValueType().getName();
     }
 
     /** {@inheritDoc} */
     @Override public boolean isReadThrough() {
-        return 
cache.getConfiguration(CompleteConfiguration.class).isReadThrough();
+        return cacheCfg.isReadThrough();
     }
 
     /** {@inheritDoc} */
     @Override public boolean isWriteThrough() {
-        return 
cache.getConfiguration(CompleteConfiguration.class).isWriteThrough();
+        return cacheCfg.isWriteThrough();
     }
 
     /** {@inheritDoc} */
     @Override public boolean isStoreByValue() {
-        return cache.getConfiguration(Configuration.class).isStoreByValue();
+        return cacheCfg.isStoreByValue();
     }
 
     /** {@inheritDoc} */
     @Override public boolean isStatisticsEnabled() {
-        return 
cache.getConfiguration(CompleteConfiguration.class).isStatisticsEnabled();
+        return cacheCfg.isStatisticsEnabled();
     }
 
     /** {@inheritDoc} */
     @Override public boolean isManagementEnabled() {
-        return 
cache.getConfiguration(CompleteConfiguration.class).isManagementEnabled();
+        return cacheCfg.isManagementEnabled();
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/31733531/modules/core/src/main/java/org/apache/ignite/cache/CacheMetricsMXBean.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/cache/CacheMetricsMXBean.java 
b/modules/core/src/main/java/org/apache/ignite/cache/CacheMetricsMXBean.java
new file mode 100644
index 0000000..92fa80e
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/cache/CacheMetricsMXBean.java
@@ -0,0 +1,94 @@
+/* @java.file.header */
+
+/*  _________        _____ __________________        _____
+ *  __  ____/___________(_)______  /__  ____/______ ____(_)_______
+ *  _  / __  __  ___/__  / _  __  / _  / __  _  __ `/__  / __  __ \
+ *  / /_/ /  _  /    _  /  / /_/ /  / /_/ /  / /_/ / _  /  _  / / /
+ *  \____/   /_/     /_/   \_,__/   \____/   \__,_/  /_/   /_/ /_/
+ */
+
+package org.apache.ignite.cache;
+
+import org.gridgain.grid.cache.GridCache;
+
+import javax.cache.management.*;
+
+/**
+ * Implementation of {@link CacheStatisticsMXBean}.
+ */
+public class CacheMetricsMXBean implements CacheStatisticsMXBean {
+
+    /**
+     * Grid cache.
+     */
+    private final GridCache cache;
+
+    /**
+     * Constructor.
+     *
+     * @param cache GridCache
+     */
+    public CacheMetricsMXBean(GridCache cache) {
+        this.cache = cache;
+    }
+
+    /** {@inheritDoc} */
+    @Override public void clear() {
+        cache.resetMetrics();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getCacheHits() {
+        return cache.metrics().hits();
+    }
+
+    /** {@inheritDoc} */
+    @Override public float getCacheHitPercentage() {
+        return cache.metrics().getCacheHitPercentage();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getCacheMisses() {
+        return cache.metrics().getCacheMisses();
+    }
+
+    /** {@inheritDoc} */
+    @Override public float getCacheMissPercentage() {
+        return cache.metrics().getCacheMissPercentage();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getCacheGets() {
+        return cache.metrics().getCacheGets();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getCachePuts() {
+        return cache.metrics().getCachePuts();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getCacheRemovals() {
+        return cache.metrics().getCacheRemovals();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getCacheEvictions() {
+        return cache.metrics().getCacheEvictions();
+    }
+
+    /** {@inheritDoc} */
+    @Override public float getAverageGetTime() {
+        return cache.metrics().getAverageGetTime();
+    }
+
+    /** {@inheritDoc} */
+    @Override public float getAveragePutTime() {
+        return cache.metrics().getAveragePutTime();
+    }
+
+    /** {@inheritDoc} */
+    @Override public float getAverageRemoveTime() {
+        return cache.metrics().getAverageRemoveTime();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/31733531/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/GridCacheMetricsAdapter.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/GridCacheMetricsAdapter.java
 
b/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/GridCacheMetricsAdapter.java
index a878972..ae539d5 100644
--- 
a/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/GridCacheMetricsAdapter.java
+++ 
b/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/GridCacheMetricsAdapter.java
@@ -20,7 +20,6 @@ package org.gridgain.grid.kernal.processors.cache;
 import org.gridgain.grid.cache.*;
 import org.gridgain.grid.util.tostring.*;
 import org.gridgain.grid.util.typedef.internal.*;
-import org.jdk8.backport.*;
 import org.jetbrains.annotations.*;
 
 import java.io.*;

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/31733531/modules/core/src/test/java/org/gridgain/grid/kernal/processors/cache/GridCacheAbstractMetricsSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/test/java/org/gridgain/grid/kernal/processors/cache/GridCacheAbstractMetricsSelfTest.java
 
b/modules/core/src/test/java/org/gridgain/grid/kernal/processors/cache/GridCacheAbstractMetricsSelfTest.java
index 82aa122..74e6068 100644
--- 
a/modules/core/src/test/java/org/gridgain/grid/kernal/processors/cache/GridCacheAbstractMetricsSelfTest.java
+++ 
b/modules/core/src/test/java/org/gridgain/grid/kernal/processors/cache/GridCacheAbstractMetricsSelfTest.java
@@ -25,6 +25,8 @@ import org.gridgain.grid.util.typedef.internal.*;
 import org.gridgain.testframework.*;
 
 import javax.cache.expiry.*;
+import javax.management.*;
+import java.net.*;
 import java.util.*;
 
 import static java.util.concurrent.TimeUnit.*;
@@ -114,11 +116,11 @@ public abstract class GridCacheAbstractMetricsSelfTest 
extends GridCacheAbstract
 
         float times = (System.nanoTime() - start) * 1.f / 1000;
 
-        float averageRemoveTime = cache.metrics().getAverageRemoveTime();
+        float avgRmvTime = cache.metrics().getAverageRemoveTime();
 
-        assert averageRemoveTime > 0;
+        assert avgRmvTime > 0;
 
-        assertEquals(times, averageRemoveTime, times / 10);
+        assertEquals(times, avgRmvTime, times / 10);
 
         jcache.remove(2);
 
@@ -188,6 +190,71 @@ public abstract class GridCacheAbstractMetricsSelfTest 
extends GridCacheAbstract
     /**
      * @throws Exception If failed.
      */
+    public void testStatisticMXBean() throws Exception {
+        IgniteCache<Integer, Integer> jcache = grid(0).jcache(null);
+
+        URI uri = URI.create("ignite://default");
+
+        IgniteCacheManager cacheManager = new IgniteCacheManager(uri);
+
+        cacheManager.enableStatistics(null, true);
+
+        ObjectName objectName =
+            new 
ObjectName("javax.cache:type=CacheStatistics,CacheManager=ignite.//default,Cache=null");
+
+        long cachePuts = 
(long)getConfiguration().getMBeanServer().getAttribute(objectName, "CachePuts");
+
+        assertEquals(0L, cachePuts);
+
+        jcache.put(1, 1);
+
+        cachePuts = 
(long)getConfiguration().getMBeanServer().getAttribute(objectName, "CachePuts");
+
+        assertEquals(1, cachePuts);
+
+        cacheManager.enableStatistics(null, false);
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testCacheMxBean() throws Exception {
+        URI uri = URI.create("ignite://default");
+
+        IgniteCacheManager cacheManager = new IgniteCacheManager(uri);
+
+        cacheManager.enableManagement(null, true);
+
+        ObjectName objectName =
+            new 
ObjectName("javax.cache:type=CacheConfiguration,CacheManager=ignite.//default,Cache=null");
+
+        String keyType = 
(String)getConfiguration().getMBeanServer().getAttribute(objectName, "KeyType");
+        assertEquals("java.lang.Object", keyType);
+
+        String valueType = 
(String)getConfiguration().getMBeanServer().getAttribute(objectName, 
"ValueType");
+        assertEquals("java.lang.Object", valueType);
+
+        boolean readThrough = 
(boolean)getConfiguration().getMBeanServer().getAttribute(objectName, 
"ReadThrough");
+        assertEquals(false, readThrough);
+
+        boolean writeThrough = 
(boolean)getConfiguration().getMBeanServer().getAttribute(objectName, 
"WriteThrough");
+        assertEquals(false, writeThrough);
+
+        boolean storeByValue = 
(boolean)getConfiguration().getMBeanServer().getAttribute(objectName, 
"StoreByValue");
+        assertEquals(true, storeByValue);
+
+        boolean isStat = 
(boolean)getConfiguration().getMBeanServer().getAttribute(objectName, 
"StatisticsEnabled");
+        assertEquals(true, isStat);
+
+        boolean isMng = 
(boolean)getConfiguration().getMBeanServer().getAttribute(objectName, 
"ManagementEnabled");
+        assertEquals(true, isMng);
+
+        cacheManager.enableManagement(null, false);
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
     public void testGetAllAvgTime() throws Exception {
         IgniteCache<Integer, Integer> jcache = grid(0).jcache(null);
         GridCache<Object, Object> cache = grid(0).cache(null);
@@ -233,12 +300,12 @@ public abstract class GridCacheAbstractMetricsSelfTest 
extends GridCacheAbstract
 
         float times = (System.nanoTime() - start) * 1.f / 1000;
 
-        float averagePutTime = cache.metrics().getAveragePutTime();
+        float avgPutTime = cache.metrics().getAveragePutTime();
 
-        assert averagePutTime > 0;
+        assert avgPutTime > 0;
 
         assertEquals(1, cache.metrics().writes());
-        assertEquals(times, averagePutTime, times / 3);
+        assertEquals(times, avgPutTime, times / 3);
 
         jcache.put(2, 2);
 
@@ -333,7 +400,6 @@ public abstract class GridCacheAbstractMetricsSelfTest 
extends GridCacheAbstract
         assertEquals(expMisses, misses);
     }
 
-
     /**
      * @throws Exception If failed.
      */

Reply via email to