Repository: ignite Updated Branches: refs/heads/master c7b4201e8 -> df3c4df3d
ignite-7217 Custom thread pools monitoring added Signed-off-by: Andrey Gura <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/df3c4df3 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/df3c4df3 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/df3c4df3 Branch: refs/heads/master Commit: df3c4df3d895c138434a97dbc5a1a580ead5799d Parents: c7b4201 Author: Stanislav Lukyanov <[email protected]> Authored: Thu Dec 28 17:21:47 2017 +0300 Committer: Andrey Gura <[email protected]> Committed: Thu Dec 28 17:27:34 2017 +0300 ---------------------------------------------------------------------- .../apache/ignite/internal/IgniteKernal.java | 499 +++++++++---------- .../apache/ignite/internal/GridMBeansTest.java | 86 ++++ .../internal/GridNodeMetricsLogSelfTest.java | 29 +- .../ignite/testsuites/IgniteBasicTestSuite.java | 2 + 4 files changed, 336 insertions(+), 280 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/df3c4df3/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java index e0c1730..c62d59c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java @@ -37,10 +37,12 @@ import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.ListIterator; import java.util.Map; import java.util.Properties; +import java.util.Set; import java.util.UUID; import java.util.concurrent.ExecutorService; import java.util.concurrent.ThreadPoolExecutor; @@ -88,7 +90,6 @@ import org.apache.ignite.configuration.AtomicConfiguration; import org.apache.ignite.configuration.BinaryConfiguration; import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.configuration.CollectionConfiguration; -import org.apache.ignite.configuration.ConnectorConfiguration; import org.apache.ignite.configuration.DataStorageConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.configuration.MemoryConfiguration; @@ -282,6 +283,10 @@ public class IgniteKernal implements IgniteEx, IgniteMXBean, Externalizable { @GridToStringExclude private GridKernalContextImpl ctx; + /** Helper that registers MBeans */ + @GridToStringExclude + private final MBeansManager mBeansMgr = new MBeansManager(); + /** Configuration. */ private IgniteConfiguration cfg; @@ -293,50 +298,6 @@ public class IgniteKernal implements IgniteEx, IgniteMXBean, Externalizable { /** */ private String igniteInstanceName; - /** */ - @GridToStringExclude - private ObjectName kernalMBean; - - /** */ - @GridToStringExclude - private ObjectName locNodeMBean; - - /** */ - @GridToStringExclude - private ObjectName allNodesMBean; - - /** */ - @GridToStringExclude - private ObjectName pubExecSvcMBean; - - /** */ - @GridToStringExclude - private ObjectName sysExecSvcMBean; - - /** */ - @GridToStringExclude - private ObjectName mgmtExecSvcMBean; - - /** */ - @GridToStringExclude - private ObjectName p2PExecSvcMBean; - - /** */ - @GridToStringExclude - private ObjectName restExecSvcMBean; - - /** */ - @GridToStringExclude - private ObjectName qryExecSvcMBean; - - /** */ - @GridToStringExclude - private ObjectName schemaExecSvcMBean; - - /** */ - @GridToStringExclude - private ObjectName stripedExecSvcMBean; - /** Kernal start timestamp. */ private long startTime = U.currentTimeMillis(); @@ -753,7 +714,7 @@ public class IgniteKernal implements IgniteEx, IgniteMXBean, Externalizable { IgniteStripedThreadPoolExecutor callbackExecSvc, ExecutorService qryExecSvc, ExecutorService schemaExecSvc, - Map<String, ? extends ExecutorService> customExecSvcs, + @Nullable final Map<String, ? extends ExecutorService> customExecSvcs, GridAbsClosure errHnd ) throws IgniteCheckedException @@ -1083,12 +1044,9 @@ public class IgniteKernal implements IgniteEx, IgniteMXBean, Externalizable { reconnectState.waitFirstReconnect(); // Register MBeans. - registerKernalMBean(); - registerClusterMetricsMBeans(); - registerExecutorMBeans(execSvc, sysExecSvc, p2pExecSvc, mgmtExecSvc, restExecSvc, qryExecSvc, - schemaExecSvc); - - registerStripedExecutorMBean(stripedExecSvc); + mBeansMgr.registerAllMBeans(utilityCachePool, execSvc, svcExecSvc, sysExecSvc, stripedExecSvc, p2pExecSvc, + mgmtExecSvc, igfsExecSvc, dataStreamExecSvc, restExecSvc, affExecSvc, idxExecSvc, callbackExecSvc, + qryExecSvc, schemaExecSvc, customExecSvcs); // Lifecycle bean notifications. notifyLifecycleBeans(AFTER_NODE_START); @@ -1227,34 +1185,6 @@ public class IgniteKernal implements IgniteEx, IgniteMXBean, Externalizable { // No-op. } - int pubPoolActiveThreads = 0; - int pubPoolIdleThreads = 0; - int pubPoolQSize = 0; - - if (execSvc instanceof ThreadPoolExecutor) { - ThreadPoolExecutor exec = (ThreadPoolExecutor)execSvc; - - int poolSize = exec.getPoolSize(); - - pubPoolActiveThreads = Math.min(poolSize, exec.getActiveCount()); - pubPoolIdleThreads = poolSize - pubPoolActiveThreads; - pubPoolQSize = exec.getQueue().size(); - } - - int sysPoolActiveThreads = 0; - int sysPoolIdleThreads = 0; - int sysPoolQSize = 0; - - if (sysExecSvc instanceof ThreadPoolExecutor) { - ThreadPoolExecutor exec = (ThreadPoolExecutor)sysExecSvc; - - int poolSize = exec.getPoolSize(); - - sysPoolActiveThreads = Math.min(poolSize, exec.getActiveCount()); - sysPoolIdleThreads = poolSize - sysPoolActiveThreads; - sysPoolQSize = exec.getQueue().size(); - } - int loadedPages = 0; Collection<DataRegion> policies = ctx.cache().context().database().dataRegions(); @@ -1278,11 +1208,20 @@ public class IgniteKernal implements IgniteEx, IgniteMXBean, Externalizable { dblFmt.format(freeHeapPct) + "%, comm=" + dblFmt.format(heapCommInMBytes) + "MB]" + NL + " ^-- Non heap [used=" + dblFmt.format(nonHeapUsedInMBytes) + "MB, free=" + dblFmt.format(freeNonHeapPct) + "%, comm=" + dblFmt.format(nonHeapCommInMBytes) + "MB]" + NL + - " ^-- Public thread pool [active=" + pubPoolActiveThreads + ", idle=" + - pubPoolIdleThreads + ", qSize=" + pubPoolQSize + "]" + NL + - " ^-- System thread pool [active=" + sysPoolActiveThreads + ", idle=" + - sysPoolIdleThreads + ", qSize=" + sysPoolQSize + "]" + NL + - " ^-- Outbound messages queue [size=" + m.getOutboundMessagesQueueSize() + "]"; + " ^-- Outbound messages queue [size=" + m.getOutboundMessagesQueueSize() + "]" + NL + + " ^-- " + createExecutorDescription("Public thread pool", execSvc) + NL + + " ^-- " + createExecutorDescription("System thread pool", sysExecSvc); + + if (customExecSvcs != null) { + StringBuilder customSvcsMsg = new StringBuilder(); + + for (Map.Entry<String, ? extends ExecutorService> entry : customExecSvcs.entrySet()) { + customSvcsMsg.append(NL).append(" ^-- ") + .append(createExecutorDescription(entry.getKey(), entry.getValue())); + } + + msg = msg + customSvcsMsg; + } if (log.isInfoEnabled()) log.info(msg); @@ -1324,6 +1263,30 @@ public class IgniteKernal implements IgniteEx, IgniteMXBean, Externalizable { } /** + * Create description of an executor service for logging. + * + * @param execSvcName name of the service + * @param execSvc service to create a description for + */ + private String createExecutorDescription(String execSvcName, ExecutorService execSvc) { + int poolActiveThreads = 0; + int poolIdleThreads = 0; + int poolQSize = 0; + + if (execSvc instanceof ThreadPoolExecutor) { + ThreadPoolExecutor exec = (ThreadPoolExecutor)execSvc; + + int poolSize = exec.getPoolSize(); + + poolActiveThreads = Math.min(poolSize, exec.getActiveCount()); + poolIdleThreads = poolSize - poolActiveThreads; + poolQSize = exec.getQueue().size(); + } + + return execSvcName + " [active=" + poolActiveThreads + ", idle=" + poolIdleThreads + ", qSize=" + poolQSize + "]"; + } + + /** * Create Hadoop component. * * @return Non-null Hadoop component: workable or no-op. @@ -1677,183 +1640,6 @@ public class IgniteKernal implements IgniteEx, IgniteMXBean, Externalizable { } } - /** @throws IgniteCheckedException If registration failed. */ - private void registerKernalMBean() throws IgniteCheckedException { - if(U.IGNITE_MBEANS_DISABLED) - return; - - try { - kernalMBean = U.registerMBean( - cfg.getMBeanServer(), - cfg.getIgniteInstanceName(), - "Kernal", - getClass().getSimpleName(), - this, - IgniteMXBean.class); - - if (log.isDebugEnabled()) - log.debug("Registered kernal MBean: " + kernalMBean); - } - catch (JMException e) { - kernalMBean = null; - - throw new IgniteCheckedException("Failed to register kernal MBean.", e); - } - } - - /** - * Register instance of ClusterMetricsMBean. - * - * @param mbean MBean instance to register. - * @throws IgniteCheckedException If registration failed. - */ - private ObjectName registerClusterMetricsMBean(ClusterMetricsMXBean mbean) throws IgniteCheckedException { - if(U.IGNITE_MBEANS_DISABLED) - return null; - - ObjectName objName; - - try { - objName = U.registerMBean( - cfg.getMBeanServer(), - cfg.getIgniteInstanceName(), - "Kernal", - mbean.getClass().getSimpleName(), - mbean, - ClusterMetricsMXBean.class); - - if (log.isDebugEnabled()) - log.debug("Registered MBean: " + objName); - - return objName; - } - catch (JMException e) { - throw new IgniteCheckedException("Failed to register MBean: " + mbean.getClass().getSimpleName(), e); - } - } - - /** @throws IgniteCheckedException If registration failed. */ - private void registerClusterMetricsMBeans() throws IgniteCheckedException { - locNodeMBean = registerClusterMetricsMBean(new ClusterLocalNodeMetricsMXBeanImpl(ctx.discovery())); - allNodesMBean = registerClusterMetricsMBean(new ClusterMetricsMXBeanImpl(cluster())); - } - - /** - * @param execSvc Public executor service. - * @param sysExecSvc System executor service. - * @param p2pExecSvc P2P executor service. - * @param mgmtExecSvc Management executor service. - * @param restExecSvc Query executor service. - * @param schemaExecSvc Schema executor service. - * @throws IgniteCheckedException If failed. - */ - private void registerExecutorMBeans(ExecutorService execSvc, - ExecutorService sysExecSvc, - ExecutorService p2pExecSvc, - ExecutorService mgmtExecSvc, - ExecutorService restExecSvc, - ExecutorService qryExecSvc, - ExecutorService schemaExecSvc - ) throws IgniteCheckedException {if(U.IGNITE_MBEANS_DISABLED) - return; - pubExecSvcMBean = registerExecutorMBean(execSvc, "GridExecutionExecutor"); - sysExecSvcMBean = registerExecutorMBean(sysExecSvc, "GridSystemExecutor"); - mgmtExecSvcMBean = registerExecutorMBean(mgmtExecSvc, "GridManagementExecutor"); - p2PExecSvcMBean = registerExecutorMBean(p2pExecSvc, "GridClassLoadingExecutor"); - qryExecSvcMBean = registerExecutorMBean(qryExecSvc, "GridQueryExecutor"); - schemaExecSvcMBean = registerExecutorMBean(schemaExecSvc, "GridSchemaExecutor"); - - ConnectorConfiguration clientCfg = cfg.getConnectorConfiguration(); - - if (clientCfg != null) - restExecSvcMBean = registerExecutorMBean(restExecSvc, "GridRestExecutor"); - } - - /** - * @param exec Executor service to register. - * @param name Property name for executor. - * @return Name for created MBean. - * @throws IgniteCheckedException If registration failed. - */ - private ObjectName registerExecutorMBean(ExecutorService exec, String name) throws IgniteCheckedException { - assert exec != null; - assert !U.IGNITE_MBEANS_DISABLED; - - try { - ObjectName res = U.registerMBean( - cfg.getMBeanServer(), - cfg.getIgniteInstanceName(), - "Thread Pools", - name, - new ThreadPoolMXBeanAdapter(exec), - ThreadPoolMXBean.class); - - if (log.isDebugEnabled()) - log.debug("Registered executor service MBean: " + res); - - return res; - } - catch (JMException e) { - throw new IgniteCheckedException("Failed to register executor service MBean [name=" + name + - ", exec=" + exec + ']', e); - } - } - - /** - * @param stripedExecSvc Executor service. - * @throws IgniteCheckedException If registration failed. - */ - private void registerStripedExecutorMBean(StripedExecutor stripedExecSvc) throws IgniteCheckedException { - if (stripedExecSvc == null || U.IGNITE_MBEANS_DISABLED) - return; - - String name = "StripedExecutor"; - - try { - stripedExecSvcMBean = U.registerMBean( - cfg.getMBeanServer(), - cfg.getIgniteInstanceName(), - "Thread Pools", - name, - new StripedExecutorMXBeanAdapter(stripedExecSvc), - StripedExecutorMXBean.class); - - if (log.isDebugEnabled()) - log.debug("Registered executor service MBean: " + stripedExecSvcMBean); - } - catch (JMException e) { - throw new IgniteCheckedException("Failed to register executor service MBean [name=" - + name + ", exec=" + stripedExecSvc + ']', e); - } - } - - /** - * Unregisters given mbean. - * - * @param mbean MBean to unregister. - * @return {@code True} if successfully unregistered, {@code false} otherwise. - */ - private boolean unregisterMBean(@Nullable ObjectName mbean) { - if (mbean == null) - return true; - - assert !U.IGNITE_MBEANS_DISABLED; - - try { - cfg.getMBeanServer().unregisterMBean(mbean); - - if (log.isDebugEnabled()) - log.debug("Unregistered MBean: " + mbean); - - return true; - } - catch (JMException e) { - U.error(log, "Failed to unregister MBean.", e); - - return false; - } - } - /** * @param mgr Manager to start. * @throws IgniteCheckedException Throw in case of any errors. @@ -2292,20 +2078,8 @@ public class IgniteKernal implements IgniteEx, IgniteMXBean, Externalizable { cache.blockGateways(); // Unregister MBeans. - if (!( - unregisterMBean(pubExecSvcMBean) & - unregisterMBean(sysExecSvcMBean) & - unregisterMBean(mgmtExecSvcMBean) & - unregisterMBean(p2PExecSvcMBean) & - unregisterMBean(kernalMBean) & - unregisterMBean(locNodeMBean) & - unregisterMBean(allNodesMBean) & - unregisterMBean(restExecSvcMBean) & - unregisterMBean(qryExecSvcMBean) & - unregisterMBean(schemaExecSvcMBean) & - unregisterMBean(stripedExecSvcMBean) - )) - errOnStop = false; + if (!mBeansMgr.unregisterAllMBeans()) + errOnStop = true; // Stop components in reverse order. for (ListIterator<GridComponent> it = comps.listIterator(comps.size()); it.hasPrevious(); ) { @@ -4193,6 +3967,179 @@ public class IgniteKernal implements IgniteEx, IgniteMXBean, Externalizable { } } + /** + * Class that registers and unregisters MBeans for kernal. + */ + private class MBeansManager { + /** MBean names stored to be unregistered later. */ + private final Set<ObjectName> mBeanNames = new HashSet<>(); + + /** + * Registers all kernal MBeans (for kernal, metrics, thread pools). + * + * @param utilityCachePool Utility cache pool + * @param execSvc Executor service + * @param sysExecSvc System executor service + * @param stripedExecSvc Striped executor + * @param p2pExecSvc P2P executor service + * @param mgmtExecSvc Management executor service + * @param igfsExecSvc IGFS executor service + * @param dataStreamExecSvc data stream executor service + * @param restExecSvc Reset executor service + * @param affExecSvc Affinity executor service + * @param idxExecSvc Indexing executor service + * @param callbackExecSvc Callback executor service + * @param qryExecSvc Query executor service + * @param schemaExecSvc Schema executor service + * @param customExecSvcs Custom named executors + * + * @throws IgniteCheckedException if fails to register any of the MBeans + */ + private void registerAllMBeans( + ExecutorService utilityCachePool, + final ExecutorService execSvc, + final ExecutorService svcExecSvc, + final ExecutorService sysExecSvc, + final StripedExecutor stripedExecSvc, + ExecutorService p2pExecSvc, + ExecutorService mgmtExecSvc, + ExecutorService igfsExecSvc, + StripedExecutor dataStreamExecSvc, + ExecutorService restExecSvc, + ExecutorService affExecSvc, + @Nullable ExecutorService idxExecSvc, + IgniteStripedThreadPoolExecutor callbackExecSvc, + ExecutorService qryExecSvc, + ExecutorService schemaExecSvc, + @Nullable final Map<String, ? extends ExecutorService> customExecSvcs + ) throws IgniteCheckedException { + if (U.IGNITE_MBEANS_DISABLED) + return; + + // Kernal + registerMBean("Kernal", IgniteKernal.class.getSimpleName(), IgniteKernal.this, IgniteMXBean.class); + + // Metrics + ClusterMetricsMXBean locMetricsBean = new ClusterLocalNodeMetricsMXBeanImpl(ctx.discovery()); + registerMBean("Kernal", locMetricsBean.getClass().getSimpleName(), locMetricsBean, ClusterMetricsMXBean.class); + ClusterMetricsMXBean metricsBean = new ClusterMetricsMXBeanImpl(cluster()); + registerMBean("Kernal", metricsBean.getClass().getSimpleName(), metricsBean, ClusterMetricsMXBean.class); + + // Executors + registerExecutorMBean("GridUtilityCacheExecutor", utilityCachePool); + registerExecutorMBean("GridExecutionExecutor", execSvc); + registerExecutorMBean("GridServicesExecutor", svcExecSvc); + registerExecutorMBean("GridSystemExecutor", sysExecSvc); + registerExecutorMBean("GridClassLoadingExecutor", p2pExecSvc); + registerExecutorMBean("GridManagementExecutor", mgmtExecSvc); + registerExecutorMBean("GridIgfsExecutor", igfsExecSvc); + registerExecutorMBean("GridDataStreamExecutor", dataStreamExecSvc); + registerExecutorMBean("GridAffinityExecutor", affExecSvc); + registerExecutorMBean("GridCallbackExecutor", callbackExecSvc); + registerExecutorMBean("GridQueryExecutor", qryExecSvc); + registerExecutorMBean("GridSchemaExecutor", schemaExecSvc); + + if (idxExecSvc != null) + registerExecutorMBean("GridIndexingExecutor", idxExecSvc); + + if (cfg.getConnectorConfiguration() != null) + registerExecutorMBean("GridRestExecutor", restExecSvc); + + if (stripedExecSvc != null) { + // striped executor uses a custom adapter + registerMBean("Thread Pools", + "StripedExecutor", + new StripedExecutorMXBeanAdapter(stripedExecSvc), + StripedExecutorMXBean.class); + } + + if (customExecSvcs != null) { + for (Map.Entry<String, ? extends ExecutorService> entry : customExecSvcs.entrySet()) + registerExecutorMBean(entry.getKey(), entry.getValue()); + } + } + + /** + * Registers a {@link ThreadPoolMXBean} for an executor. + * + * @param name name of the bean to register + * @param exec executor to register a bean for + * + * @throws IgniteCheckedException if registration fails. + */ + private void registerExecutorMBean(String name, ExecutorService exec) throws IgniteCheckedException { + registerMBean("Thread Pools", name, new ThreadPoolMXBeanAdapter(exec), ThreadPoolMXBean.class); + } + + /** + * Register an Ignite MBean. + * + * @param grp bean group name + * @param name bean name + * @param impl bean implementation + * @param itf bean interface + * @param <T> bean type + * + * @throws IgniteCheckedException if registration fails + */ + private <T> void registerMBean(String grp, String name, T impl, Class<T> itf) throws IgniteCheckedException { + assert !U.IGNITE_MBEANS_DISABLED; + + try { + ObjectName objName = U.registerMBean( + cfg.getMBeanServer(), + cfg.getIgniteInstanceName(), + grp, name, impl, itf); + + if (log.isDebugEnabled()) + log.debug("Registered MBean: " + objName); + + mBeanNames.add(objName); + } + catch (JMException e) { + throw new IgniteCheckedException("Failed to register MBean " + name, e); + } + } + + /** + * Unregisters all previously registered MBeans. + * + * @return {@code true} if all mbeans were unregistered successfully; {@code false} otherwise. + */ + private boolean unregisterAllMBeans() { + boolean success = true; + + for (ObjectName name : mBeanNames) + success = success && unregisterMBean(name); + + return success; + } + + /** + * Unregisters given MBean. + * + * @param mbean MBean to unregister. + * @return {@code true} if successfully unregistered, {@code false} otherwise. + */ + private boolean unregisterMBean(ObjectName mbean) { + assert !U.IGNITE_MBEANS_DISABLED; + + try { + cfg.getMBeanServer().unregisterMBean(mbean); + + if (log.isDebugEnabled()) + log.debug("Unregistered MBean: " + mbean); + + return true; + } + catch (JMException e) { + U.error(log, "Failed to unregister MBean.", e); + + return false; + } + } + } + /** {@inheritDoc} */ @Override public void runIoTest( long warmup, http://git-wip-us.apache.org/repos/asf/ignite/blob/df3c4df3/modules/core/src/test/java/org/apache/ignite/internal/GridMBeansTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/GridMBeansTest.java b/modules/core/src/test/java/org/apache/ignite/internal/GridMBeansTest.java new file mode 100644 index 0000000..1c39982 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/GridMBeansTest.java @@ -0,0 +1,86 @@ +/* + * 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.ignite.internal; + +import org.apache.ignite.configuration.ExecutorConfiguration; +import org.apache.ignite.configuration.IgniteConfiguration; +import org.apache.ignite.internal.util.IgniteUtils; +import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; + +import javax.management.ObjectName; + +/** + * Tests for the standard JMX beans registered by the kernal. + */ +public class GridMBeansTest extends GridCommonAbstractTest { + /** Executor name for setExecutorConfiguration */ + private static final String CUSTOM_EXECUTOR_0 = "Custom executor 0"; + + /** Executor name for setExecutorConfiguration */ + private static final String CUSTOM_EXECUTOR_1 = "Custom executor 1"; + + /** Create test and auto-start the grid */ + public GridMBeansTest() { + super(true); + } + + /** + * {@inheritDoc} + * + * This implementation registers adds custom executors to the configuration. + */ + @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { + IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName); + + cfg.setExecutorConfiguration(new ExecutorConfiguration(CUSTOM_EXECUTOR_0), + new ExecutorConfiguration(CUSTOM_EXECUTOR_1)); + + return cfg; + } + + /** Check that kernal bean is available */ + public void testKernalBeans() throws Exception { + checkBean("Kernal", "IgniteKernal", "InstanceName", grid().name()); + checkBean("Kernal", "ClusterMetricsMXBeanImpl", "TotalServerNodes", 1); + checkBean("Kernal", "ClusterMetricsMXBeanImpl", "TotalServerNodes", 1); + } + + /** Check that kernal bean is available */ + public void testExecutorBeans() throws Exception { + // standard executors + checkBean("Thread Pools", "GridExecutionExecutor", "Terminated", false); + checkBean("Thread Pools", "GridSystemExecutor", "Terminated", false); + checkBean("Thread Pools", "GridManagementExecutor", "Terminated", false); + checkBean("Thread Pools", "GridClassLoadingExecutor", "Terminated", false); + checkBean("Thread Pools", "GridQueryExecutor", "Terminated", false); + checkBean("Thread Pools", "GridSchemaExecutor", "Terminated", false); + checkBean("Thread Pools", "StripedExecutor", "Terminated", false); + + // custom executors + checkBean("Thread Pools", CUSTOM_EXECUTOR_0, "Terminated", false); + checkBean("Thread Pools", CUSTOM_EXECUTOR_1, "Terminated", false); + } + + /** Checks that a bean with the specified group and name is available and has the expected attribute */ + private void checkBean(String grp, String name, String attributeName, Object expAttributeVal) throws Exception { + ObjectName mBeanName = IgniteUtils.makeMBeanName(grid().name(), grp, name); + Object attributeVal = grid().configuration().getMBeanServer().getAttribute(mBeanName, attributeName); + + assertEquals(expAttributeVal, attributeVal); + } +} http://git-wip-us.apache.org/repos/asf/ignite/blob/df3c4df3/modules/core/src/test/java/org/apache/ignite/internal/GridNodeMetricsLogSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/GridNodeMetricsLogSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/GridNodeMetricsLogSelfTest.java index b6114d1..9edebd5 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/GridNodeMetricsLogSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/GridNodeMetricsLogSelfTest.java @@ -21,6 +21,7 @@ package org.apache.ignite.internal; import java.io.StringWriter; import org.apache.ignite.Ignite; import org.apache.ignite.IgniteCache; +import org.apache.ignite.configuration.ExecutorConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; import org.apache.ignite.testframework.junits.common.GridCommonTest; @@ -35,6 +36,12 @@ import org.apache.log4j.WriterAppender; @SuppressWarnings({"ProhibitedExceptionDeclared"}) @GridCommonTest(group = "Kernal") public class GridNodeMetricsLogSelfTest extends GridCommonAbstractTest { + /** Executor name for setExecutorConfiguration */ + private static final String CUSTOM_EXECUTOR_0 = "Custom executor 0"; + + /** Executor name for setExecutorConfiguration */ + private static final String CUSTOM_EXECUTOR_1 = "Custom executor 1"; + /** {@inheritDoc} */ @SuppressWarnings({"unchecked"}) @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { @@ -42,6 +49,9 @@ public class GridNodeMetricsLogSelfTest extends GridCommonAbstractTest { cfg.setMetricsLogFrequency(1000); + cfg.setExecutorConfiguration(new ExecutorConfiguration(CUSTOM_EXECUTOR_0), + new ExecutorConfiguration(CUSTOM_EXECUTOR_1)); + return cfg; } @@ -85,9 +95,20 @@ public class GridNodeMetricsLogSelfTest extends GridCommonAbstractTest { Logger.getRootLogger().removeAppender(app); - assert fullLog.contains("Metrics for local node"); - assert fullLog.contains("uptime="); - assert fullLog.contains("Non heap"); - assert fullLog.contains("Outbound messages queue"); + String msg = "Metrics are missing in the log or have an unexpected format"; + + // don't check the format strictly, but check that all expected metrics are present + assertTrue(msg, fullLog.contains("Metrics for local node (to disable set 'metricsLogFrequency' to 0)")); + assertTrue(msg, fullLog.matches("(?s).*Node \\[id=.*, name=.*, uptime=.*].*")); + assertTrue(msg, fullLog.matches("(?s).*H/N/C \\[hosts=.*, nodes=.*, CPUs=.*].*")); + assertTrue(msg, fullLog.matches("(?s).*CPU \\[cur=.*, avg=.*, GC=.*].*")); + assertTrue(msg, fullLog.matches("(?s).*PageMemory \\[pages=.*].*")); + assertTrue(msg, fullLog.matches("(?s).*Heap \\[used=.*, free=.*, comm=.*].*")); + assertTrue(msg, fullLog.matches("(?s).*Non heap \\[used=.*, free=.*, comm=.*].*")); + assertTrue(msg, fullLog.matches("(?s).*Outbound messages queue \\[size=.*].*")); + assertTrue(msg, fullLog.matches("(?s).*Public thread pool \\[active=.*, idle=.*, qSize=.*].*")); + assertTrue(msg, fullLog.matches("(?s).*System thread pool \\[active=.*, idle=.*, qSize=.*].*")); + assertTrue(msg, fullLog.matches("(?s).*" + CUSTOM_EXECUTOR_0 + " \\[active=.*, idle=.*, qSize=.*].*")); + assertTrue(msg, fullLog.matches("(?s).*" + CUSTOM_EXECUTOR_1 + " \\[active=.*, idle=.*, qSize=.*].*")); } } http://git-wip-us.apache.org/repos/asf/ignite/blob/df3c4df3/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite.java index 7cdc670..2cc2047 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite.java @@ -25,6 +25,7 @@ import org.apache.ignite.internal.ClusterGroupSelfTest; import org.apache.ignite.internal.GridFailFastNodeFailureDetectionSelfTest; import org.apache.ignite.internal.GridLifecycleAwareSelfTest; import org.apache.ignite.internal.GridLifecycleBeanSelfTest; +import org.apache.ignite.internal.GridMBeansTest; import org.apache.ignite.internal.GridNodeMetricsLogSelfTest; import org.apache.ignite.internal.GridProjectionForCachesSelfTest; import org.apache.ignite.internal.GridReduceSelfTest; @@ -149,6 +150,7 @@ public class IgniteBasicTestSuite extends TestSuite { suite.addTestSuite(IgniteMarshallerCacheConcurrentReadWriteTest.class); suite.addTestSuite(GridNodeMetricsLogSelfTest.class); suite.addTestSuite(GridLocalIgniteSerializationTest.class); + suite.addTestSuite(GridMBeansTest.class); suite.addTestSuite(IgniteExceptionInNioWorkerSelfTest.class); suite.addTestSuite(IgniteLocalNodeMapBeforeStartTest.class);
