IGNITE-6869 Implement new JMX metric for jobs monitoring

Signed-off-by: Anton Vinogradov <a...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/0295518b
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/0295518b
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/0295518b

Branch: refs/heads/ignite-zk
Commit: 0295518bac9f9431351f8f7e7b9d2148ee70417d
Parents: 31055f2
Author: Aleksey Plekhanov <plehanov.a...@gmail.com>
Authored: Tue Nov 21 13:39:20 2017 +0300
Committer: Anton Vinogradov <a...@apache.org>
Committed: Tue Nov 21 13:39:20 2017 +0300

----------------------------------------------------------------------
 .../apache/ignite/cluster/ClusterMetrics.java   |  12 +-
 .../ClusterLocalNodeMetricsMXBeanImpl.java      |  11 +-
 .../internal/ClusterMetricsMXBeanImpl.java      | 360 +++++++++++++++++++
 .../ignite/internal/ClusterMetricsSnapshot.java |  37 +-
 .../apache/ignite/internal/IgniteKernal.java    |  40 ++-
 .../discovery/GridDiscoveryManager.java         |   1 +
 .../processors/jobmetrics/GridJobMetrics.java   |  21 +-
 .../jobmetrics/GridJobMetricsProcessor.java     |   9 +-
 .../mxbean/ClusterLocalNodeMetricsMXBean.java   | 253 -------------
 .../ignite/mxbean/ClusterMetricsMXBean.java     | 257 +++++++++++++
 .../internal/ClusterNodeMetricsSelfTest.java    |   4 +-
 ...ClusterMetricsSnapshotSerializeSelfTest.java |   8 +-
 12 files changed, 734 insertions(+), 279 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/0295518b/modules/core/src/main/java/org/apache/ignite/cluster/ClusterMetrics.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/cluster/ClusterMetrics.java 
