package org.infinispan.jmx;
import static org.infinispan.test.TestingUtil.existsDomains;
import static org.infinispan.test.TestingUtil.existsObject;
import static org.infinispan.test.TestingUtil.getCacheManagerObjectName;
import static org.infinispan.test.TestingUtil.getCacheObjectName;
import java.lang.reflect.Method;
import java.util.Properties;
import javax.management.MBeanServer;
import javax.management.ObjectName;
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.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;
/**
* Functional test for checking jmx statistics exposure.
*
* @author Mircea.Markus@jboss.com
* @author Galder ZamarreƱo
* @since 4.0
*/
@Test(groups = {"functional", "smoke"}, 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
public void destroyCacheManager() {
TestingUtil.killCacheManagers(cm, cm2, cm3);
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 {
GlobalConfigurationBuilder globalConfiguration = GlobalConfigurationBuilder.defaultClusteredBuilder();
globalConfiguration.globalJmxStatistics().enable().mBeanServerLookup(new PerThreadMBeanServerLookup());
cm = TestCacheManagerFactory.createClusteredCacheManager(globalConfiguration, new ConfigurationBuilder());
String jmxDomain = cm.getCacheManagerConfiguration().globalJmxStatistics().domain();
ConfigurationBuilder localCache = config();//local by default
cm.defineConfiguration("local_cache", localCache.build());
ConfigurationBuilder remote1 = config();//local by default
remote1.clustering().cacheMode(CacheMode.REPL_SYNC);
cm.defineConfiguration("remote1", remote1.build());
ConfigurationBuilder remote2 = config();//local by default
remote2.clustering().cacheMode(CacheMode.INVALIDATION_ASYNC);
cm.defineConfiguration("remote2", remote2.build());
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 {
GlobalConfigurationBuilder globalConfiguration = GlobalConfigurationBuilder.defaultClusteredBuilder();
globalConfiguration.globalJmxStatistics().enable().mBeanServerLookup(new PerThreadMBeanServerLookup());
cm = TestCacheManagerFactory.createClusteredCacheManager(globalConfiguration, new ConfigurationBuilder());
String jmxDomain = cm.getCacheManagerConfiguration().globalJmxStatistics().domain();
ConfigurationBuilder localCache = config();//local by default
cm.defineConfiguration("local_cache", localCache.build());
cm.getCache("local_cache");
assert existsObject(getCacheObjectName(jmxDomain, "local_cache(local)", "Statistics"));
}
public void testOnlyGlobalJmxStatsEnabled() throws Exception {
GlobalConfigurationBuilder globalConfiguration = GlobalConfigurationBuilder.defaultClusteredBuilder();
globalConfiguration.globalJmxStatistics().enable().mBeanServerLookup(new PerThreadMBeanServerLookup());
cm = TestCacheManagerFactory.createClusteredCacheManager(globalConfiguration, new ConfigurationBuilder());
String jmxDomain = cm.getCacheManagerConfiguration().globalJmxStatistics().domain();
ConfigurationBuilder localCache = config();//local by default
localCache.jmxStatistics().disable();
cm.defineConfiguration("local_cache", localCache.build());
ConfigurationBuilder remote1 = config();//local by default
remote1.jmxStatistics().disable();
remote1.clustering().cacheMode(CacheMode.REPL_SYNC);
cm.defineConfiguration("remote1", remote1.build());
cm.getCache("local_cache");
cm.getCache("remote1");
assert existsObject(getCacheManagerObjectName(jmxDomain));
// Statistics MBean is always enabled now
assert existsObject(getCacheObjectName(jmxDomain, "local_cache(local)", "Statistics"));
assert existsObject(getCacheObjectName(jmxDomain, "remote1(repl_sync)", "Statistics"));
// Since ISPN-2290
assert existsObject(getCacheObjectName(jmxDomain, "remote1(repl_sync)", "LockManager"));
assert existsObject(getCacheObjectName(jmxDomain, "local_cache(local)", "LockManager"));
}
public void testOnlyPerCacheJmxStatsEnabled() throws Exception {
GlobalConfigurationBuilder globalConfiguration = GlobalConfigurationBuilder.defaultClusteredBuilder();
globalConfiguration.globalJmxStatistics().enable().mBeanServerLookup(new PerThreadMBeanServerLookup());
cm = TestCacheManagerFactory.createClusteredCacheManager(globalConfiguration, new ConfigurationBuilder());
String jmxDomain = cm.getCacheManagerConfiguration().globalJmxStatistics().domain();
ConfigurationBuilder localCache = config();//local by default
localCache.jmxStatistics().enable();
cm.defineConfiguration("local_cache", localCache.build());
ConfigurationBuilder remote1 = config();//local by default
remote1.jmxStatistics().enable();
remote1.clustering().cacheMode(CacheMode.REPL_SYNC);
cm.defineConfiguration("remote1", remote1.build());
cm.getCache("local_cache");
cm.getCache("remote1");
assert existsObject(getCacheObjectName(jmxDomain, "local_cache(local)", "Statistics"));
// Since ISPN-2290
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();
cm = TestCacheManagerFactory.createClusteredCacheManagerEnforceJmxDomain(jmxDomain);
ConfigurationBuilder localCache = config();//local by default
localCache.jmxStatistics().enable();
cm.defineConfiguration("local_cache", localCache.build());
cm.getCache("local_cache");
assert existsObject(getCacheObjectName(jmxDomain, "local_cache(local)", "Statistics"));
try {
TestCacheManagerFactory.createClusteredCacheManagerEnforceJmxDomain(jmxDomain, false);
assert false : "Failure expected, '" + jmxDomain + "' duplicate!";
} catch (JmxDomainConflictException e) {
}
server = PerThreadMBeanServerLookup.getThreadMBeanServer();
CacheContainer duplicateAllowedContainer =TestCacheManagerFactory.createClusteredCacheManagerEnforceJmxDomain(jmxDomain, true);
try {
final String duplicateName = jmxDomain + "2";
ObjectName duplicateObjectName = getCacheManagerObjectName(duplicateName);
server.getAttribute(duplicateObjectName, "CreatedCacheCount").equals("0");
} finally {
duplicateAllowedContainer.stop();
}
}
public void testMultipleManagersOnSameServerWithCloneFails() throws Exception {
GlobalConfigurationBuilder globalConfiguration = GlobalConfigurationBuilder.defaultClusteredBuilder();
globalConfiguration.globalJmxStatistics().enable().mBeanServerLookup(new PerThreadMBeanServerLookup());
cm = TestCacheManagerFactory.createClusteredCacheManager(globalConfiguration, new ConfigurationBuilder());
String jmxDomain = cm.getCacheManagerConfiguration().globalJmxStatistics().domain();
ConfigurationBuilder localCache = config();//local by default
localCache.jmxStatistics().enable();
cm.defineConfiguration("local_cache", localCache.build());
cm.getCache("local_cache");
assert existsObject(getCacheObjectName(jmxDomain, "local_cache(local)", "Statistics"));
try {
TestCacheManagerFactory.createClusteredCacheManagerEnforceJmxDomain(jmxDomain, false);
assert false : "Failure expected!";
} catch (JmxDomainConflictException e) {
}
}
public void testMultipleManagersOnSameServer() throws Exception {
GlobalConfigurationBuilder globalConfiguration = GlobalConfigurationBuilder.defaultClusteredBuilder();
globalConfiguration.globalJmxStatistics().enable().mBeanServerLookup(new PerThreadMBeanServerLookup());
cm = TestCacheManagerFactory.createClusteredCacheManager(globalConfiguration, new ConfigurationBuilder());
String jmxDomain = cm.getCacheManagerConfiguration().globalJmxStatistics().domain();
ConfigurationBuilder localCache = config();//local by default
localCache.jmxStatistics().enable();
cm.defineConfiguration("local_cache", localCache.build());
cm.getCache("local_cache");
assert existsObject(getCacheObjectName(jmxDomain, "local_cache(local)", "Statistics"));
GlobalConfigurationBuilder globalConfiguration2 = GlobalConfigurationBuilder.defaultClusteredBuilder();
globalConfiguration2.globalJmxStatistics().enable().mBeanServerLookup(new PerThreadMBeanServerLookup()).allowDuplicateDomains(true);
cm2 = TestCacheManagerFactory.createClusteredCacheManager(globalConfiguration2, new ConfigurationBuilder());
String jmxDomain2 = cm2.getCacheManagerConfiguration().globalJmxStatistics().domain();
ConfigurationBuilder localCache2 = config();//local by default
localCache2.jmxStatistics().enable();
cm2.defineConfiguration("local_cache", localCache.build());
cm2.getCache("local_cache");
assert existsObject(getCacheObjectName(jmxDomain2, "local_cache(local)", "Statistics"));
GlobalConfigurationBuilder globalConfiguration3 = GlobalConfigurationBuilder.defaultClusteredBuilder();
globalConfiguration3.globalJmxStatistics().enable().mBeanServerLookup(new PerThreadMBeanServerLookup()).allowDuplicateDomains(true);
cm3 = TestCacheManagerFactory.createClusteredCacheManager(globalConfiguration3, new ConfigurationBuilder());
String jmxDomain3 = cm3.getCacheManagerConfiguration().globalJmxStatistics().domain();
ConfigurationBuilder localCache3 = config();//local by default
localCache3.jmxStatistics().enable();
cm3.defineConfiguration("local_cache", localCache.build());
cm3.getCache("local_cache");
assert existsObject(getCacheObjectName(jmxDomain3, "local_cache(local)", "Statistics"));
}
public void testUnregisterJmxInfoOnStop() throws Exception {
GlobalConfigurationBuilder globalConfiguration = GlobalConfigurationBuilder.defaultClusteredBuilder();
globalConfiguration.globalJmxStatistics().enable().mBeanServerLookup(new PerThreadMBeanServerLookup());
cm = TestCacheManagerFactory.createClusteredCacheManager(globalConfiguration, new ConfigurationBuilder());
String jmxDomain = cm.getCacheManagerConfiguration().globalJmxStatistics().domain();
ConfigurationBuilder localCache = config();//local by default
localCache.jmxStatistics().enable();
cm.defineConfiguration("local_cache", localCache.build());
cm.getCache("local_cache");
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");
GlobalConfigurationBuilder globalConfiguration = new GlobalConfigurationBuilder();
globalConfiguration.globalJmxStatistics().enable().mBeanServerLookup(new PerThreadMBeanServerLookup());
cm = TestCacheManagerFactory.createCacheManager(globalConfiguration, new ConfigurationBuilder());
ConfigurationBuilder localCache = config();//local by default
cm.defineConfiguration("local_cache", localCache.build());
cm.getCache("local_cache");
String jmxDomain = cm.getCacheManagerConfiguration().globalJmxStatistics().domain();
assert existsObject(getCacheObjectName(jmxDomain, "local_cache(local)", "Statistics"));
assert existsObject(getCacheObjectName(jmxDomain, "local_cache(local)", "Cache"));
//now register a global one
GlobalConfigurationBuilder globalConfiguration2 = GlobalConfigurationBuilder.defaultClusteredBuilder();
globalConfiguration2.globalJmxStatistics().enable().mBeanServerLookup(new PerThreadMBeanServerLookup()).allowDuplicateDomains(true);
cm2 = TestCacheManagerFactory.createClusteredCacheManager(globalConfiguration2, new ConfigurationBuilder());
ConfigurationBuilder remoteCache = new ConfigurationBuilder();
remoteCache.jmxStatistics().enable();
remoteCache.clustering().cacheMode(CacheMode.REPL_SYNC);
cm2.defineConfiguration("remote_cache", remoteCache.build());
cm2.getCache("remote_cache");
String jmxDomain2 = cm2.getCacheManagerConfiguration().globalJmxStatistics().domain();
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() {
GlobalConfigurationBuilder globalConfiguration = new GlobalConfigurationBuilder();
globalConfiguration.globalJmxStatistics().enable().mBeanServerLookup(new PerThreadMBeanServerLookup());
cm = TestCacheManagerFactory.createCacheManager(globalConfiguration, new ConfigurationBuilder(), false);
cm.stop();
}
public void testConfigurationProperties() throws Exception {
GlobalConfigurationBuilder globalConfiguration = GlobalConfigurationBuilder.defaultClusteredBuilder();
globalConfiguration.transport().siteId("TESTVALUE1");
globalConfiguration.transport().rackId("TESTVALUE2");
globalConfiguration.transport().machineId("TESTVALUE3");
globalConfiguration.globalJmxStatistics().enable().mBeanServerLookup(new PerThreadMBeanServerLookup());
cm = TestCacheManagerFactory.createClusteredCacheManager(globalConfiguration, new ConfigurationBuilder());
String jmxDomain = cm.getCacheManagerConfiguration().globalJmxStatistics().domain();
ConfigurationBuilder localCache = config();
localCache.storeAsBinary().enable();
cm.defineConfiguration("local_cache1", localCache.build());
localCache.storeAsBinary().disable();
cm.defineConfiguration("local_cache2", localCache.build());
cm.getCache("local_cache1");
cm.getCache("local_cache2");
MBeanServer mBeanServer = PerThreadMBeanServerLookup.getThreadMBeanServer();
Properties props1 = (Properties) mBeanServer.getAttribute(getCacheObjectName(jmxDomain, "local_cache1(local)", "Cache"), "configurationAsProperties");
Properties props2 = (Properties) mBeanServer.getAttribute(getCacheObjectName(jmxDomain, "local_cache2(local)", "Cache"), "configurationAsProperties");
Properties propsGlobal = (Properties) mBeanServer.getAttribute(getCacheManagerObjectName(jmxDomain), "globalConfigurationAsProperties");
assert "true".equals(props1.getProperty("storeAsBinary.enabled"));
assert "false".equals(props2.getProperty("storeAsBinary.enabled"));
log.tracef("propsGlobal=%s", propsGlobal);
assert "TESTVALUE1".equals(propsGlobal.getProperty("transport.siteId"));
assert "TESTVALUE2".equals(propsGlobal.getProperty("transport.rackId"));
assert "TESTVALUE3".equals(propsGlobal.getProperty("transport.machineId"));
}
private ConfigurationBuilder config() {
ConfigurationBuilder configuration = new ConfigurationBuilder();
configuration.clustering().stateTransfer().fetchInMemoryState(false).jmxStatistics().enable();
return configuration;
}
}