Skip to content

Commit d0892a9

Browse files
author
Kelven Yang
committed
Add JMX monitoring to cluster management
1 parent 35275c1 commit d0892a9

4 files changed

Lines changed: 83 additions & 8 deletions

File tree

build/developer.xml

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,10 @@
6969
<target name="debug-suspend">
7070
<java jar="${tomcat.home}/bin/bootstrap.jar" fork="true">
7171
<jvmarg value="-Dcatalina.home=${tomcat.home}"/>
72-
<jvmarg value="-Xdebug"/>
72+
<jvmarg value="-Dcom.sun.management.jmxremote.port=20400"/>
73+
<jvmarg value="-Dcom.sun.management.jmxremote.authenticate=false"/>
74+
<jvmarg value="-Dcom.sun.management.jmxremote.ssl=false"/>
75+
<jvmarg value="-Xdebug"/>
7376
<jvmarg value="-Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=y"/>
7477
<jvmarg value="-ea"/>
7578
<jvmarg value="-Xms256m"/>
@@ -87,6 +90,9 @@
8790
<echo message="Start Tomcat" />
8891
<java dir="${tomcat.home}/bin/" jar="${tomcat.home}/bin/bootstrap.jar" fork="true">
8992
<jvmarg value="${assertion}"/>
93+
<jvmarg value="-Dcom.sun.management.jmxremote.port=20400"/>
94+
<jvmarg value="-Dcom.sun.management.jmxremote.authenticate=false"/>
95+
<jvmarg value="-Dcom.sun.management.jmxremote.ssl=false"/>
9096
<jvmarg value="-Xms256m"/>
9197
<jvmarg value="-Xmx384m"/>
9298
<jvmarg value="-ea"/>
@@ -97,7 +103,10 @@
97103
<target name="debug-tomcat">
98104
<java jar="${tomcat.home}/bin/bootstrap.jar" fork="true">
99105
<jvmarg value="-Dcatalina.home=${tomcat.home}"/>
100-
<jvmarg value="-Xdebug"/>
106+
<jvmarg value="-Dcom.sun.management.jmxremote.port=20400"/>
107+
<jvmarg value="-Dcom.sun.management.jmxremote.authenticate=false"/>
108+
<jvmarg value="-Dcom.sun.management.jmxremote.ssl=false"/>
109+
<jvmarg value="-Xdebug"/>
101110
<jvmarg value="${debug.jvmarg}"/>
102111
<jvmarg value="-ea"/>
103112
<jvmarg value="-Xms256m"/>

server/src/com/cloud/cluster/ClusterManagerImpl.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import com.cloud.utils.db.Transaction;
4848
import com.cloud.utils.events.SubscriptionMgr;
4949
import com.cloud.utils.exception.CloudRuntimeException;
50+
import com.cloud.utils.mgmt.JmxUtil;
5051
import com.cloud.utils.net.MacAddress;
5152
import com.cloud.utils.net.NetUtils;
5253
import com.google.gson.Gson;
@@ -566,6 +567,12 @@ private void peerScan() {
566567

567568
for(ManagementServerHostVO mshost : removedNodeList) {
568569
activePeers.remove(mshost.getId());
570+
571+
try {
572+
JmxUtil.unregisterMBean("ClusterManager", "Node " + mshost.getId());
573+
} catch(Exception e) {
574+
s_logger.warn("Unable to deregiester cluster node from JMX monitoring due to exception " + e.toString());
575+
}
569576
}
570577

571578
List<ManagementServerHostVO> newNodeList = new ArrayList<ManagementServerHostVO>();
@@ -577,6 +584,12 @@ private void peerScan() {
577584
s_logger.debug("Detected management node joined, id:" + mshost.getId() + ", nodeIP:" + mshost.getServiceIP());
578585
}
579586
newNodeList.add(mshost);
587+
588+
try {
589+
JmxUtil.registerMBean("ClusterManager", "Node " + mshost.getId(), new ClusterManagerMBeanImpl(mshost));
590+
} catch(Exception e) {
591+
s_logger.warn("Unable to regiester cluster node into JMX monitoring due to exception " + e.toString());
592+
}
580593
}
581594
}
582595

@@ -764,7 +777,7 @@ public boolean configure(String name, Map<String, Object> params) throws Configu
764777
if(_currentServiceAdapter == null) {
765778
throw new ConfigurationException("Unable to set current cluster service adapter");
766779
}
767-
780+
768781
if(s_logger.isInfoEnabled()) {
769782
s_logger.info("Cluster manager is configured.");
770783
}

