From 33b3333d6504cde7739e7263e345807dc211f404 Mon Sep 17 00:00:00 2001 From: Kelven Yang Date: Tue, 8 Mar 2011 16:33:06 -0800 Subject: [PATCH] Add JMX support to async job management, active job details will be checked in jConsole --- server/src/com/cloud/async/AsyncJobMBean.java | 21 +++ .../com/cloud/async/AsyncJobMBeanImpl.java | 128 ++++++++++++++++++ .../com/cloud/async/AsyncJobManagerImpl.java | 14 ++ .../com/cloud/cluster/ClusterManagerImpl.java | 10 +- .../cloud/cluster/ClusterManagerMBean.java | 3 + .../cluster/ClusterManagerMBeanImpl.java | 18 ++- 6 files changed, 192 insertions(+), 2 deletions(-) create mode 100644 server/src/com/cloud/async/AsyncJobMBean.java create mode 100644 server/src/com/cloud/async/AsyncJobMBeanImpl.java diff --git a/server/src/com/cloud/async/AsyncJobMBean.java b/server/src/com/cloud/async/AsyncJobMBean.java new file mode 100644 index 00000000000..3951faa005d --- /dev/null +++ b/server/src/com/cloud/async/AsyncJobMBean.java @@ -0,0 +1,21 @@ +package com.cloud.async; + +public interface AsyncJobMBean { + public long getAccountId(); + public long getUserId(); + public String getCmd(); + public String getCmdInfo(); + public String getStatus(); + public int getProcessStatus(); + public int getResultCode(); + public String getResult(); + public String getInstanceType(); + public String getInstanceId(); + public String getInitMsid(); + public String getCreateTime(); + public String getLastUpdateTime(); + public String getLastPollTime(); + public String getSyncQueueId(); + public String getSyncQueueContentType(); + public String getSyncQueueContentId(); +} diff --git a/server/src/com/cloud/async/AsyncJobMBeanImpl.java b/server/src/com/cloud/async/AsyncJobMBeanImpl.java new file mode 100644 index 00000000000..3163508253f --- /dev/null +++ b/server/src/com/cloud/async/AsyncJobMBeanImpl.java @@ -0,0 +1,128 @@ +package com.cloud.async; + +import java.util.Date; +import java.util.TimeZone; + +import javax.management.StandardMBean; + +import com.cloud.utils.DateUtil; + +public class AsyncJobMBeanImpl extends StandardMBean implements AsyncJobMBean { + private AsyncJobVO _jobVo; + + public AsyncJobMBeanImpl(AsyncJobVO jobVo) { + super(AsyncJobMBean.class, false); + + _jobVo = jobVo; + } + + public long getAccountId() { + return _jobVo.getAccountId(); + } + + public long getUserId() { + return _jobVo.getUserId(); + } + + public String getCmd() { + return _jobVo.getCmd(); + } + + public String getCmdInfo() { + return _jobVo.getCmdInfo(); + } + + public String getStatus() { + int jobStatus = _jobVo.getStatus(); + switch(jobStatus) { + case AsyncJobResult.STATUS_SUCCEEDED : + return "Completed"; + + case AsyncJobResult.STATUS_IN_PROGRESS: + return "In preogress"; + + case AsyncJobResult.STATUS_FAILED: + return "failed"; + } + + return "Unknow"; + } + + public int getProcessStatus() { + return _jobVo.getProcessStatus(); + } + + public int getResultCode() { + return _jobVo.getResultCode(); + } + + public String getResult() { + return _jobVo.getResult(); + } + + public String getInstanceType() { + if(_jobVo.getInstanceType() != null) + return _jobVo.getInstanceType().toString(); + return "N/A"; + } + + public String getInstanceId() { + if(_jobVo.getInstanceId() != null) + return String.valueOf(_jobVo.getInstanceId()); + return "N/A"; + } + + public String getInitMsid() { + if(_jobVo.getInitMsid() != null) { + return String.valueOf(_jobVo.getInitMsid()); + } + return "N/A"; + } + + public String getCreateTime() { + Date time = _jobVo.getCreated(); + if(time != null) + return DateUtil.getDateDisplayString(TimeZone.getDefault(), time); + return "N/A"; + } + + public String getLastUpdateTime() { + Date time = _jobVo.getLastUpdated(); + if(time != null) + return DateUtil.getDateDisplayString(TimeZone.getDefault(), time); + return "N/A"; + } + + public String getLastPollTime() { + Date time = _jobVo.getLastPolled(); + + if(time != null) + return DateUtil.getDateDisplayString(TimeZone.getDefault(), time); + return "N/A"; + } + + public String getSyncQueueId() { + SyncQueueItemVO item = _jobVo.getSyncSource(); + if(item != null && item.getQueueId() != null) { + return String.valueOf(item.getQueueId()); + } + return "N/A"; + } + + public String getSyncQueueContentType() { + SyncQueueItemVO item = _jobVo.getSyncSource(); + if(item != null) { + return item.getContentType(); + } + return "N/A"; + } + + public String getSyncQueueContentId() { + SyncQueueItemVO item = _jobVo.getSyncSource(); + if(item != null && item.getContentId() != null) { + return String.valueOf(item.getContentId()); + } + return "N/A"; + } + +} diff --git a/server/src/com/cloud/async/AsyncJobManagerImpl.java b/server/src/com/cloud/async/AsyncJobManagerImpl.java index 8e23c4fea88..e947b12deeb 100644 --- a/server/src/com/cloud/async/AsyncJobManagerImpl.java +++ b/server/src/com/cloud/async/AsyncJobManagerImpl.java @@ -62,6 +62,7 @@ import com.cloud.utils.db.DB; import com.cloud.utils.db.GlobalLock; import com.cloud.utils.db.Transaction; import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.utils.mgmt.JmxUtil; import com.cloud.utils.net.MacAddress; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; @@ -346,6 +347,12 @@ public class AsyncJobManagerImpl implements AsyncJobManager, ClusterManagerListe @Override public void run() { long jobId = 0; + + try { + JmxUtil.registerMBean("AsyncJobManager", "Active Job " + job.getId(), new AsyncJobMBeanImpl(job)); + } catch(Exception e) { + s_logger.warn("Unable to register active job " + job.getId() + " to JMX minotoring"); + } BaseAsyncCmd cmdObj = null; Transaction txn = Transaction.open(Transaction.CLOUD_DB); @@ -437,6 +444,13 @@ public class AsyncJobManagerImpl implements AsyncJobManager, ClusterManagerListe } } } finally { + + try { + JmxUtil.unregisterMBean("AsyncJobManager", "Active Job " + job.getId()); + } catch(Exception e) { + s_logger.warn("Unable to unregister active job " + job.getId() + " from JMX minotoring"); + } + StackMaid.current().exitCleanup(); txn.close(); NDC.pop(); diff --git a/server/src/com/cloud/cluster/ClusterManagerImpl.java b/server/src/com/cloud/cluster/ClusterManagerImpl.java index 42682664ec2..e7f6faa2383 100644 --- a/server/src/com/cloud/cluster/ClusterManagerImpl.java +++ b/server/src/com/cloud/cluster/ClusterManagerImpl.java @@ -586,7 +586,7 @@ public class ClusterManagerImpl implements ClusterManager { newNodeList.add(mshost); try { - JmxUtil.registerMBean("ClusterManager", "Node " + mshost.getId(), new ClusterManagerMBeanImpl(mshost)); + JmxUtil.registerMBean("ClusterManager", "Node " + mshost.getId(), new ClusterManagerMBeanImpl(this, mshost)); } catch(Exception e) { s_logger.warn("Unable to regiester cluster node into JMX monitoring due to exception " + e.toString()); } @@ -809,4 +809,12 @@ public class ClusterManagerImpl implements ClusterManager { public int getHeartbeatThreshold() { return this.heartbeatThreshold; } + + public int getHeartbeatInterval() { + return this.heartbeatInterval; + } + + public void setHeartbeatThreshold(int threshold) { + heartbeatThreshold = threshold; + } } diff --git a/server/src/com/cloud/cluster/ClusterManagerMBean.java b/server/src/com/cloud/cluster/ClusterManagerMBean.java index a4578ccef42..127d4974a52 100644 --- a/server/src/com/cloud/cluster/ClusterManagerMBean.java +++ b/server/src/com/cloud/cluster/ClusterManagerMBean.java @@ -5,4 +5,7 @@ public interface ClusterManagerMBean { public String getLastUpdateTime(); public String getClusterNodeIP(); public String getVersion(); + public int getHeartbeatInterval(); + public int getHeartbeatThreshold(); + public void setHeartbeatThreshold(int threshold); } diff --git a/server/src/com/cloud/cluster/ClusterManagerMBeanImpl.java b/server/src/com/cloud/cluster/ClusterManagerMBeanImpl.java index 0f6c62453a8..26b3c9faa48 100644 --- a/server/src/com/cloud/cluster/ClusterManagerMBeanImpl.java +++ b/server/src/com/cloud/cluster/ClusterManagerMBeanImpl.java @@ -8,11 +8,13 @@ import javax.management.StandardMBean; import com.cloud.utils.DateUtil; public class ClusterManagerMBeanImpl extends StandardMBean implements ClusterManagerMBean { + private ClusterManagerImpl _clusterMgr; private ManagementServerHostVO _mshostVo; - public ClusterManagerMBeanImpl(ManagementServerHostVO mshostVo) { + public ClusterManagerMBeanImpl(ClusterManagerImpl clusterMgr, ManagementServerHostVO mshostVo) { super(ClusterManagerMBean.class, false); + _clusterMgr = clusterMgr; _mshostVo = mshostVo; } @@ -32,4 +34,18 @@ public class ClusterManagerMBeanImpl extends StandardMBean implements ClusterMan public String getVersion() { return _mshostVo.getVersion(); } + + public int getHeartbeatInterval() { + return _clusterMgr.getHeartbeatInterval(); + } + + public int getHeartbeatThreshold() { + return _clusterMgr.getHeartbeatThreshold(); + } + + public void setHeartbeatThreshold(int threshold) { + // to avoid accidentally screwing up cluster manager, we put some guarding logic here + if(threshold >= ClusterManager.DEFAULT_HEARTBEAT_THRESHOLD) + _clusterMgr.setHeartbeatThreshold(threshold); + } }