blob: 51dbe96ad3ddc21333528f2dc6c65c776a611ba0 [file] [log] [blame]
/*
* 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.managers;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import javax.management.JMException;
import javax.management.ObjectName;
import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.IgniteException;
import org.apache.ignite.IgniteLogger;
import org.apache.ignite.internal.ClusterLocalNodeMetricsMXBeanImpl;
import org.apache.ignite.internal.ClusterMetricsMXBeanImpl;
import org.apache.ignite.internal.ComputeMXBeanImpl;
import org.apache.ignite.internal.GridKernalContextImpl;
import org.apache.ignite.internal.IgniteKernal;
import org.apache.ignite.internal.IgniteMXBeanImpl;
import org.apache.ignite.internal.QueryMXBeanImpl;
import org.apache.ignite.internal.ServiceMXBeanImpl;
import org.apache.ignite.internal.TransactionMetricsMxBeanImpl;
import org.apache.ignite.internal.TransactionsMXBeanImpl;
import org.apache.ignite.internal.management.api.Command;
import org.apache.ignite.internal.management.api.CommandMBean;
import org.apache.ignite.internal.management.api.CommandsRegistry;
import org.apache.ignite.internal.managers.encryption.EncryptionMXBeanImpl;
import org.apache.ignite.internal.processors.cache.persistence.DataStorageMXBeanImpl;
import org.apache.ignite.internal.processors.cache.persistence.defragmentation.DefragmentationMXBeanImpl;
import org.apache.ignite.internal.processors.cache.persistence.snapshot.SnapshotMXBeanImpl;
import org.apache.ignite.internal.processors.cache.warmup.WarmUpMXBeanImpl;
import org.apache.ignite.internal.processors.cluster.BaselineAutoAdjustMXBeanImpl;
import org.apache.ignite.internal.processors.metric.MetricsMxBeanImpl;
import org.apache.ignite.internal.processors.performancestatistics.PerformanceStatisticsMBeanImpl;
import org.apache.ignite.internal.processors.query.running.SqlQueryMXBean;
import org.apache.ignite.internal.processors.query.running.SqlQueryMXBeanImpl;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.internal.worker.FailureHandlingMxBeanImpl;
import org.apache.ignite.internal.worker.WorkersControlMXBeanImpl;
import org.apache.ignite.mxbean.BaselineAutoAdjustMXBean;
import org.apache.ignite.mxbean.ClusterMetricsMXBean;
import org.apache.ignite.mxbean.ComputeMXBean;
import org.apache.ignite.mxbean.DataStorageMXBean;
import org.apache.ignite.mxbean.DefragmentationMXBean;
import org.apache.ignite.mxbean.EncryptionMXBean;
import org.apache.ignite.mxbean.FailureHandlingMxBean;
import org.apache.ignite.mxbean.IgniteMXBean;
import org.apache.ignite.mxbean.MetricsMxBean;
import org.apache.ignite.mxbean.PerformanceStatisticsMBean;
import org.apache.ignite.mxbean.QueryMXBean;
import org.apache.ignite.mxbean.ServiceMXBean;
import org.apache.ignite.mxbean.SnapshotMXBean;
import org.apache.ignite.mxbean.TransactionMetricsMxBean;
import org.apache.ignite.mxbean.TransactionsMXBean;
import org.apache.ignite.mxbean.WarmUpMXBean;
import org.apache.ignite.mxbean.WorkersControlMXBean;
import static org.apache.ignite.internal.management.api.CommandUtils.executable;
import static org.apache.ignite.internal.util.IgniteUtils.makeMBeanName;
/**
* Class that registers and unregisters MBeans for kernal.
*/
public class IgniteMBeansManager {
/** Ignite kernal */
private final IgniteKernal kernal;
/** Ignite kernal context. */
private final GridKernalContextImpl ctx;
/** Logger. */
private final IgniteLogger log;
/** MBean names stored to be unregistered later. */
private final Set<ObjectName> mBeanNames = new HashSet<>();
/**
* @param kernal Grid kernal.
*/
public IgniteMBeansManager(IgniteKernal kernal) {
this.kernal = kernal;
ctx = (GridKernalContextImpl)kernal.context();
log = ctx.log(IgniteMBeansManager.class);
}
/**
* Registers kernal MBeans (for kernal, metrics, thread pools) after node start.
*
* @throws IgniteCheckedException if fails to register any of the MBeans.
*/
public void registerMBeansAfterNodeStarted() throws IgniteCheckedException {
if (U.IGNITE_MBEANS_DISABLED)
return;
// Kernal
IgniteMXBean kernalMXBean = new IgniteMXBeanImpl(kernal);
registerMBean("Kernal", IgniteKernal.class.getSimpleName(), kernalMXBean, IgniteMXBean.class);
// Metrics
ClusterMetricsMXBean locMetricsBean = new ClusterLocalNodeMetricsMXBeanImpl(ctx.discovery());
registerMBean("Kernal", locMetricsBean.getClass().getSimpleName(), locMetricsBean, ClusterMetricsMXBean.class);
ClusterMetricsMXBean metricsBean = new ClusterMetricsMXBeanImpl(kernal.cluster(), ctx);
registerMBean("Kernal", metricsBean.getClass().getSimpleName(), metricsBean, ClusterMetricsMXBean.class);
// Transaction metrics
TransactionMetricsMxBean txMetricsMXBean = new TransactionMetricsMxBeanImpl(ctx.cache().transactions().metrics());
registerMBean("TransactionMetrics", txMetricsMXBean.getClass().getSimpleName(), txMetricsMXBean, TransactionMetricsMxBean.class);
// Transactions
TransactionsMXBean txMXBean = new TransactionsMXBeanImpl(ctx);
registerMBean("Transactions", txMXBean.getClass().getSimpleName(), txMXBean, TransactionsMXBean.class);
// Queries management
QueryMXBean qryMXBean = new QueryMXBeanImpl(ctx);
registerMBean("Query", qryMXBean.getClass().getSimpleName(), qryMXBean, QueryMXBean.class);
// Compute task management
ComputeMXBean computeMXBean = new ComputeMXBeanImpl(ctx);
registerMBean("Compute", computeMXBean.getClass().getSimpleName(), computeMXBean, ComputeMXBean.class);
// Service management
ServiceMXBean srvcMXBean = new ServiceMXBeanImpl(ctx);
registerMBean("Service", srvcMXBean.getClass().getSimpleName(), srvcMXBean, ServiceMXBean.class);
// Data storage
DataStorageMXBean dataStorageMXBean = new DataStorageMXBeanImpl(ctx);
registerMBean("DataStorage", dataStorageMXBean.getClass().getSimpleName(), dataStorageMXBean, DataStorageMXBean.class);
// Baseline configuration
BaselineAutoAdjustMXBean baselineAutoAdjustMXBean = new BaselineAutoAdjustMXBeanImpl(ctx);
registerMBean("Baseline", baselineAutoAdjustMXBean.getClass().getSimpleName(), baselineAutoAdjustMXBean,
BaselineAutoAdjustMXBean.class);
// Encryption
EncryptionMXBean encryptionMXBean = new EncryptionMXBeanImpl(ctx);
registerMBean("Encryption", encryptionMXBean.getClass().getSimpleName(), encryptionMXBean,
EncryptionMXBean.class);
// Snapshot.
SnapshotMXBean snpMXBean = new SnapshotMXBeanImpl(ctx);
registerMBean("Snapshot", snpMXBean.getClass().getSimpleName(), snpMXBean, SnapshotMXBean.class);
// Defragmentation.
DefragmentationMXBean defragMXBean = new DefragmentationMXBeanImpl(ctx);
registerMBean("Defragmentation", defragMXBean.getClass().getSimpleName(), defragMXBean, DefragmentationMXBean.class);
// Metrics configuration
MetricsMxBean metricsMxBean = new MetricsMxBeanImpl(ctx.metric(), log);
registerMBean("Metrics", metricsMxBean.getClass().getSimpleName(), metricsMxBean, MetricsMxBean.class);
if (U.IGNITE_TEST_FEATURES_ENABLED) {
WorkersControlMXBean workerCtrlMXBean = new WorkersControlMXBeanImpl(ctx.workersRegistry());
registerMBean("Kernal", workerCtrlMXBean.getClass().getSimpleName(),
workerCtrlMXBean, WorkersControlMXBean.class);
}
FailureHandlingMxBean blockOpCtrlMXBean = new FailureHandlingMxBeanImpl(ctx.workersRegistry(),
ctx.cache().context().database());
registerMBean("Kernal", blockOpCtrlMXBean.getClass().getSimpleName(), blockOpCtrlMXBean,
FailureHandlingMxBean.class);
if (ctx.query().moduleEnabled()) {
SqlQueryMXBean sqlQryMXBean = new SqlQueryMXBeanImpl(ctx);
registerMBean("SQL Query", sqlQryMXBean.getClass().getSimpleName(), sqlQryMXBean, SqlQueryMXBean.class);
}
PerformanceStatisticsMBeanImpl performanceStatMbean = new PerformanceStatisticsMBeanImpl(ctx);
registerMBean("PerformanceStatistics", performanceStatMbean.getClass().getSimpleName(), performanceStatMbean,
PerformanceStatisticsMBean.class);
registerManagementBeans();
}
/**
* Registers kernal MBeans during init phase.
*
* @throws IgniteCheckedException if fails to register any of the MBeans.
*/
public void registerMBeansDuringInitPhase() throws IgniteCheckedException {
if (U.IGNITE_MBEANS_DISABLED)
return;
// Warm-up.
registerMBean("WarmUp",
WarmUpMXBeanImpl.class.getSimpleName(),
new WarmUpMXBeanImpl(ctx.cache()),
WarmUpMXBean.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
*/
public <T> void registerMBean(String grp, String name, T impl, Class<T> itf) throws IgniteCheckedException {
assert !U.IGNITE_MBEANS_DISABLED;
try {
ObjectName objName = U.registerMBean(
ctx.config().getMBeanServer(),
ctx.config().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);
}
}
/** Registers all management API beans. */
private void registerManagementBeans() {
ctx.grid().commandsRegistry().commands().forEachRemaining(cmd -> register(cmd.getKey(), new LinkedList<>(), cmd.getValue()));
}
/** Recursively register management commands. */
public void register(String name, List<String> parents, Command<?, ?> cmd) {
if (cmd instanceof CommandsRegistry) {
parents.add(name);
((CommandsRegistry<?, ?>)cmd).commands()
.forEachRemaining(cmd0 -> register(cmd0.getKey(), parents, cmd0.getValue()));
parents.remove(parents.size() - 1);
if (!executable(cmd))
return;
}
try {
ObjectName objName = U.registerMBean(
ctx.config().getMBeanServer(),
makeMBeanName(ctx.config().getIgniteInstanceName(), "management", parents, name),
new CommandMBean<>(ctx.grid(), cmd),
CommandMBean.class
);
mBeanNames.add(objName);
if (log.isDebugEnabled())
log.debug("Registered MBean: " + objName);
}
catch (JMException e) {
throw new IgniteException("Failed to register MBean " + cmd.getClass().getSimpleName(), e);
}
}
/**
* Unregisters all previously registered MBeans.
*
* @return {@code true} if all mbeans were unregistered successfully; {@code false} otherwise.
*/
public 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 {
ctx.config().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;
}
}
}