/*
* JBoss, Home of Professional Open Source
* Copyright 2009 Red Hat Inc. and/or its affiliates and other
* contributors as indicated by the @author tags. All rights reserved.
* See the copyright.txt in the distribution for a full listing of
* individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.infinispan.jmx;
import org.infinispan.config.Configuration;
import org.infinispan.config.GlobalConfiguration;
import org.infinispan.manager.CacheContainer;
import org.infinispan.manager.EmbeddedCacheManager;
import org.infinispan.test.AbstractInfinispanTest;
import org.infinispan.test.TestingUtil;
import org.infinispan.test.fwk.TestCacheManagerFactory;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.Test;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import static org.infinispan.test.TestingUtil.getCacheManagerObjectName;
import static org.infinispan.test.TestingUtil.getCacheObjectName;
/**
* Functional test for checking jmx statistics exposure.
*
* @author Mircea.Markus@jboss.com
* @author Galder ZamarreƱo
* @since 4.0
*/
@Test(groups = "functional", testName = "jmx.JmxStatsFunctionalTest")
public class JmxStatsFunctionalTest extends AbstractInfinispanTest {
public static final String JMX_DOMAIN = JmxStatsFunctionalTest.class.getSimpleName();
private MBeanServer server;
private EmbeddedCacheManager cm, cm2, cm3;
@AfterMethod(alwaysRun = true)
public void destroyCacheManager() {
TestingUtil.killCacheManagers(cm, cm2, cm3);
if (cm != null)
assert !existsDomains(cm.getGlobalConfiguration().getJmxDomain());
if (cm2 != null)
assert !existsDomains(cm2.getGlobalConfiguration().getJmxDomain());
if (cm3 != null)
assert !existsDomains(cm3.getGlobalConfiguration().getJmxDomain());
cm = null;
cm2 = null;
cm3 = null;
server = null;
}
/**
* Create a local cache, two replicated caches and see that everithing is correctly registered.
*/
public void testDefaultDomain() throws Exception {
GlobalConfiguration globalConfiguration = GlobalConfiguration.getClusteredDefault();
globalConfiguration.setExposeGlobalJmxStatistics(true);
globalConfiguration.setMBeanServerLookup(PerThreadMBeanServerLookup.class.getName());
cm = TestCacheManagerFactory.createCacheManager(globalConfiguration);
String jmxDomain = cm.getGlobalConfiguration().getJmxDomain();
Configuration localCache = config();//local by default
cm.defineConfiguration("local_cache", localCache);
Configuration remote1 = config();//local by default
remote1.setCacheMode(Configuration.CacheMode.REPL_SYNC);
cm.defineConfiguration("remote1", remote1);
Configuration remote2 = config();//local by default
remote2.setCacheMode(Configuration.CacheMode.INVALIDATION_ASYNC);
cm.defineConfiguration("remote2", remote2);
cm.getCache("local_cache");
cm.getCache("remote1");
cm.getCache("remote2");
assert existsObject(getCacheObjectName(jmxDomain, "local_cache(local)", "Statistics"));
assert existsObject(getCacheObjectName(jmxDomain, "remote1(repl_sync)", "RpcManager"));
assert existsObject(getCacheObjectName(jmxDomain, "remote1(repl_sync)", "Statistics"));
assert existsObject(getCacheObjectName(jmxDomain, "remote2(invalidation_async)", "RpcManager"));
assert existsObject(getCacheObjectName(jmxDomain, "remote2(invalidation_async)", "Statistics"));
TestingUtil.killCacheManagers(cm);
assert !existsObject(getCacheObjectName(jmxDomain, "local_cache(local)", "Statistics"));
assert !existsObject(getCacheObjectName(jmxDomain, "remote1(repl_sync)", "RpcManager"));
assert !existsObject(getCacheObjectName(jmxDomain, "remote1(repl_sync)", "Statistics"));
assert !existsObject(getCacheObjectName(jmxDomain, "remote2(invalidation_async)", "RpcManager"));
assert !existsObject(getCacheObjectName(jmxDomain, "remote2(invalidation_async)", "Statistics"));
}
public void testDifferentDomain() throws Exception {
GlobalConfiguration globalConfiguration = GlobalConfiguration.getClusteredDefault();
globalConfiguration.setMBeanServerLookup(PerThreadMBeanServerLookup.class.getName());
cm = TestCacheManagerFactory.createCacheManager(globalConfiguration);
String jmxDomain = cm.getGlobalConfiguration().getJmxDomain();
Configuration localCache = config();//local by default
cm.defineConfiguration("local_cache", localCache);
cm.getCache("local_cache");
assert existsObject(getCacheObjectName(jmxDomain, "local_cache(local)", "Statistics"));
}
public void testOnlyGlobalJmxStatsEnabled() throws Exception {
GlobalConfiguration globalConfiguration = GlobalConfiguration.getClusteredDefault();
globalConfiguration.setExposeGlobalJmxStatistics(true);
globalConfiguration.setMBeanServerLookup(PerThreadMBeanServerLookup.class.getName());
cm = TestCacheManagerFactory.createCacheManager(globalConfiguration);
String jmxDomain = globalConfiguration.getJmxDomain();
Configuration localCache = config();//local by default
localCache.setExposeJmxStatistics(false);
cm.defineConfiguration("local_cache", localCache);
Configuration remote1 = config();//local by default
remote1.setExposeJmxStatistics(false);
remote1.setCacheMode(Configuration.CacheMode.REPL_SYNC);
cm.defineConfiguration("remote1", remote1);
cm.getCache("local_cache");
cm.getCache("remote1");
assert !existsObject(getCacheObjectName(jmxDomain, "local_cache(local)", "Statistics"));
assert existsObject(getCacheManagerObjectName(jmxDomain));
assert !existsObject(getCacheObjectName(jmxDomain, "remote1(repl_sync)", "RpcManager"));
}
public void testOnlyPerCacheJmxStatsEnabled() throws Exception {
GlobalConfiguration globalConfiguration = GlobalConfiguration.getClusteredDefault();
globalConfiguration.setExposeGlobalJmxStatistics(false);
globalConfiguration.setMBeanServerLookup(PerThreadMBeanServerLookup.class.getName());
cm = TestCacheManagerFactory.createCacheManager(globalConfiguration);
String jmxDomain = globalConfiguration.getJmxDomain();
Configuration localCache = config();//local by default
localCache.setExposeJmxStatistics(true);
cm.defineConfiguration("local_cache", localCache);
Configuration remote1 = config();//local by default
remote1.setExposeJmxStatistics(true);
remote1.setCacheMode(Configuration.CacheMode.REPL_SYNC);
cm.defineConfiguration("remote1", remote1);
cm.getCache("local_cache");
cm.getCache("remote1");
assert existsObject(getCacheObjectName(jmxDomain, "local_cache(local)", "Statistics"));
assert !existsObject(getCacheManagerObjectName(jmxDomain));
assert existsObject(getCacheObjectName(jmxDomain, "remote1(repl_sync)", "RpcManager"));
}
public void testMultipleManagersOnSameServerFails(Method method) throws Exception {
final String jmxDomain = JMX_DOMAIN + '.' + method.getName();
GlobalConfiguration globalConfiguration = GlobalConfiguration.getClusteredDefault();
globalConfiguration.setJmxDomain(jmxDomain);
globalConfiguration.setExposeGlobalJmxStatistics(true);
globalConfiguration.setMBeanServerLookup(PerThreadMBeanServerLookup.class.getName());
cm = TestCacheManagerFactory.createCacheManagerEnforceJmxDomain(globalConfiguration);
Configuration localCache = config();//local by default
localCache.setExposeJmxStatistics(true);
cm.defineConfiguration("local_cache", localCache);
cm.getCache("local_cache");
assert existsObject(getCacheObjectName(jmxDomain, "local_cache(local)", "Statistics"));
GlobalConfiguration globalConfiguration2 = GlobalConfiguration.getClusteredDefault();
globalConfiguration2.setJmxDomain(jmxDomain);
globalConfiguration2.setExposeGlobalJmxStatistics(true);
globalConfiguration2.setAllowDuplicateDomains(false);
globalConfiguration2.setMBeanServerLookup(PerThreadMBeanServerLookup.class.getName());
try {
TestCacheManagerFactory.createCacheManagerEnforceJmxDomain(globalConfiguration2);
assert false : "Failure expected, '" + jmxDomain + "' duplicate!";
} catch (JmxDomainConflictException e) {
}
server = PerThreadMBeanServerLookup.getThreadMBeanServer();
globalConfiguration2.setAllowDuplicateDomains(true);
CacheContainer duplicateAllowedContainer = TestCacheManagerFactory.createCacheManagerEnforceJmxDomain(globalConfiguration2);
try {
final String duplicateName = jmxDomain + "2";
ObjectName duplicateObjectName = getCacheManagerObjectName(duplicateName);
server.getAttribute(duplicateObjectName, "CreatedCacheCount").equals("0");
} finally {
duplicateAllowedContainer.stop();
}
}
public void testMultipleManagersOnSameServerWithCloneFails() throws Exception {
GlobalConfiguration globalConfiguration = GlobalConfiguration.getClusteredDefault();
globalConfiguration.setMBeanServerLookup(PerThreadMBeanServerLookup.class.getName());
globalConfiguration.setExposeGlobalJmxStatistics(true);
cm = TestCacheManagerFactory.createCacheManager(globalConfiguration);
Configuration localCache = config();//local by default
localCache.setExposeJmxStatistics(true);
cm.defineConfiguration("local_cache", localCache);
cm.getCache("local_cache");
String jmxDomain = globalConfiguration.getJmxDomain();
assert existsObject(getCacheObjectName(jmxDomain, "local_cache(local)", "Statistics"));
GlobalConfiguration globalConfigurationClone = globalConfiguration.clone();
globalConfigurationClone.setExposeGlobalJmxStatistics(true);
globalConfigurationClone.setAllowDuplicateDomains(false);
globalConfigurationClone.setMBeanServerLookup(PerThreadMBeanServerLookup.class.getName());
try {
TestCacheManagerFactory.createCacheManagerEnforceJmxDomain(globalConfigurationClone);
assert false : "Failure expected!";
} catch (JmxDomainConflictException e) {
}
}
public void testMultipleManagersOnSameServer() throws Exception {
GlobalConfiguration globalConfiguration = GlobalConfiguration.getClusteredDefault();
globalConfiguration.setAllowDuplicateDomains(true);
globalConfiguration.setExposeGlobalJmxStatistics(true);
globalConfiguration.setMBeanServerLookup(PerThreadMBeanServerLookup.class.getName());
cm = TestCacheManagerFactory.createCacheManager(globalConfiguration);
String jmxDomain = globalConfiguration.getJmxDomain();
Configuration localCache = config();//local by default
localCache.setExposeJmxStatistics(true);
cm.defineConfiguration("local_cache", localCache);
cm.getCache("local_cache");
assert existsObject(getCacheObjectName(jmxDomain, "local_cache(local)", "Statistics"));
GlobalConfiguration globalConfiguration2 = GlobalConfiguration.getClusteredDefault();
globalConfiguration2.setExposeGlobalJmxStatistics(true);
globalConfiguration2.setAllowDuplicateDomains(true);
globalConfiguration2.setMBeanServerLookup(PerThreadMBeanServerLookup.class.getName());
cm2 = TestCacheManagerFactory.createCacheManager(globalConfiguration2);
String jmxDomain2 = cm2.getGlobalConfiguration().getJmxDomain();
Configuration localCache2 = config();//local by default
localCache2.setExposeJmxStatistics(true);
cm2.defineConfiguration("local_cache", localCache);
cm2.getCache("local_cache");
assert existsObject(getCacheObjectName(jmxDomain2, "local_cache(local)", "Statistics"));
GlobalConfiguration globalConfiguration3 = GlobalConfiguration.getClusteredDefault();
globalConfiguration3.setExposeGlobalJmxStatistics(true);
globalConfiguration3.setAllowDuplicateDomains(true);
globalConfiguration3.setMBeanServerLookup(PerThreadMBeanServerLookup.class.getName());
cm3 = TestCacheManagerFactory.createCacheManager(globalConfiguration3);
Configuration localCache3 = config();//local by default
localCache3.setExposeJmxStatistics(true);
cm3.defineConfiguration("local_cache", localCache);
cm3.getCache("local_cache");
String jmxDomain3 = cm3.getGlobalConfiguration().getJmxDomain();
assert existsObject(getCacheObjectName(jmxDomain3, "local_cache(local)", "Statistics"));
}
public void testUnregisterJmxInfoOnStop() throws Exception {
GlobalConfiguration globalConfiguration = GlobalConfiguration.getClusteredDefault();
globalConfiguration.setExposeGlobalJmxStatistics(true);
globalConfiguration.setMBeanServerLookup(PerThreadMBeanServerLookup.class.getName());
cm = TestCacheManagerFactory.createCacheManager(globalConfiguration);
Configuration localCache = config();//local by default
localCache.setExposeJmxStatistics(true);
cm.defineConfiguration("local_cache", localCache);
cm.getCache("local_cache");
String jmxDomain = globalConfiguration.getJmxDomain();
assert existsObject(getCacheObjectName(jmxDomain, "local_cache(local)", "Statistics"));
TestingUtil.killCacheManagers(cm);
assert !existsObject(getCacheObjectName(jmxDomain, "local_cache(local)", "Statistics"));
assert !existsDomains(jmxDomain);
}
public void testCorrectUnregistering() throws Exception {
assert !existsDomains("infinispan");
GlobalConfiguration globalConfiguration = GlobalConfiguration.getNonClusteredDefault();
globalConfiguration.setMBeanServerLookup(PerThreadMBeanServerLookup.class.getName());
cm = TestCacheManagerFactory.createCacheManager(globalConfiguration);
Configuration localCache = config();//local by default
cm.defineConfiguration("local_cache", localCache);
cm.getCache("local_cache");
String jmxDomain = cm.getGlobalConfiguration().getJmxDomain();
assert existsObject(getCacheObjectName(jmxDomain, "local_cache(local)", "Statistics"));
assert existsObject(getCacheObjectName(jmxDomain, "local_cache(local)", "Cache"));
//now register a global one
GlobalConfiguration globalConfiguration2 = GlobalConfiguration.getClusteredDefault();
globalConfiguration2.setExposeGlobalJmxStatistics(true);
globalConfiguration2.setMBeanServerLookup(PerThreadMBeanServerLookup.class.getName());
globalConfiguration2.setAllowDuplicateDomains(true);
cm2 = TestCacheManagerFactory.createCacheManager(globalConfiguration2);
Configuration remoteCache = new Configuration();
remoteCache.setExposeJmxStatistics(true);
remoteCache.setCacheMode(Configuration.CacheMode.REPL_SYNC);
cm2.defineConfiguration("remote_cache", remoteCache);
cm2.getCache("remote_cache");
String jmxDomain2 = cm2.getGlobalConfiguration().getJmxDomain();
assert existsObject(getCacheObjectName(jmxDomain2, "remote_cache(repl_sync)", "Cache"));
assert existsObject(getCacheObjectName(jmxDomain2, "remote_cache(repl_sync)", "Statistics"));
cm2.stop();
assert existsObject(getCacheObjectName(jmxDomain, "local_cache(local)", "Statistics"));
assert !existsObject(getCacheObjectName(jmxDomain2, "remote_cache(repl_sync)", "CacheComponent"));
assert !existsObject(getCacheObjectName(jmxDomain2, "remote_cache(repl_sync)", "Statistics"));
cm.stop();
assert !existsObject(getCacheObjectName(jmxDomain, "local_cache(local)", "Statistics"));
assert !existsObject(getCacheObjectName(jmxDomain2, "remote_cache(repl_sync)", "Statistics"));
}
public void testStopUnstartedCacheManager() {
GlobalConfiguration globalConfiguration = GlobalConfiguration.getNonClusteredDefault();
globalConfiguration.setExposeGlobalJmxStatistics(true);
globalConfiguration.setMBeanServerLookup(PerThreadMBeanServerLookup.class.getName());
cm = TestCacheManagerFactory.createCacheManager(false, globalConfiguration);
cm.stop();
}
static boolean existsObject(ObjectName objectName) {
return PerThreadMBeanServerLookup.getThreadMBeanServer().isRegistered(objectName);
}
public boolean existsDomains(String... domains) {
MBeanServer mBeanServer = PerThreadMBeanServerLookup.getThreadMBeanServer();
Set<String> domainSet = new HashSet<String>(Arrays.asList(domains));
for (String domain : mBeanServer.getDomains()) {
if (domainSet.contains(domain)) return true;
}
return false;
}
private Configuration config() {
Configuration configuration = new Configuration();
configuration.setFetchInMemoryState(false);
configuration.setExposeJmxStatistics(true);
return configuration;
}
}