b/modules/core/src/main/java/org/apache/ignite/cluster/ClusterMetrics.java
index 7dd4707..74e98b8 100644
--- a/modules/core/src/main/java/org/apache/ignite/cluster/ClusterMetrics.java
+++ b/modules/core/src/main/java/org/apache/ignite/cluster/ClusterMetrics.java
@@ -225,6 +225,16 @@ public interface ClusterMetrics {
     public int getTotalExecutedJobs();
 
     /**
+     * Gets total time all finished jobs takes to execute on the node since 
node startup.
+     * <p>
+     * <b>Note:</b> Unlike most of other aggregation metrics this metric is 
not calculated over history
+     * but over the entire node life.
+     *
+     * @return Total jobs execution time.
+     */
+    public long getTotalJobsExecutionTime();
+
+    /**
      * Gets maximum time a job ever spent waiting in a queue to be executed.
      * <p>
      * <b>Note:</b> all aggregated metrics like average, minimum, maximum, 
total, count are
@@ -684,4 +694,4 @@ public interface ClusterMetrics {
      * @return Total number of nodes.
      */
     public int getTotalNodes();
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/0295518b/modules/core/src/main/java/org/apache/ignite/internal/ClusterLocalNodeMetricsMXBeanImpl.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/ClusterLocalNodeMetricsMXBeanImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/ClusterLocalNodeMetricsMXBeanImpl.java
index ef81c6a..263c20a 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/ClusterLocalNodeMetricsMXBeanImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/ClusterLocalNodeMetricsMXBeanImpl.java
@@ -19,12 +19,12 @@ package org.apache.ignite.internal;
 
 import org.apache.ignite.cluster.ClusterNode;
 import org.apache.ignite.internal.util.typedef.internal.S;
-import org.apache.ignite.mxbean.ClusterLocalNodeMetricsMXBean;
+import org.apache.ignite.mxbean.ClusterMetricsMXBean;
 
 /**
  * Local node metrics MBean.
  */
-public class ClusterLocalNodeMetricsMXBeanImpl implements 
ClusterLocalNodeMetricsMXBean {
+public class ClusterLocalNodeMetricsMXBeanImpl implements ClusterMetricsMXBean 
{
     /** Grid node. */
     private final ClusterNode node;
 
@@ -263,6 +263,11 @@ public class ClusterLocalNodeMetricsMXBeanImpl implements 
ClusterLocalNodeMetric
     }
 
     /** {@inheritDoc} */
+    @Override public long getTotalJobsExecutionTime() {
+        return node.metrics().getTotalJobsExecutionTime();
+    }
+
+    /** {@inheritDoc} */
     @Override public long getTotalIdleTime() {
         return node.metrics().getTotalIdleTime();
     }
@@ -321,4 +326,4 @@ public class ClusterLocalNodeMetricsMXBeanImpl implements 
ClusterLocalNodeMetric
     @Override public String toString() {
         return S.toString(ClusterLocalNodeMetricsMXBeanImpl.class, this);
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/0295518b/modules/core/src/main/java/org/apache/ignite/internal/ClusterMetricsMXBeanImpl.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/ClusterMetricsMXBeanImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/ClusterMetricsMXBeanImpl.java
new file mode 100644
index 0000000..de4e405
--- /dev/null
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/ClusterMetricsMXBeanImpl.java
@@ -0,0 +1,360 @@
+/*
+ * 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.cluster.ClusterGroup;
+import org.apache.ignite.cluster.ClusterMetrics;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.mxbean.ClusterMetricsMXBean;
+
+/**
+ * Cluster metrics MBean.
+ */
+public class ClusterMetricsMXBeanImpl implements ClusterMetricsMXBean {
+    /** Grid cluster. */
+    private final ClusterGroup cluster;
+
+    /** Cached value of cluster metrics. */
+    private volatile ClusterMetrics clusterMetricsSnapshot;
+
+    /** Cluster metrics expire time. */
+    private volatile long clusterMetricsExpireTime;
+
+    /** Cluster metrics update mutex. */
+    private final Object clusterMetricsMux = new Object();
+
+    /**
+     * @param cluster Cluster group to manage.
+     */
+    public ClusterMetricsMXBeanImpl(ClusterGroup cluster) {
+        assert cluster != null;
+
+        this.cluster = cluster;
+    }
+
+    /**
+     * Gets a metrics snapshot for this cluster group.
+     *
+     * @return Metrics snapshot.
+     */
+    private ClusterMetrics metrics() {
+        if (clusterMetricsExpireTime < System.currentTimeMillis()) {
+            synchronized (clusterMetricsMux) {
+                if (clusterMetricsExpireTime < System.currentTimeMillis()) {
+                    clusterMetricsSnapshot = cluster.metrics();
+
+                    clusterMetricsExpireTime = System.currentTimeMillis()
+                        + 
cluster.ignite().configuration().getMetricsUpdateFrequency();
+                }
+            }
+        }
+
+        return clusterMetricsSnapshot;
+    }
+
+    /** {@inheritDoc} */
+    @Override public int getTotalCpus() {
+        return metrics().getTotalCpus();
+    }
+
+    /** {@inheritDoc} */
+    @Override public float getAverageActiveJobs() {
+        return metrics().getAverageActiveJobs();
+    }
+
+    /** {@inheritDoc} */
+    @Override public float getAverageCancelledJobs() {
+        return metrics().getAverageCancelledJobs();
+    }
+
+    /** {@inheritDoc} */
+    @Override public double getAverageJobExecuteTime() {
+        return metrics().getAverageJobExecuteTime();
+    }
+
+    /** {@inheritDoc} */
+    @Override public double getAverageJobWaitTime() {
+        return metrics().getAverageJobWaitTime();
+    }
+
+    /** {@inheritDoc} */
+    @Override public float getAverageRejectedJobs() {
+        return metrics().getAverageRejectedJobs();
+    }
+
+    /** {@inheritDoc} */
+    @Override public float getAverageWaitingJobs() {
+        return metrics().getAverageWaitingJobs();
+    }
+
+    /** {@inheritDoc} */
+    @Override public float getBusyTimePercentage() {
+        return metrics().getBusyTimePercentage() * 100;
+    }
+
+    /** {@inheritDoc} */
+    @Override public int getCurrentActiveJobs() {
+        return metrics().getCurrentActiveJobs();
+    }
+
+    /** {@inheritDoc} */
+    @Override public int getCurrentCancelledJobs() {
+        return metrics().getCurrentCancelledJobs();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getCurrentIdleTime() {
+        return metrics().getCurrentIdleTime();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getCurrentJobExecuteTime() {
+        return metrics().getCurrentJobExecuteTime();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getCurrentJobWaitTime() {
+        return metrics().getCurrentJobWaitTime();
+    }
+
+    /** {@inheritDoc} */
+    @Override public int getCurrentRejectedJobs() {
+        return metrics().getCurrentRejectedJobs();
+    }
+
+    /** {@inheritDoc} */
+    @Override public int getCurrentWaitingJobs() {
+        return metrics().getCurrentWaitingJobs();
+    }
+
+    /** {@inheritDoc} */
+    @Override public int getTotalExecutedTasks() {
+        return metrics().getTotalExecutedTasks();
+    }
+
+    /** {@inheritDoc} */
+    @Override public int getCurrentDaemonThreadCount() {
+        return metrics().getCurrentDaemonThreadCount();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getHeapMemoryCommitted() {
+        return metrics().getHeapMemoryCommitted();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getHeapMemoryInitialized() {
+        return metrics().getHeapMemoryInitialized();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getHeapMemoryMaximum() {
+        return metrics().getHeapMemoryMaximum();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getHeapMemoryTotal() {
+        return metrics().getHeapMemoryTotal();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getHeapMemoryUsed() {
+        return metrics().getHeapMemoryUsed();
+    }
+
+    /** {@inheritDoc} */
+    @Override public float getIdleTimePercentage() {
+        return metrics().getIdleTimePercentage() * 100;
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getLastUpdateTime() {
+        return metrics().getLastUpdateTime();
+    }
+
+    /** {@inheritDoc} */
+    @Override public int getMaximumActiveJobs() {
+        return metrics().getMaximumActiveJobs();
+    }
+
+    /** {@inheritDoc} */
+    @Override public int getMaximumCancelledJobs() {
+        return metrics().getMaximumCancelledJobs();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getMaximumJobExecuteTime() {
+        return metrics().getMaximumJobExecuteTime();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getMaximumJobWaitTime() {
+        return metrics().getMaximumJobWaitTime();
+    }
+
+    /** {@inheritDoc} */
+    @Override public int getMaximumRejectedJobs() {
+        return metrics().getMaximumRejectedJobs();
+    }
+
+    /** {@inheritDoc} */
+    @Override public int getMaximumWaitingJobs() {
+        return metrics().getMaximumWaitingJobs();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getNonHeapMemoryCommitted() {
+        return metrics().getNonHeapMemoryCommitted();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getNonHeapMemoryInitialized() {
+        return metrics().getNonHeapMemoryInitialized();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getNonHeapMemoryMaximum() {
+        return metrics().getNonHeapMemoryMaximum();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getNonHeapMemoryTotal() {
+        return metrics().getNonHeapMemoryTotal();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getNonHeapMemoryUsed() {
+        return metrics().getNonHeapMemoryUsed();
+    }
+
+    /** {@inheritDoc} */
+    @Override public int getMaximumThreadCount() {
+        return metrics().getMaximumThreadCount();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getStartTime() {
+        return metrics().getStartTime();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getNodeStartTime() {
+        return metrics().getNodeStartTime();
+    }
+
+    /** {@inheritDoc} */
+    @Override public double getCurrentCpuLoad() {
+        return metrics().getCurrentCpuLoad() * 100;
+    }
+
+    /** {@inheritDoc} */
+    @Override public double getAverageCpuLoad() {
+        return metrics().getAverageCpuLoad() * 100;
+    }
+
+    /** {@inheritDoc} */
+    @Override public double getCurrentGcCpuLoad() {
+        return metrics().getCurrentGcCpuLoad() * 100;
+    }
+
+    /** {@inheritDoc} */
+    @Override public int getCurrentThreadCount() {
+        return metrics().getCurrentThreadCount();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getTotalBusyTime() {
+        return metrics().getTotalBusyTime();
+    }
+
+    /** {@inheritDoc} */
+    @Override public int getTotalCancelledJobs() {
+        return metrics().getTotalCancelledJobs();
+    }
+
+    /** {@inheritDoc} */
+    @Override public int getTotalExecutedJobs() {
+        return metrics().getTotalExecutedJobs();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getTotalJobsExecutionTime() {
+        return metrics().getTotalJobsExecutionTime();
+    }
+
+
+    /** {@inheritDoc} */
+    @Override public long getTotalIdleTime() {
+        return metrics().getTotalIdleTime();
+    }
+
+    /** {@inheritDoc} */
+    @Override public int getTotalRejectedJobs() {
+        return metrics().getTotalRejectedJobs();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getTotalStartedThreadCount() {
+        return metrics().getTotalStartedThreadCount();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getUpTime() {
+        return metrics().getUpTime();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getLastDataVersion() {
+        return metrics().getLastDataVersion();
+    }
+
+    /** {@inheritDoc} */
+    @Override public int getSentMessagesCount() {
+        return metrics().getSentMessagesCount();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getSentBytesCount() {
+        return metrics().getSentBytesCount();
+    }
+
+    /** {@inheritDoc} */
+    @Override public int getReceivedMessagesCount() {
+        return metrics().getReceivedMessagesCount();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getReceivedBytesCount() {
+        return metrics().getReceivedBytesCount();
+    }
+
+    /** {@inheritDoc} */
+    @Override public int getOutboundMessagesQueueSize() {
+        return metrics().getOutboundMessagesQueueSize();
+    }
+
+    /** {@inheritDoc} */
+    @Override public int getTotalNodes() {
+        return metrics().getTotalNodes();
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(ClusterMetricsMXBeanImpl.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/0295518b/modules/core/src/main/java/org/apache/ignite/internal/ClusterMetricsSnapshot.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/ClusterMetricsSnapshot.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/ClusterMetricsSnapshot.java
index 8a0bc5e..5f29167 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/ClusterMetricsSnapshot.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/ClusterMetricsSnapshot.java
@@ -90,8 +90,9 @@ public class ClusterMetricsSnapshot implements ClusterMetrics 
{
         8/*sent bytes count*/ +
         4/*received messages count*/ +
         8/*received bytes count*/ +
-        4/*outbound messages queue size*/ + 
-        4/*total nodes*/;
+        4/*outbound messages queue size*/ +
+        4/*total nodes*/ +
+        8/*total jobs execution time*/;
 
     /** */
     private long lastUpdateTime = -1;
@@ -252,6 +253,9 @@ public class ClusterMetricsSnapshot implements 
ClusterMetrics {
     /** */
     private int totalNodes = -1;
 
+    /** */
+    private long totalJobsExecTime = -1;
+
     /**
      * Create empty snapshot.
      */
@@ -288,6 +292,7 @@ public class ClusterMetricsSnapshot implements 
ClusterMetrics {
         totalRejectedJobs = 0;
         totalCancelledJobs = 0;
         totalExecutedJobs = 0;
+        totalJobsExecTime = 0;
         maxJobWaitTime = 0;
         avgJobWaitTime = 0;
         maxJobExecTime = 0;
@@ -334,6 +339,7 @@ public class ClusterMetricsSnapshot implements 
ClusterMetrics {
             maxActiveJobs = max(maxActiveJobs, m.getCurrentActiveJobs());
             avgActiveJobs += m.getCurrentActiveJobs();
             totalExecutedJobs += m.getTotalExecutedJobs();
+            totalJobsExecTime += m.getTotalJobsExecutionTime();
 
             totalExecTasks += m.getTotalExecutedTasks();
 
@@ -651,6 +657,20 @@ public class ClusterMetricsSnapshot implements 
ClusterMetrics {
     }
 
     /** {@inheritDoc} */
+    @Override public long getTotalJobsExecutionTime() {
+        return totalJobsExecTime;
+    }
+
+    /**
+     * Sets total jobs execution time.
+     *
+     * @param totalJobsExecTime Total jobs execution time.
+     */
+    public void setTotalJobsExecutionTime(long totalJobsExecTime) {
+        this.totalJobsExecTime = totalJobsExecTime;
+    }
+
+    /** {@inheritDoc} */
     @Override public int getTotalCancelledJobs() {
         return totalCancelledJobs;
     }
@@ -1325,6 +1345,7 @@ public class ClusterMetricsSnapshot implements 
ClusterMetrics {
         buf.putLong(metrics.getReceivedBytesCount());
         buf.putInt(metrics.getOutboundMessagesQueueSize());
         buf.putInt(metrics.getTotalNodes());
+        buf.putLong(metrics.getTotalJobsExecutionTime());
 
         assert !buf.hasRemaining() : "Invalid metrics size [expected=" + 
METRICS_SIZE + ", actual="
             + (buf.position() - off) + ']';
@@ -1342,7 +1363,9 @@ public class ClusterMetricsSnapshot implements 
ClusterMetrics {
     public static ClusterMetrics deserialize(byte[] data, int off) {
         ClusterMetricsSnapshot metrics = new ClusterMetricsSnapshot();
 
-        ByteBuffer buf = ByteBuffer.wrap(data, off, METRICS_SIZE);
+        int bufSize = min(METRICS_SIZE, data.length - off);
+
+        ByteBuffer buf = ByteBuffer.wrap(data, off, bufSize);
 
         metrics.setLastUpdateTime(U.currentTimeMillis());
 
@@ -1399,6 +1422,12 @@ public class ClusterMetricsSnapshot implements 
ClusterMetrics {
         metrics.setOutboundMessagesQueueSize(buf.getInt());
         metrics.setTotalNodes(buf.getInt());
 
+        // For compatibility with metrics serialized by old ignite versions.
+        if (buf.remaining() >= 8)
+            metrics.setTotalJobsExecutionTime(buf.getLong());
+        else
+            metrics.setTotalJobsExecutionTime(0);
+
         return metrics;
     }
 
@@ -1406,4 +1435,4 @@ public class ClusterMetricsSnapshot implements 
ClusterMetrics {
     @Override public String toString() {
         return S.toString(ClusterMetricsSnapshot.class, this);
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/0295518b/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 bde7be2..d3793ae 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
@@ -182,7 +182,7 @@ import org.apache.ignite.lifecycle.LifecycleBean;
 import org.apache.ignite.lifecycle.LifecycleEventType;
 import org.apache.ignite.marshaller.MarshallerExclusions;
 import org.apache.ignite.marshaller.jdk.JdkMarshaller;
-import org.apache.ignite.mxbean.ClusterLocalNodeMetricsMXBean;
+import org.apache.ignite.mxbean.ClusterMetricsMXBean;
 import org.apache.ignite.mxbean.IgniteMXBean;
 import org.apache.ignite.mxbean.StripedExecutorMXBean;
 import org.apache.ignite.mxbean.ThreadPoolMXBean;
@@ -303,6 +303,10 @@ public class IgniteKernal implements IgniteEx, 
IgniteMXBean, Externalizable {
 
     /** */
     @GridToStringExclude
+    private ObjectName allNodesMBean;
+
+    /** */
+    @GridToStringExclude
     private ObjectName pubExecSvcMBean;
 
     /** */
@@ -1079,7 +1083,7 @@ public class IgniteKernal implements IgniteEx, 
IgniteMXBean, Externalizable {
 
             // Register MBeans.
             registerKernalMBean();
-            registerLocalNodeMBean();
+            registerClusterMetricsMBeans();
             registerExecutorMBeans(execSvc, sysExecSvc, p2pExecSvc, 
mgmtExecSvc, restExecSvc, qryExecSvc,
                 schemaExecSvc);
 
@@ -1696,32 +1700,43 @@ public class IgniteKernal implements IgniteEx, 
IgniteMXBean, Externalizable {
         }
     }
 
-    /** @throws IgniteCheckedException If registration failed. */
-    private void registerLocalNodeMBean() throws IgniteCheckedException {
+    /**
+     * 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;
+            return null;
 
-        ClusterLocalNodeMetricsMXBean mbean = new 
ClusterLocalNodeMetricsMXBeanImpl(ctx.discovery().localNode());
+        ObjectName objectName;
 
         try {
-            locNodeMBean = U.registerMBean(
+            objectName = U.registerMBean(
                 cfg.getMBeanServer(),
                 cfg.getIgniteInstanceName(),
                 "Kernal",
                 mbean.getClass().getSimpleName(),
                 mbean,
-                ClusterLocalNodeMetricsMXBean.class);
+                ClusterMetricsMXBean.class);
 
             if (log.isDebugEnabled())
-                log.debug("Registered local node MBean: " + locNodeMBean);
+                log.debug("Registered MBean: " + objectName);
+
+            return objectName;
         }
         catch (JMException e) {
-            locNodeMBean = null;
-
-            throw new IgniteCheckedException("Failed to register local node 
MBean.", 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().localNode()));
+        allNodesMBean = registerClusterMetricsMBean(new 
ClusterMetricsMXBeanImpl(cluster()));
+    }
+
     /**
      * @param execSvc Public executor service.
      * @param sysExecSvc System executor service.
@@ -2271,6 +2286,7 @@ public class IgniteKernal implements IgniteEx, 
IgniteMXBean, Externalizable {
                     unregisterMBean(p2PExecSvcMBean) &
                     unregisterMBean(kernalMBean) &
                     unregisterMBean(locNodeMBean) &
+                    unregisterMBean(allNodesMBean) &
                     unregisterMBean(restExecSvcMBean) &
                     unregisterMBean(qryExecSvcMBean) &
                     unregisterMBean(schemaExecSvcMBean) &

http://git-wip-us.apache.org/repos/asf/ignite/blob/0295518b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java
index a6737dc..3c7df92 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java
@@ -1065,6 +1065,7 @@ public class GridDiscoveryManager extends 
GridManagerAdapter<DiscoverySpi> {
                 nm.setTotalRejectedJobs(jm.getTotalRejectedJobs());
                 nm.setTotalCancelledJobs(jm.getTotalCancelledJobs());
                 nm.setTotalExecutedJobs(jm.getTotalExecutedJobs());
+                nm.setTotalJobsExecutionTime(jm.getTotalJobsExecutionTime());
                 nm.setMaximumJobWaitTime(jm.getMaximumJobWaitTime());
                 nm.setCurrentJobWaitTime(jm.getCurrentJobWaitTime());
                 nm.setAverageJobWaitTime(jm.getAverageJobWaitTime());

http://git-wip-us.apache.org/repos/asf/ignite/blob/0295518b/modules/core/src/main/java/org/apache/ignite/internal/processors/jobmetrics/GridJobMetrics.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/jobmetrics/GridJobMetrics.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/jobmetrics/GridJobMetrics.java
index 2ad8ca7..1700ad9 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/jobmetrics/GridJobMetrics.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/jobmetrics/GridJobMetrics.java
@@ -87,6 +87,9 @@ public class GridJobMetrics {
     private double avgJobExecTime;
 
     /** */
+    private long totalJobExecTime;
+
+    /** */
     private long totalIdleTime;
 
     /** */
@@ -247,6 +250,15 @@ public class GridJobMetrics {
     }
 
     /**
+     * Gets total jobs execution time.
+     *
+     * @return Total jobs execution time.
+     */
+    public long getTotalJobsExecutionTime() {
+        return totalJobExecTime;
+    }
+
+    /**
      * Gets total idle time.
      *
      * @return Total idle time.
@@ -421,6 +433,13 @@ public class GridJobMetrics {
     }
 
     /**
+     * @param totalJobExecTime The totalJobExecTime to set.
+     */
+    public void setTotalJobsExecutionTime(long totalJobExecTime) {
+        this.totalJobExecTime = totalJobExecTime;
+    }
+
+    /**
      * @param totalIdleTime The totalIdleTime to set.
      */
     void setTotalIdleTime(long totalIdleTime) {
@@ -445,4 +464,4 @@ public class GridJobMetrics {
     @Override public String toString() {
         return S.toString(GridJobMetrics.class, this);
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/0295518b/modules/core/src/main/java/org/apache/ignite/internal/processors/jobmetrics/GridJobMetricsProcessor.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/jobmetrics/GridJobMetricsProcessor.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/jobmetrics/GridJobMetricsProcessor.java
index c40cfda..5422310 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/jobmetrics/GridJobMetricsProcessor.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/jobmetrics/GridJobMetricsProcessor.java
@@ -238,6 +238,9 @@ public class GridJobMetricsProcessor extends 
GridProcessorAdapter {
         /** */
         private int totalRejectedJobs;
 
+        /** */
+        private long totalExecTime;
+
         /**
          * @param size Size (should be power of 2).
          */
@@ -258,6 +261,7 @@ public class GridJobMetricsProcessor extends 
GridProcessorAdapter {
             totalFinishedJobs += s.getFinishedJobs();
             totalCancelledJobs += s.getCancelJobs();
             totalRejectedJobs += s.getRejectJobs();
+            totalExecTime += s.getExecutionTime();
         }
 
         /**
@@ -277,7 +281,7 @@ public class GridJobMetricsProcessor extends 
GridProcessorAdapter {
                 rdc.collect(s);
             }
 
-            rdc.collectTotals(totalFinishedJobs, totalCancelledJobs, 
totalRejectedJobs);
+            rdc.collectTotals(totalFinishedJobs, totalCancelledJobs, 
totalRejectedJobs, totalExecTime);
         }
     }
 
@@ -371,11 +375,12 @@ public class GridJobMetricsProcessor extends 
GridProcessorAdapter {
          * @param totalCancelledJobs Cancelled jobs.
          * @param totalRejectedJobs Rejected jobs.
          */
-        void collectTotals(int totalFinishedJobs, int totalCancelledJobs, int 
totalRejectedJobs) {
+        void collectTotals(int totalFinishedJobs, int totalCancelledJobs, int 
totalRejectedJobs, long totalExecTime) {
             // Totals.
             m.setTotalExecutedJobs(m.getTotalExecutedJobs() + 
totalFinishedJobs);
             m.setTotalCancelledJobs(m.getTotalCancelledJobs() + 
totalCancelledJobs);
             m.setTotalRejectedJobs(m.getTotalRejectedJobs() + 
totalRejectedJobs);
+            m.setTotalJobsExecutionTime(m.getTotalJobsExecutionTime() + 
totalExecTime);
         }
 
         /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/0295518b/modules/core/src/main/java/org/apache/ignite/mxbean/ClusterLocalNodeMetricsMXBean.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/mxbean/ClusterLocalNodeMetricsMXBean.java
 
b/modules/core/src/main/java/org/apache/ignite/mxbean/ClusterLocalNodeMetricsMXBean.java
deleted file mode 100644
index ea3a57a..0000000
--- 
a/modules/core/src/main/java/org/apache/ignite/mxbean/ClusterLocalNodeMetricsMXBean.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/*
- * 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.mxbean;
-
-import org.apache.ignite.cluster.ClusterMetrics;
-
-/**
- * MBean for local node metrics.
- */
-@MXBeanDescription("MBean that provides access to all local node metrics.")
-public interface ClusterLocalNodeMetricsMXBean extends ClusterMetrics {
-    /** {@inheritDoc} */
-    @MXBeanDescription("Last update time of this node metrics.")
-    public long getLastUpdateTime();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Maximum number of jobs that ever ran concurrently on 
this node.")
-    public int getMaximumActiveJobs();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Number of currently active jobs concurrently executing 
on the node.")
-    public int getCurrentActiveJobs();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Average number of active jobs concurrently executing 
on the node.")
-    public float getAverageActiveJobs();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Maximum number of waiting jobs this node had.")
-    public int getMaximumWaitingJobs();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Number of queued jobs currently waiting to be 
executed.")
-    public int getCurrentWaitingJobs();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Average number of waiting jobs this node had queued.")
-    public float getAverageWaitingJobs();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Maximum number of jobs rejected at once during a 
single collision resolution operation.")
-    public int getMaximumRejectedJobs();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Number of jobs rejected after more recent collision 
resolution operation.")
-    public int getCurrentRejectedJobs();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Average number of jobs this node rejects during 
collision resolution operations.")
-    public float getAverageRejectedJobs();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription(
-        "Total number of jobs this node rejects during collision resolution 
operations since node startup.")
-    public int getTotalRejectedJobs();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Maximum number of cancelled jobs this node ever had 
running concurrently.")
-    public int getMaximumCancelledJobs();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Number of cancelled jobs that are still running.")
-    public int getCurrentCancelledJobs();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Average number of cancelled jobs this node ever had 
running concurrently.")
-    public float getAverageCancelledJobs();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Total number of cancelled jobs since node startup.")
-    public int getTotalCancelledJobs();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Total number of jobs handled by the node.")
-    public int getTotalExecutedJobs();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Maximum time a job ever spent waiting in a queue to be 
executed.")
-    public long getMaximumJobWaitTime();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Current wait time of oldest job.")
-    public long getCurrentJobWaitTime();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Average time jobs spend waiting in the queue to be 
executed.")
-    public double getAverageJobWaitTime();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Time it took to execute the longest job on the node.")
-    public long getMaximumJobExecuteTime();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Longest time a current job has been executing for.")
-    public long getCurrentJobExecuteTime();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Average time a job takes to execute on the node.")
-    public double getAverageJobExecuteTime();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Total number of tasks handled by the node.")
-    public int getTotalExecutedTasks();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Total time this node spent executing jobs.")
-    public long getTotalBusyTime();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Total time this node spent idling (not executing any 
jobs).")
-    public long getTotalIdleTime();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Time this node spend idling since executing last job.")
-    public long getCurrentIdleTime();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Percentage of time this node is busy executing jobs 
vs. idling.")
-    public float getBusyTimePercentage();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Percentage of time this node is idling vs. executing 
jobs.")
-    public float getIdleTimePercentage();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("The number of CPUs available to the Java Virtual 
Machine.")
-    public int getTotalCpus();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("The system load average; or a negative value if not 
available.")
-    public double getCurrentCpuLoad();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Average of CPU load values over all metrics kept in 
the history.")
-    public double getAverageCpuLoad();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Average time spent in CG since the last update.")
-    public double getCurrentGcCpuLoad();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("The initial size of memory in bytes; -1 if undefined.")
-    public long getHeapMemoryInitialized();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Current heap size that is used for object allocation.")
-    public long getHeapMemoryUsed();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("The amount of committed memory in bytes.")
-    public long getHeapMemoryCommitted();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("The maximum amount of memory in bytes; -1 if 
undefined.")
-    public long getHeapMemoryMaximum();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("The total amount of memory in bytes; -1 if undefined.")
-    public long getHeapMemoryTotal();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("The initial size of memory in bytes; -1 if undefined.")
-    public long getNonHeapMemoryInitialized();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Current non-heap memory size that is used by Java VM.")
-    public long getNonHeapMemoryUsed();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Amount of non-heap memory in bytes that is committed 
for the JVM to use.")
-    public long getNonHeapMemoryCommitted();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Maximum amount of non-heap memory in bytes that can " +
-        "be used for memory management. -1 if undefined.")
-    public long getNonHeapMemoryMaximum();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Total amount of non-heap memory in bytes that can " +
-        "be used for memory management. -1 if undefined.")
-    public long getNonHeapMemoryTotal();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Uptime of the JVM in milliseconds.")
-    public long getUpTime();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Start time of the JVM in milliseconds.")
-    public long getStartTime();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Current number of live threads.")
-    public int getCurrentThreadCount();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("The peak live thread count.")
-    public int getMaximumThreadCount();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("The total number of threads started.")
-    public long getTotalStartedThreadCount();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Current number of live daemon threads.")
-    public int getCurrentDaemonThreadCount();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Last data version.")
-    public long getLastDataVersion();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Sent messages count.")
-    public int getSentMessagesCount();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Sent bytes count.")
-    public long getSentBytesCount();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Received messages count.")
-    public int getReceivedMessagesCount();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Received bytes count.")
-    public long getReceivedBytesCount();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Outbound messages queue size.")
-    public int getOutboundMessagesQueueSize();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Start time of the grid node in milliseconds.")
-    public long getNodeStartTime();
-
-    /** {@inheritDoc} */
-    @MXBeanDescription("Total number of nodes.")
-    public int getTotalNodes();
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/0295518b/modules/core/src/main/java/org/apache/ignite/mxbean/ClusterMetricsMXBean.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/mxbean/ClusterMetricsMXBean.java 
b/modules/core/src/main/java/org/apache/ignite/mxbean/ClusterMetricsMXBean.java
new file mode 100644
index 0000000..21c05db
--- /dev/null
+++ 
b/modules/core/src/main/java/org/apache/ignite/mxbean/ClusterMetricsMXBean.java
@@ -0,0 +1,257 @@
+/*
+ * 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.mxbean;
+
+import org.apache.ignite.cluster.ClusterMetrics;
+
+/**
+ * MBean for local node metrics.
+ */
+@MXBeanDescription("MBean that provides access to all local node metrics.")
+public interface ClusterMetricsMXBean extends ClusterMetrics {
+    /** {@inheritDoc} */
+    @MXBeanDescription("Last update time of this node metrics.")
+    public long getLastUpdateTime();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Maximum number of jobs that ever ran concurrently on 
this node.")
+    public int getMaximumActiveJobs();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Number of currently active jobs concurrently executing 
on the node.")
+    public int getCurrentActiveJobs();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Average number of active jobs concurrently executing 
on the node.")
+    public float getAverageActiveJobs();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Maximum number of waiting jobs this node had.")
+    public int getMaximumWaitingJobs();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Number of queued jobs currently waiting to be 
executed.")
+    public int getCurrentWaitingJobs();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Average number of waiting jobs this node had queued.")
+    public float getAverageWaitingJobs();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Maximum number of jobs rejected at once during a 
single collision resolution operation.")
+    public int getMaximumRejectedJobs();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Number of jobs rejected after more recent collision 
resolution operation.")
+    public int getCurrentRejectedJobs();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Average number of jobs this node rejects during 
collision resolution operations.")
+    public float getAverageRejectedJobs();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription(
+        "Total number of jobs this node rejects during collision resolution 
operations since node startup.")
+    public int getTotalRejectedJobs();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Maximum number of cancelled jobs this node ever had 
running concurrently.")
+    public int getMaximumCancelledJobs();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Number of cancelled jobs that are still running.")
+    public int getCurrentCancelledJobs();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Average number of cancelled jobs this node ever had 
running concurrently.")
+    public float getAverageCancelledJobs();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Total number of cancelled jobs since node startup.")
+    public int getTotalCancelledJobs();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Total number of jobs handled by the node.")
+    public int getTotalExecutedJobs();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Total time all finished jobs takes to execute on the 
node.")
+    public long getTotalJobsExecutionTime();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Maximum time a job ever spent waiting in a queue to be 
executed.")
+    public long getMaximumJobWaitTime();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Current wait time of oldest job.")
+    public long getCurrentJobWaitTime();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Average time jobs spend waiting in the queue to be 
executed.")
+    public double getAverageJobWaitTime();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Time it took to execute the longest job on the node.")
+    public long getMaximumJobExecuteTime();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Longest time a current job has been executing for.")
+    public long getCurrentJobExecuteTime();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Average time a job takes to execute on the node.")
+    public double getAverageJobExecuteTime();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Total number of tasks handled by the node.")
+    public int getTotalExecutedTasks();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Total time this node spent executing jobs.")
+    public long getTotalBusyTime();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Total time this node spent idling (not executing any 
jobs).")
+    public long getTotalIdleTime();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Time this node spend idling since executing last job.")
+    public long getCurrentIdleTime();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Percentage of time this node is busy executing jobs 
vs. idling.")
+    public float getBusyTimePercentage();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Percentage of time this node is idling vs. executing 
jobs.")
+    public float getIdleTimePercentage();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("The number of CPUs available to the Java Virtual 
Machine.")
+    public int getTotalCpus();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("The system load average; or a negative value if not 
available.")
+    public double getCurrentCpuLoad();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Average of CPU load values over all metrics kept in 
the history.")
+    public double getAverageCpuLoad();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Average time spent in CG since the last update.")
+    public double getCurrentGcCpuLoad();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("The initial size of memory in bytes; -1 if undefined.")
+    public long getHeapMemoryInitialized();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Current heap size that is used for object allocation.")
+    public long getHeapMemoryUsed();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("The amount of committed memory in bytes.")
+    public long getHeapMemoryCommitted();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("The maximum amount of memory in bytes; -1 if 
undefined.")
+    public long getHeapMemoryMaximum();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("The total amount of memory in bytes; -1 if undefined.")
+    public long getHeapMemoryTotal();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("The initial size of memory in bytes; -1 if undefined.")
+    public long getNonHeapMemoryInitialized();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Current non-heap memory size that is used by Java VM.")
+    public long getNonHeapMemoryUsed();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Amount of non-heap memory in bytes that is committed 
for the JVM to use.")
+    public long getNonHeapMemoryCommitted();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Maximum amount of non-heap memory in bytes that can " +
+        "be used for memory management. -1 if undefined.")
+    public long getNonHeapMemoryMaximum();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Total amount of non-heap memory in bytes that can " +
+        "be used for memory management. -1 if undefined.")
+    public long getNonHeapMemoryTotal();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Uptime of the JVM in milliseconds.")
+    public long getUpTime();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Start time of the JVM in milliseconds.")
+    public long getStartTime();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Current number of live threads.")
+    public int getCurrentThreadCount();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("The peak live thread count.")
+    public int getMaximumThreadCount();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("The total number of threads started.")
+    public long getTotalStartedThreadCount();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Current number of live daemon threads.")
+    public int getCurrentDaemonThreadCount();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Last data version.")
+    public long getLastDataVersion();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Sent messages count.")
+    public int getSentMessagesCount();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Sent bytes count.")
+    public long getSentBytesCount();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Received messages count.")
+    public int getReceivedMessagesCount();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Received bytes count.")
+    public long getReceivedBytesCount();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Outbound messages queue size.")
+    public int getOutboundMessagesQueueSize();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Start time of the grid node in milliseconds.")
+    public long getNodeStartTime();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Total number of nodes.")
+    public int getTotalNodes();
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/0295518b/modules/core/src/test/java/org/apache/ignite/internal/ClusterNodeMetricsSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/ClusterNodeMetricsSelfTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/ClusterNodeMetricsSelfTest.java
index 1352c37..2e4f248 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/ClusterNodeMetricsSelfTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/ClusterNodeMetricsSelfTest.java
@@ -218,6 +218,7 @@ public class ClusterNodeMetricsSelfTest extends 
GridCommonAbstractTest {
         assert metrics.getTotalExecutedJobs() == 1;
         assert metrics.getTotalRejectedJobs() == 0;
         assert metrics.getTotalExecutedTasks() == 1;
+        assert metrics.getTotalJobsExecutionTime() > 0;
 
         assertTrue("MaximumJobExecuteTime=" + 
metrics.getMaximumJobExecuteTime() +
             " is less than AverageJobExecuteTime=" + 
metrics.getAverageJobExecuteTime(),
@@ -274,6 +275,7 @@ public class ClusterNodeMetricsSelfTest extends 
GridCommonAbstractTest {
         assert metrics.getTotalExecutedJobs() == 0;
         assert metrics.getTotalRejectedJobs() == 0;
         assert metrics.getTotalExecutedTasks() == 0;
+        assert metrics.getTotalJobsExecutionTime() == 0;
 
         assertTrue("MaximumJobExecuteTime=" + 
metrics.getMaximumJobExecuteTime() +
             " is less than AverageJobExecuteTime=" + 
metrics.getAverageJobExecuteTime(),
@@ -375,4 +377,4 @@ public class ClusterNodeMetricsSelfTest extends 
GridCommonAbstractTest {
     private static class TestInternalTask extends GridTestTask {
         // No-op.
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/0295518b/modules/core/src/test/java/org/apache/ignite/spi/discovery/ClusterMetricsSnapshotSerializeSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/test/java/org/apache/ignite/spi/discovery/ClusterMetricsSnapshotSerializeSelfTest.java
 
b/modules/core/src/test/java/org/apache/ignite/spi/discovery/ClusterMetricsSnapshotSerializeSelfTest.java
index a1e36a3..25de2c7 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/spi/discovery/ClusterMetricsSnapshotSerializeSelfTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/spi/discovery/ClusterMetricsSnapshotSerializeSelfTest.java
@@ -143,6 +143,8 @@ public class ClusterMetricsSnapshotSerializeSelfTest 
extends GridCommonAbstractT
         metrics.setOutboundMessagesQueueSize(46);
         metrics.setNonHeapMemoryTotal(47);
         metrics.setHeapMemoryTotal(48);
+        metrics.setTotalNodes(49);
+        metrics.setTotalJobsExecutionTime(50);
 
         return metrics;
     }
@@ -198,6 +200,8 @@ public class ClusterMetricsSnapshotSerializeSelfTest 
extends GridCommonAbstractT
             obj.getReceivedBytesCount() == obj1.getReceivedBytesCount() &&
             obj.getOutboundMessagesQueueSize() == 
obj1.getOutboundMessagesQueueSize() &&
             obj.getNonHeapMemoryTotal() == obj1.getNonHeapMemoryTotal() &&
-            obj.getHeapMemoryTotal() == obj1.getHeapMemoryTotal();
+            obj.getHeapMemoryTotal() == obj1.getHeapMemoryTotal() &&
+            obj.getTotalNodes() == obj1.getTotalNodes() &&
+            obj.getTotalJobsExecutionTime() == 
obj1.getTotalJobsExecutionTime();
     }
-}
\ No newline at end of file
+}

Reply via email to