Add JMX monitoring to cluster management

This commit is contained in:
Kelven Yang 2011-03-07 18:40:12 -08:00
parent 35275c1615
commit d0892a964d
4 changed files with 83 additions and 8 deletions

View File

@ -69,7 +69,10 @@
<target name="debug-suspend">
<java jar="${tomcat.home}/bin/bootstrap.jar" fork="true">
<jvmarg value="-Dcatalina.home=${tomcat.home}"/>
<jvmarg value="-Xdebug"/>
<jvmarg value="-Dcom.sun.management.jmxremote.port=20400"/>
<jvmarg value="-Dcom.sun.management.jmxremote.authenticate=false"/>
<jvmarg value="-Dcom.sun.management.jmxremote.ssl=false"/>
<jvmarg value="-Xdebug"/>
<jvmarg value="-Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=y"/>
<jvmarg value="-ea"/>
<jvmarg value="-Xms256m"/>
@ -87,6 +90,9 @@
<echo message="Start Tomcat" />
<java dir="${tomcat.home}/bin/" jar="${tomcat.home}/bin/bootstrap.jar" fork="true">
<jvmarg value="${assertion}"/>
<jvmarg value="-Dcom.sun.management.jmxremote.port=20400"/>
<jvmarg value="-Dcom.sun.management.jmxremote.authenticate=false"/>
<jvmarg value="-Dcom.sun.management.jmxremote.ssl=false"/>
<jvmarg value="-Xms256m"/>
<jvmarg value="-Xmx384m"/>
<jvmarg value="-ea"/>
@ -97,7 +103,10 @@
<target name="debug-tomcat">
<java jar="${tomcat.home}/bin/bootstrap.jar" fork="true">
<jvmarg value="-Dcatalina.home=${tomcat.home}"/>
<jvmarg value="-Xdebug"/>
<jvmarg value="-Dcom.sun.management.jmxremote.port=20400"/>
<jvmarg value="-Dcom.sun.management.jmxremote.authenticate=false"/>
<jvmarg value="-Dcom.sun.management.jmxremote.ssl=false"/>
<jvmarg value="-Xdebug"/>
<jvmarg value="${debug.jvmarg}"/>
<jvmarg value="-ea"/>
<jvmarg value="-Xms256m"/>

View File

