package org.infinispan.jmx; import static org.infinispan.test.TestingUtil.getCacheManagerObjectName; import java.io.Serializable; import javax.management.Attribute; import javax.management.MBeanServer; import javax.management.ObjectName; import org.infinispan.Cache; import org.infinispan.configuration.cache.CacheMode; import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.configuration.global.GlobalConfigurationBuilder; import org.infinispan.manager.CacheContainer; import org.infinispan.stats.CacheContainerStats; import org.infinispan.test.MultipleCacheManagersTest; import org.infinispan.test.fwk.TestCacheManagerFactory; import org.infinispan.test.fwk.TransportFlags; import org.testng.annotations.Test; /** * */ @Test(groups = "functional", testName = "jmx.CacheContainerStatsMBeanTest") public class CacheContainerStatsMBeanTest extends MultipleCacheManagersTest { private final String cachename = CacheContainerStatsMBeanTest.class.getName(); private final String cachename2 = cachename + "2"; public static final String JMX_DOMAIN = CacheContainerStatsMBeanTest.class.getSimpleName(); public static final String JMX_DOMAIN2 = JMX_DOMAIN + "2"; @Override protected void createCacheManagers() throws Throwable { ConfigurationBuilder defaultConfig = new ConfigurationBuilder(); GlobalConfigurationBuilder gcb1 = GlobalConfigurationBuilder.defaultClusteredBuilder(); gcb1.globalJmxStatistics().enable().allowDuplicateDomains(true).jmxDomain(JMX_DOMAIN) .mBeanServerLookup(new PerThreadMBeanServerLookup()); CacheContainer cacheManager1 = TestCacheManagerFactory.createClusteredCacheManager(gcb1, defaultConfig, new TransportFlags(), true); cacheManager1.start(); GlobalConfigurationBuilder gcb2 = GlobalConfigurationBuilder.defaultClusteredBuilder(); gcb2.globalJmxStatistics().enable().allowDuplicateDomains(true).jmxDomain(JMX_DOMAIN) .mBeanServerLookup(new PerThreadMBeanServerLookup()); CacheContainer cacheManager2 = TestCacheManagerFactory.createClusteredCacheManager(gcb2, defaultConfig, new TransportFlags(), true); cacheManager2.start(); registerCacheManager(cacheManager1, cacheManager2); ConfigurationBuilder cb = new ConfigurationBuilder(); cb.clustering().cacheMode(CacheMode.REPL_SYNC).jmxStatistics().enable(); defineConfigurationOnAllManagers(cachename, cb); defineConfigurationOnAllManagers(cachename2, cb); waitForClusterToForm(cachename); } public void testClusterStats() throws Exception { Cache<String, Serializable> cache1 = manager(0).getCache(cachename); MBeanServer mBeanServer = PerThreadMBeanServerLookup.getThreadMBeanServer(); ObjectName nodeStats = getCacheManagerObjectName(JMX_DOMAIN, "DefaultCacheManager", CacheContainerStats.OBJECT_NAME); mBeanServer.setAttribute(nodeStats, new Attribute("StatisticsEnabled", Boolean.TRUE)); cache1.put("a1", "b1"); cache1.put("a2", "b2"); cache1.put("a3", "b3"); cache1.put("a4", "b4"); assertAttributeValue(mBeanServer, nodeStats, "NumberOfEntries", 4); assertAttributeValue(mBeanServer, nodeStats, "Stores", 4); assertAttributeValue(mBeanServer, nodeStats, "Evictions", 0); assertAttributeValueGreaterThanOrEqual(mBeanServer, nodeStats, "AverageWriteTime", 0); cache1.remove("a1"); assertAttributeValue(mBeanServer, nodeStats, "RemoveHits", 1); Cache<String, Serializable> cache3 = manager(0).getCache(cachename2); cache3.put("a10", "b1"); cache3.put("a11", "b2"); cache3.put("a12", "b3"); cache3.put("a13", "b4"); assertAttributeValue(mBeanServer, nodeStats, "NumberOfEntries", 7); assertAttributeValue(mBeanServer, nodeStats, "Stores", 8); assertAttributeValue(mBeanServer, nodeStats, "Evictions", 0); assertAttributeValueGreaterThanOrEqual(mBeanServer, nodeStats, "AverageWriteTime", 0); } public void testClusterStatsDisabled() throws Exception { MBeanServer mBeanServer = PerThreadMBeanServerLookup.getThreadMBeanServer(); ObjectName nodeStats = getCacheManagerObjectName(JMX_DOMAIN, "DefaultCacheManager", CacheContainerStats.OBJECT_NAME); mBeanServer.setAttribute(nodeStats, new Attribute("StatisticsEnabled", Boolean.FALSE)); assertAttributeValue(mBeanServer, nodeStats, "NumberOfEntries", -1); assertAttributeValue(mBeanServer, nodeStats, "AverageReadTime", -1); assertAttributeValue(mBeanServer, nodeStats, "AverageRemoveTime", -1); assertAttributeValue(mBeanServer, nodeStats, "AverageWriteTime", -1); assertAttributeValue(mBeanServer, nodeStats, "Stores", -1); assertAttributeValue(mBeanServer, nodeStats, "Evictions", -1); assertAttributeValue(mBeanServer, nodeStats, "Hits", -1); assertAttributeValue(mBeanServer, nodeStats, "Misses", -1); assertAttributeValue(mBeanServer, nodeStats, "RemoveHits", -1); } private void assertAttributeValue(MBeanServer mBeanServer, ObjectName oName, String attrName, long expectedValue) throws Exception { String receivedVal = mBeanServer.getAttribute(oName, attrName).toString(); assert Long.parseLong(receivedVal) == expectedValue : "expecting " + expectedValue + " for " + attrName + ", but received " + receivedVal; } private void assertAttributeValueGreaterThanOrEqual(MBeanServer mBeanServer, ObjectName oName, String attrName, long valueToCompare) throws Exception { String receivedVal = mBeanServer.getAttribute(oName, attrName).toString(); assert Long.parseLong(receivedVal) >= valueToCompare : "expecting " + receivedVal + " for " + attrName + ", to be greater than" + valueToCompare; } }