server/src/com/cloud/vm/UserVmManagerImpl.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,9 @@
106106
import com.cloud.hypervisor.Hypervisor.HypervisorType;
107107
import com.cloud.network.IPAddressVO;
108108
import com.cloud.network.Network;
109+
import com.cloud.network.Network.GuestIpType;
109110
import com.cloud.network.NetworkManager;
110111
import com.cloud.network.NetworkVO;
111-
import com.cloud.network.Network.GuestIpType;
112112
import com.cloud.network.Networks.TrafficType;
113113
import com.cloud.network.dao.FirewallRulesDao;
114114
import com.cloud.network.dao.IPAddressDao;
@@ -2244,9 +2244,13 @@ public UserVm startVirtualMachine(DeployVMCmd cmd) throws ResourceUnavailableExc
22442244
public boolean finalizeVirtualMachineProfile(VirtualMachineProfile<UserVmVO> profile, DeployDestination dest, ReservationContext context) {
22452245
UserVmVO vm = profile.getVirtualMachine();
22462246
Account owner = _accountDao.findById(vm.getAccountId());
2247+
2248+
if (owner == null) {
2249+
throw new PermissionDeniedException("The owner of " + vm + " does not exist: " + vm.getAccountId());
2250+
}
22472251

2248-
if (owner == null || owner.getState() == Account.State.disabled) {
2249-
throw new PermissionDeniedException("The owner of " + vm + " either does not exist or is disabled: " + vm.getAccountId());
2252+
if (owner.getState() == Account.State.disabled) {
2253+
throw new PermissionDeniedException("The owner of " + vm + " is disabled: " + vm.getAccountId());
22502254
}
22512255

22522256
VirtualMachineTemplate template = profile.getTemplate();

utils/src/com/cloud/utils/mgmt/JmxUtil.java

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,11 @@
1717
*/
1818
package com.cloud.utils.mgmt;
1919

20+
import java.lang.management.ManagementFactory;
2021
import java.util.ArrayList;
2122

2223
import javax.management.InstanceAlreadyExistsException;
24+
import javax.management.InstanceNotFoundException;
2325
import javax.management.MBeanRegistrationException;
2426
import javax.management.MBeanServer;
2527
import javax.management.MBeanServerFactory;
@@ -28,12 +30,59 @@
2830
import javax.management.ObjectName;
2931

3032
public class JmxUtil {
31-
public static void registerMBean(ManagementBean mbean) throws MalformedObjectNameException, InstanceAlreadyExistsException, MBeanRegistrationException, NotCompliantMBeanException {
33+
public static ObjectName registerMBean(ManagementBean mbean)
34+
throws MalformedObjectNameException, InstanceAlreadyExistsException, MBeanRegistrationException, NotCompliantMBeanException {
35+
36+
return registerMBean(mbean.getName(), null, mbean);
37+
}
38+
39+
public static ObjectName registerMBean(String objTypeName, String objInstanceName, Object mbean)
40+
throws MalformedObjectNameException, InstanceAlreadyExistsException, MBeanRegistrationException, NotCompliantMBeanException {
41+
42+
String name = "com.cloud:type=" + objTypeName;
43+
if(objInstanceName != null && !objInstanceName.isEmpty())
44+
name += ", name=" + objInstanceName;
45+
ObjectName objectName = new ObjectName(name);
46+
3247
ArrayList<MBeanServer> server = MBeanServerFactory.findMBeanServer(null);
3348
if (server.size() > 0) {
3449
MBeanServer mBeanServer = server.get(0);
35-
ObjectName objectName = new ObjectName("com.cloud: type=" + mbean.getName());
3650
mBeanServer.registerMBean(mbean, objectName);
51+
return objectName;
52+
} else {
53+
MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
54+
mBeanServer.registerMBean(mbean, objectName);
55+
return objectName;
56+
}
57+
}
58+
59+
public static void unregisterMBean(String objTypeName, String objInstanceName)
60+
throws MalformedObjectNameException, MBeanRegistrationException, InstanceNotFoundException {
61+
62+
ObjectName name = composeMBeanName(objTypeName, objInstanceName);
63+
unregisterMBean(name);
64+
}
65+
66+
public static void unregisterMBean(ObjectName name)
67+
throws MalformedObjectNameException, MBeanRegistrationException, InstanceNotFoundException {
68+
69+
ArrayList<MBeanServer> server = MBeanServerFactory.findMBeanServer(null);
70+
if (server.size() > 0) {
71+
MBeanServer mBeanServer = server.get(0);
72+
mBeanServer.unregisterMBean(name);
73+
} else {
74+
MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
75+
mBeanServer.unregisterMBean(name);
3776
}
3877
}
78+
79+
private static ObjectName composeMBeanName(String objTypeName, String objInstanceName)
80+
throws MalformedObjectNameException {
81+
82+
String name = "com.cloud:type=" + objTypeName;
83+
if(objInstanceName != null && !objInstanceName.isEmpty())
84+
name += ", name=" + objInstanceName;
85+
86+
return new ObjectName(name);
87+
}
3988
}

0 commit comments

Comments
 (0)