@ -47,6 +47,7 @@ import com.cloud.utils.db.DB;
import com.cloud.utils.db.Transaction;
import com.cloud.utils.events.SubscriptionMgr;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.mgmt.JmxUtil;
import com.cloud.utils.net.MacAddress;
import com.cloud.utils.net.NetUtils;
import com.google.gson.Gson;
@ -566,6 +567,12 @@ public class ClusterManagerImpl implements ClusterManager {
for(ManagementServerHostVO mshost : removedNodeList) {
activePeers.remove(mshost.getId());
try {
JmxUtil.unregisterMBean("ClusterManager", "Node " + mshost.getId());
} catch(Exception e) {
s_logger.warn("Unable to deregiester cluster node from JMX monitoring due to exception " + e.toString());
}
}
List<ManagementServerHostVO> newNodeList = new ArrayList<ManagementServerHostVO>();
@ -577,6 +584,12 @@ public class ClusterManagerImpl implements ClusterManager {
s_logger.debug("Detected management node joined, id:" + mshost.getId() + ", nodeIP:" + mshost.getServiceIP());
}
newNodeList.add(mshost);
try {
JmxUtil.registerMBean("ClusterManager", "Node " + mshost.getId(), new ClusterManagerMBeanImpl(mshost));
} catch(Exception e) {
s_logger.warn("Unable to regiester cluster node into JMX monitoring due to exception " + e.toString());
}
}
}
@ -764,7 +777,7 @@ public class ClusterManagerImpl implements ClusterManager {
if(_currentServiceAdapter == null) {
throw new ConfigurationException("Unable to set current cluster service adapter");
}
if(s_logger.isInfoEnabled()) {
s_logger.info("Cluster manager is configured.");
}

View File

@ -106,9 +106,9 @@ import com.cloud.host.dao.HostDao;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.network.IPAddressVO;
import com.cloud.network.Network;
import com.cloud.network.Network.GuestIpType;
import com.cloud.network.NetworkManager;
import com.cloud.network.NetworkVO;
import com.cloud.network.Network.GuestIpType;
import com.cloud.network.Networks.TrafficType;
import com.cloud.network.dao.FirewallRulesDao;
import com.cloud.network.dao.IPAddressDao;
@ -2244,9 +2244,13 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager
public boolean finalizeVirtualMachineProfile(VirtualMachineProfile<UserVmVO> profile, DeployDestination dest, ReservationContext context) {
UserVmVO vm = profile.getVirtualMachine();
Account owner = _accountDao.findById(vm.getAccountId());
if (owner == null) {
throw new PermissionDeniedException("The owner of " + vm + " does not exist: " + vm.getAccountId());
}
if (owner == null || owner.getState() == Account.State.disabled) {
throw new PermissionDeniedException("The owner of " + vm + " either does not exist or is disabled: " + vm.getAccountId());
if (owner.getState() == Account.State.disabled) {
throw new PermissionDeniedException("The owner of " + vm + " is disabled: " + vm.getAccountId());
}
VirtualMachineTemplate template = profile.getTemplate();

View File

@ -17,9 +17,11 @@
*/
package com.cloud.utils.mgmt;
import java.lang.management.ManagementFactory;
import java.util.ArrayList;
import javax.management.InstanceAlreadyExistsException;
import javax.management.InstanceNotFoundException;
import javax.management.MBeanRegistrationException;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
@ -28,12 +30,59 @@ import javax.management.NotCompliantMBeanException;
import javax.management.ObjectName;
public class JmxUtil {
public static void registerMBean(ManagementBean mbean) throws MalformedObjectNameException, InstanceAlreadyExistsException, MBeanRegistrationException, NotCompliantMBeanException {
public static ObjectName registerMBean(ManagementBean mbean)
throws MalformedObjectNameException, InstanceAlreadyExistsException, MBeanRegistrationException, NotCompliantMBeanException {
return registerMBean(mbean.getName(), null, mbean);
}
public static ObjectName registerMBean(String objTypeName, String objInstanceName, Object mbean)
throws MalformedObjectNameException, InstanceAlreadyExistsException, MBeanRegistrationException, NotCompliantMBeanException {
String name = "com.cloud:type=" + objTypeName;
if(objInstanceName != null && !objInstanceName.isEmpty())
name += ", name=" + objInstanceName;
ObjectName objectName = new ObjectName(name);
ArrayList<MBeanServer> server = MBeanServerFactory.findMBeanServer(null);
if (server.size() > 0) {
MBeanServer mBeanServer = server.get(0);
ObjectName objectName = new ObjectName("com.cloud: type=" + mbean.getName());
mBeanServer.registerMBean(mbean, objectName);
return objectName;
} else {
MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
mBeanServer.registerMBean(mbean, objectName);
return objectName;
}
}
public static void unregisterMBean(String objTypeName, String objInstanceName)
throws MalformedObjectNameException, MBeanRegistrationException, InstanceNotFoundException {
ObjectName name = composeMBeanName(objTypeName, objInstanceName);
unregisterMBean(name);
}
public static void unregisterMBean(ObjectName name)
throws MalformedObjectNameException, MBeanRegistrationException, InstanceNotFoundException {
ArrayList<MBeanServer> server = MBeanServerFactory.findMBeanServer(null);
if (server.size() > 0) {
MBeanServer mBeanServer = server.get(0);
mBeanServer.unregisterMBean(name);
} else {
MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
mBeanServer.unregisterMBean(name);
}
}
private static ObjectName composeMBeanName(String objTypeName, String objInstanceName)
throws MalformedObjectNameException {
String name = "com.cloud:type=" + objTypeName;
if(objInstanceName != null && !objInstanceName.isEmpty())
name += ", name=" + objInstanceName;
return new ObjectName(name);
}
}