http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2a599ec/modules/core/src/main/java/org/gridgain/grid/kernal/ClusterLocalNodeMetrics.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/gridgain/grid/kernal/ClusterLocalNodeMetrics.java
 
b/modules/core/src/main/java/org/gridgain/grid/kernal/ClusterLocalNodeMetrics.java
deleted file mode 100644
index df3d37b..0000000
--- 
a/modules/core/src/main/java/org/gridgain/grid/kernal/ClusterLocalNodeMetrics.java
+++ /dev/null
@@ -1,311 +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.gridgain.grid.kernal;
-
-import org.apache.ignite.cluster.*;
-import org.gridgain.grid.util.typedef.internal.*;
-
-/**
- * Local node metrics MBean.
- */
-public class ClusterLocalNodeMetrics implements ClusterNodeMetricsMBean {
-    /** */
-    private static final long serialVersionUID = 0L;
-
-    /** Grid node. */
-    private final ClusterNode node;
-
-    /**
-     * @param node Node to manage.
-     */
-    public ClusterLocalNodeMetrics(ClusterNode node) {
-        assert node != null;
-
-        this.node = node;
-    }
-
-    /** {@inheritDoc} */
-    @Override public int getTotalCpus() {
-        return node.metrics().getTotalCpus();
-    }
-
-    /** {@inheritDoc} */
-    @Override public float getAverageActiveJobs() {
-        return node.metrics().getAverageActiveJobs();
-    }
-
-    /** {@inheritDoc} */
-    @Override public float getAverageCancelledJobs() {
-        return node.metrics().getAverageCancelledJobs();
-    }
-
-    /** {@inheritDoc} */
-    @Override public double getAverageJobExecuteTime() {
-        return node.metrics().getAverageJobExecuteTime();
-    }
-
-    /** {@inheritDoc} */
-    @Override public double getAverageJobWaitTime() {
-        return node.metrics().getAverageJobWaitTime();
-    }
-
-    /** {@inheritDoc} */
-    @Override public float getAverageRejectedJobs() {
-        return node.metrics().getAverageRejectedJobs();
-    }
-
-    /** {@inheritDoc} */
-    @Override public float getAverageWaitingJobs() {
-        return node.metrics().getAverageWaitingJobs();
-    }
-
-    /** {@inheritDoc} */
-    @Override public float getBusyTimePercentage() {
-        return node.metrics().getBusyTimePercentage() * 100;
-    }
-
-    /** {@inheritDoc} */
-    @Override public int getCurrentActiveJobs() {
-        return node.metrics().getCurrentActiveJobs();
-    }
-
-    /** {@inheritDoc} */
-    @Override public int getCurrentCancelledJobs() {
-        return node.metrics().getCurrentCancelledJobs();
-    }
-
-    /** {@inheritDoc} */
-    @Override public long getCurrentIdleTime() {
-        return node.metrics().getCurrentIdleTime();
-    }
-
-    /** {@inheritDoc} */
-    @Override public long getCurrentJobExecuteTime() {
-        return node.metrics().getCurrentJobExecuteTime();
-    }
-
-    /** {@inheritDoc} */
-    @Override public long getCurrentJobWaitTime() {
-        return node.metrics().getCurrentJobWaitTime();
-    }
-
-    /** {@inheritDoc} */
-    @Override public int getCurrentRejectedJobs() {
-        return node.metrics().getCurrentRejectedJobs();
-    }
-
-    /** {@inheritDoc} */
-    @Override public int getCurrentWaitingJobs() {
-        return node.metrics().getCurrentWaitingJobs();
-    }
-
-    /** {@inheritDoc} */
-    @Override public int getTotalExecutedTasks() {
-        return node.metrics().getTotalExecutedTasks();
-    }
-
-    /** {@inheritDoc} */
-    @Override public int getCurrentDaemonThreadCount() {
-        return node.metrics().getCurrentDaemonThreadCount();
-    }
-
-    /** {@inheritDoc} */
-    @Override public long getHeapMemoryCommitted() {
-        return node.metrics().getHeapMemoryCommitted();
-    }
-
-    /** {@inheritDoc} */
-    @Override public long getHeapMemoryInitialized() {
-        return node.metrics().getHeapMemoryInitialized();
-    }
-
-    /** {@inheritDoc} */
-    @Override public long getHeapMemoryMaximum() {
-        return node.metrics().getHeapMemoryMaximum();
-    }
-
-    /** {@inheritDoc} */
-    @Override public long getHeapMemoryUsed() {
-        return node.metrics().getHeapMemoryUsed();
-    }
-
-    /** {@inheritDoc} */
-    @Override public float getIdleTimePercentage() {
-        return node.metrics().getIdleTimePercentage() * 100;
-    }
-
-    /** {@inheritDoc} */
-    @Override public long getLastUpdateTime() {
-        return node.metrics().getLastUpdateTime();
-    }
-
-    /** {@inheritDoc} */
-    @Override public int getMaximumActiveJobs() {
-        return node.metrics().getMaximumActiveJobs();
-    }
-
-    /** {@inheritDoc} */
-    @Override public int getMaximumCancelledJobs() {
-        return node.metrics().getMaximumCancelledJobs();
-    }
-
-    /** {@inheritDoc} */
-    @Override public long getMaximumJobExecuteTime() {
-        return node.metrics().getMaximumJobExecuteTime();
-    }
-
-    /** {@inheritDoc} */
-    @Override public long getMaximumJobWaitTime() {
-        return node.metrics().getMaximumJobWaitTime();
-    }
-
-    /** {@inheritDoc} */
-    @Override public int getMaximumRejectedJobs() {
-        return node.metrics().getMaximumRejectedJobs();
-    }
-
-    /** {@inheritDoc} */
-    @Override public int getMaximumWaitingJobs() {
-        return node.metrics().getMaximumWaitingJobs();
-    }
-
-    /** {@inheritDoc} */
-    @Override public long getNonHeapMemoryCommitted() {
-        return node.metrics().getNonHeapMemoryCommitted();
-    }
-
-    /** {@inheritDoc} */
-    @Override public long getNonHeapMemoryInitialized() {
-        return node.metrics().getNonHeapMemoryInitialized();
-    }
-
-    /** {@inheritDoc} */
-    @Override public long getNonHeapMemoryMaximum() {
-        return node.metrics().getNonHeapMemoryMaximum();
-    }
-
-    /** {@inheritDoc} */
-    @Override public long getNonHeapMemoryUsed() {
-        return node.metrics().getNonHeapMemoryUsed();
-    }
-
-    /** {@inheritDoc} */
-    @Override public int getMaximumThreadCount() {
-        return node.metrics().getMaximumThreadCount();
-    }
-
-    /** {@inheritDoc} */
-    @Override public long getStartTime() {
-        return node.metrics().getStartTime();
-    }
-
-    /** {@inheritDoc} */
-    @Override public long getNodeStartTime() {
-        return node.metrics().getNodeStartTime();
-    }
-
-    /** {@inheritDoc} */
-    @Override public double getCurrentCpuLoad() {
-        return node.metrics().getCurrentCpuLoad() * 100;
-    }
-
-    /** {@inheritDoc} */
-    @Override public double getAverageCpuLoad() {
-        return node.metrics().getAverageCpuLoad() * 100;
-    }
-
-    /** {@inheritDoc} */
-    @Override public double getCurrentGcCpuLoad() {
-        return node.metrics().getCurrentGcCpuLoad() * 100;
-    }
-
-    /** {@inheritDoc} */
-    @Override public int getCurrentThreadCount() {
-        return node.metrics().getCurrentThreadCount();
-    }
-
-    /** {@inheritDoc} */
-    @Override public long getTotalBusyTime() {
-        return node.metrics().getTotalBusyTime();
-    }
-
-    /** {@inheritDoc} */
-    @Override public int getTotalCancelledJobs() {
-        return node.metrics().getTotalCancelledJobs();
-    }
-
-    /** {@inheritDoc} */
-    @Override public int getTotalExecutedJobs() {
-        return node.metrics().getTotalExecutedJobs();
-    }
-
-    /** {@inheritDoc} */
-    @Override public long getTotalIdleTime() {
-        return node.metrics().getTotalIdleTime();
-    }
-
-    /** {@inheritDoc} */
-    @Override public int getTotalRejectedJobs() {
-        return node.metrics().getTotalRejectedJobs();
-    }
-
-    /** {@inheritDoc} */
-    @Override public long getTotalStartedThreadCount() {
-        return node.metrics().getTotalStartedThreadCount();
-    }
-
-    /** {@inheritDoc} */
-    @Override public long getUpTime() {
-        return node.metrics().getUpTime();
-    }
-
-    /** {@inheritDoc} */
-    @Override public long getLastDataVersion() {
-        return node.metrics().getLastDataVersion();
-    }
-
-    /** {@inheritDoc} */
-    @Override public int getSentMessagesCount() {
-        return node.metrics().getSentMessagesCount();
-    }
-
-    /** {@inheritDoc} */
-    @Override public long getSentBytesCount() {
-        return node.metrics().getSentBytesCount();
-    }
-
-    /** {@inheritDoc} */
-    @Override public int getReceivedMessagesCount() {
-        return node.metrics().getReceivedMessagesCount();
-    }
-
-    /** {@inheritDoc} */
-    @Override public long getReceivedBytesCount() {
-        return node.metrics().getReceivedBytesCount();
-    }
-
-    /** {@inheritDoc} */
-    @Override public int getOutboundMessagesQueueSize() {
-        return node.metrics().getOutboundMessagesQueueSize();
-    }
-
-    /** {@inheritDoc} */
-    @Override public String toString() {
-        return S.toString(ClusterLocalNodeMetrics.class, this);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2a599ec/modules/core/src/main/java/org/gridgain/grid/kernal/ClusterMetricsImpl.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/gridgain/grid/kernal/ClusterMetricsImpl.java 
b/modules/core/src/main/java/org/gridgain/grid/kernal/ClusterMetricsImpl.java
index 5f6ac91..faf7896 100644
--- 
a/modules/core/src/main/java/org/gridgain/grid/kernal/ClusterMetricsImpl.java
+++ 
b/modules/core/src/main/java/org/gridgain/grid/kernal/ClusterMetricsImpl.java
@@ -260,7 +260,7 @@ class ClusterMetricsImpl implements ClusterMetrics {
         int size = nodes.size();
 
         for (ClusterNode node : nodes) {
-            ClusterNodeMetrics m = node.metrics();
+            ClusterNodeMetricsMBean m = node.metrics();
 
             minActJobs = min(minActJobs, m.getCurrentActiveJobs());
             maxActJobs = max(maxActJobs, m.getCurrentActiveJobs());

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2a599ec/modules/core/src/main/java/org/gridgain/grid/kernal/ClusterNodeMetricsMBean.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/gridgain/grid/kernal/ClusterNodeMetricsMBean.java
 
b/modules/core/src/main/java/org/gridgain/grid/kernal/ClusterNodeMetricsMBean.java
deleted file mode 100644
index dc6579b..0000000
--- 
a/modules/core/src/main/java/org/gridgain/grid/kernal/ClusterNodeMetricsMBean.java
+++ /dev/null
@@ -1,29 +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.gridgain.grid.kernal;
-
-import org.apache.ignite.cluster.*;
-import org.apache.ignite.mbean.*;
-
-/**
- * MBean for local node metrics.
- */
-@IgniteMBeanDescription("MBean that provides access to all local node 
metrics.")
-public interface ClusterNodeMetricsMBean extends ClusterNodeMetrics {
-    // No-op.
-}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2a599ec/modules/core/src/main/java/org/gridgain/grid/kernal/GridKernal.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/gridgain/grid/kernal/GridKernal.java 
b/modules/core/src/main/java/org/gridgain/grid/kernal/GridKernal.java
index f54d1e5..7745019 100644
--- a/modules/core/src/main/java/org/gridgain/grid/kernal/GridKernal.java
+++ b/modules/core/src/main/java/org/gridgain/grid/kernal/GridKernal.java
@@ -960,7 +960,7 @@ public class GridKernal extends ClusterGroupAdapter 
implements GridEx, IgniteMBe
 
                 @Override protected void safeRun() {
                     if (log.isInfoEnabled()) {
-                        ClusterNodeMetrics m = localNode().metrics();
+                        ClusterNodeMetricsMBean m = localNode().metrics();
 
                         double cpuLoadPct = m.getCurrentCpuLoad() * 100;
                         double avgCpuLoadPct = m.getAverageCpuLoad() * 100;
@@ -1446,7 +1446,7 @@ public class GridKernal extends ClusterGroupAdapter 
implements GridEx, IgniteMBe
 
     /** @throws IgniteCheckedException If registration failed. */
     private void registerLocalNodeMBean() throws IgniteCheckedException {
-        ClusterNodeMetricsMBean mbean = new 
ClusterLocalNodeMetrics(ctx.discovery().localNode());
+        ClusterNodeMetricsMBean mbean = ctx.discovery().localNode().metrics();
 
         try {
             locNodeMBean = U.registerMBean(

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2a599ec/modules/core/src/main/java/org/gridgain/grid/kernal/managers/discovery/GridDiscoveryManager.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/gridgain/grid/kernal/managers/discovery/GridDiscoveryManager.java
 
b/modules/core/src/main/java/org/gridgain/grid/kernal/managers/discovery/GridDiscoveryManager.java
index 79eb973..7b0c31b 100644
--- 
a/modules/core/src/main/java/org/gridgain/grid/kernal/managers/discovery/GridDiscoveryManager.java
+++ 
b/modules/core/src/main/java/org/gridgain/grid/kernal/managers/discovery/GridDiscoveryManager.java
@@ -494,7 +494,7 @@ public class GridDiscoveryManager extends 
GridManagerAdapter<DiscoverySpi> {
             private final long startTime = U.currentTimeMillis();
 
             /** {@inheritDoc} */
-            @Override public ClusterNodeMetrics getMetrics() {
+            @Override public ClusterNodeMetricsMBean getMetrics() {
                 GridJobMetrics jm = ctx.jobMetric().getJobMetrics();
 
                 DiscoveryNodeMetricsAdapter nm = new 
DiscoveryNodeMetricsAdapter();

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2a599ec/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/CacheMetricsMxBeanImpl.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/CacheMetricsMxBeanImpl.java
 
b/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/CacheMetricsMxBeanImpl.java
new file mode 100644
index 0000000..c5c1b2b
--- /dev/null
+++ 
b/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/CacheMetricsMxBeanImpl.java
@@ -0,0 +1,405 @@
+/*
+ * 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.gridgain.grid.kernal.processors.cache;
+
+import org.gridgain.grid.cache.*;
+import org.gridgain.grid.util.tostring.*;
+import org.gridgain.grid.util.typedef.internal.*;
+
+import javax.cache.management.CacheStatisticsMXBean;
+import java.io.*;
+import java.util.concurrent.atomic.AtomicLong;
+
+/**
+ * Adapter for cache metrics.
+ */
+public class CacheMetricsMxBeanImpl implements CacheMetricsMxBean, 
CacheStatisticsMXBean, Externalizable {
+    /** */
+    private static final long NANOS_IN_MICROSECOND = 1000L;
+
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Number of reads. */
+    private AtomicLong reads = new AtomicLong();
+
+    /** Number of writes. */
+    private AtomicLong writes = new AtomicLong();
+
+    /** Number of hits. */
+    private AtomicLong hits = new AtomicLong();
+
+    /** Number of misses. */
+    private AtomicLong misses = new AtomicLong();
+
+    /** Number of transaction commits. */
+    private AtomicLong txCommits = new AtomicLong();
+
+    /** Number of transaction rollbacks. */
+    private AtomicLong txRollbacks = new AtomicLong();
+
+    /** Number of evictions. */
+    private AtomicLong evictCnt = new AtomicLong();
+
+    /** Number of removed entries. */
+    private AtomicLong rmCnt = new AtomicLong();
+
+    /** Put time taken nanos. */
+    private AtomicLong putTimeNanos = new AtomicLong();
+
+    /** Get time taken nanos. */
+    private AtomicLong getTimeNanos = new AtomicLong();
+
+    /** Remove time taken nanos. */
+    private AtomicLong removeTimeNanos = new AtomicLong();
+
+    /** Commit transaction time taken nanos. */
+    private AtomicLong commitTimeNanos = new AtomicLong();
+
+    /** Commit transaction time taken nanos. */
+    private AtomicLong rollbackTimeNanos = new AtomicLong();
+
+    /** Cache metrics. */
+    @GridToStringExclude
+    private transient CacheMetricsMxBeanImpl delegate;
+
+    /**
+     * No-args constructor.
+     */
+    public CacheMetricsMxBeanImpl() {
+        delegate = null;
+    }
+
+    /**
+     * @param delegate Metrics to delegate to.
+     */
+    public void delegate(CacheMetricsMxBeanImpl delegate) {
+        this.delegate = delegate;
+    }
+
+    /** {@inheritDoc} */
+    @Override public float getAverageTxCommitTime() {
+        long timeNanos = commitTimeNanos.get();
+        long commitsCnt = txCommits.get();
+
+        if (timeNanos == 0 || commitsCnt == 0)
+            return 0;
+
+        return ((1f * timeNanos) / commitsCnt) / NANOS_IN_MICROSECOND;
+    }
+
+    /** {@inheritDoc} */
+    @Override public float getAverageTxRollbackTime() {
+        long timeNanos = rollbackTimeNanos.get();
+        long rollbacksCnt = txRollbacks.get();
+
+        if (timeNanos == 0 || rollbacksCnt == 0)
+            return 0;
+
+        return ((1f * timeNanos) / rollbacksCnt) / NANOS_IN_MICROSECOND;
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getCacheTxCommits() {
+        return txCommits.get();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getCacheTxRollbacks() {
+        return txRollbacks.get();
+    }
+
+    /** {@inheritDoc} */
+    @Override public void clear() {
+        reads.set(0);
+        writes.set(0);
+        rmCnt.set(0);
+        hits.set(0);
+        misses.set(0);
+        evictCnt.set(0);
+        txCommits.set(0);
+        txRollbacks.set(0);
+        putTimeNanos.set(0);
+        removeTimeNanos.set(0);
+        getTimeNanos.set(0);
+        commitTimeNanos.set(0);
+        rollbackTimeNanos.set(0);
+
+        if (delegate != null)
+            delegate.clear();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getCacheHits() {
+        return hits.get();
+    }
+
+    /** {@inheritDoc} */
+    @Override public float getCacheHitPercentage() {
+        long hits0 = hits.get();
+        long gets0 = reads.get();
+
+        if (hits0 == 0)
+            return 0;
+
+        return (float) hits0 / gets0 * 100.0f;
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getCacheMisses() {
+        return misses.get();
+    }
+
+    /** {@inheritDoc} */
+    @Override public float getCacheMissPercentage() {
+        long misses0 = misses.get();
+        long reads0 = reads.get();
+
+        if (misses0 == 0) {
+            return 0;
+        }
+
+        return (float) misses0 / reads0 * 100.0f;
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getCacheGets() {
+        return reads.get();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getCachePuts() {
+        return writes.get();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getCacheRemovals() {
+        return rmCnt.get();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getCacheEvictions() {
+        return evictCnt.get();
+    }
+
+    /** {@inheritDoc} */
+    @Override public float getAverageGetTime() {
+        long timeNanos = getTimeNanos.get();
+        long readsCnt = reads.get();
+
+        if (timeNanos == 0 || readsCnt == 0)
+            return 0;
+
+        return ((1f * timeNanos) / readsCnt) / NANOS_IN_MICROSECOND;
+    }
+
+    /** {@inheritDoc} */
+    @Override public float getAveragePutTime() {
+        long timeNanos = putTimeNanos.get();
+        long putsCnt = writes.get();
+
+        if (timeNanos == 0 || putsCnt == 0)
+            return 0;
+
+        return ((1f * timeNanos) / putsCnt) / NANOS_IN_MICROSECOND;
+    }
+
+    /** {@inheritDoc} */
+    @Override public float getAverageRemoveTime() {
+        long timeNanos = removeTimeNanos.get();
+        long removesCnt = rmCnt.get();
+
+        if (timeNanos == 0 || removesCnt == 0)
+            return 0;
+
+        return ((1f * timeNanos) / removesCnt) / NANOS_IN_MICROSECOND;
+    }
+
+    /**
+     * Cache read callback.
+     * @param isHit Hit or miss flag.
+     */
+    public void onRead(boolean isHit) {
+        reads.incrementAndGet();
+
+        if (isHit)
+            hits.incrementAndGet();
+        else
+            misses.incrementAndGet();
+
+        if (delegate != null)
+            delegate.onRead(isHit);
+    }
+
+    /**
+     * Cache write callback.
+     */
+    public void onWrite() {
+        writes.incrementAndGet();
+
+        if (delegate != null)
+            delegate.onWrite();
+    }
+
+    /**
+     * Cache remove callback.
+     */
+    public void onRemove(){
+        rmCnt.incrementAndGet();
+
+        if (delegate != null)
+            delegate.onRemove();
+    }
+
+    /**
+     * Cache remove callback.
+     */
+    public void onEvict() {
+        evictCnt.incrementAndGet();
+
+        if (delegate != null)
+            delegate.onEvict();
+    }
+
+    /**
+     * Transaction commit callback.
+     */
+    public void onTxCommit(long duration) {
+        txCommits.incrementAndGet();
+        commitTimeNanos.addAndGet(duration);
+
+        if (delegate != null) {
+            delegate.onTxCommit(duration);
+        }
+    }
+
+    /**
+     * Transaction rollback callback.
+     */
+    public void onTxRollback(long duration) {
+        txRollbacks.incrementAndGet();
+        rollbackTimeNanos.addAndGet(duration);
+
+        if (delegate != null)
+            delegate.onTxRollback(duration);
+    }
+
+
+    /**
+     * Increments the get time accumulator.
+     *
+     * @param duration the time taken in nanoseconds.
+     */
+    public void addGetTimeNanos(long duration) {
+        getTimeNanos.addAndGet(duration);
+
+        if (delegate != null)
+            delegate.addGetTimeNanos(duration);
+    }
+
+    /**
+     * Increments the put time accumulator.
+     *
+     * @param duration the time taken in nanoseconds.
+     */
+    public void addPutTimeNanos(long duration) {
+        putTimeNanos.addAndGet(duration);
+
+        if (delegate != null)
+            delegate.addPutTimeNanos(duration);
+    }
+
+    /**
+     * Increments the remove time accumulator.
+     *
+     * @param duration the time taken in nanoseconds.
+     */
+    public void addRemoveTimeNanos(long duration) {
+        removeTimeNanos.addAndGet(duration);
+
+        if (delegate != null)
+            delegate.addRemoveTimeNanos(duration);
+    }
+
+    /**
+     * Increments remove and get time accumulators.
+     *
+     * @param duration the time taken in nanoseconds.
+     */
+    public void addRemoveAndGetTimeNanos(long duration) {
+        removeTimeNanos.addAndGet(duration);
+        getTimeNanos.addAndGet(duration);
+
+        if (delegate != null)
+            delegate.addRemoveAndGetTimeNanos(duration);
+    }
+
+    /**
+     * Increments put and get time accumulators.
+     *
+     * @param duration the time taken in nanoseconds.
+     */
+    public void addPutAndGetTimeNanos(long duration) {
+        putTimeNanos.addAndGet(duration);
+        getTimeNanos.addAndGet(duration);
+
+        if (delegate != null)
+            delegate.addPutAndGetTimeNanos(duration);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void writeExternal(ObjectOutput out) throws IOException {
+        out.writeLong(reads.get());
+        out.writeLong(writes.get());
+        out.writeLong(hits.get());
+        out.writeLong(misses.get());
+        out.writeLong(txCommits.get());
+        out.writeLong(txRollbacks.get());
+        out.writeLong(rmCnt.get());
+        out.writeLong(evictCnt.get());
+
+        out.writeLong(putTimeNanos.get());
+        out.writeLong(getTimeNanos.get());
+        out.writeLong(removeTimeNanos.get());
+        out.writeLong(commitTimeNanos.get());
+        out.writeLong(rollbackTimeNanos.get());
+    }
+
+    /** {@inheritDoc} */
+    @Override public void readExternal(ObjectInput in) throws IOException, 
ClassNotFoundException {
+        reads = new AtomicLong(in.readLong());
+        writes = new AtomicLong(in.readLong());
+        hits = new AtomicLong(in.readLong());
+        misses = new AtomicLong(in.readLong());
+        txCommits = new AtomicLong(in.readLong());
+        txRollbacks = new AtomicLong(in.readLong());
+        rmCnt = new AtomicLong(in.readLong());
+        evictCnt = new AtomicLong(in.readLong());
+
+        putTimeNanos = new AtomicLong(in.readLong());
+        getTimeNanos = new AtomicLong(in.readLong());
+        removeTimeNanos = new AtomicLong(in.readLong());
+        commitTimeNanos = new AtomicLong(in.readLong());
+        rollbackTimeNanos = new AtomicLong(in.readLong());
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(CacheMetricsMxBeanImpl.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2a599ec/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/GridCacheAdapter.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/GridCacheAdapter.java
 
b/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/GridCacheAdapter.java
index ef6b8ba..311accd 100644
--- 
a/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/GridCacheAdapter.java
+++ 
b/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/GridCacheAdapter.java
@@ -146,7 +146,7 @@ public abstract class GridCacheAdapter<K, V> extends 
GridMetadataAwareAdapter im
     protected IgniteConfiguration gridCfg;
 
     /** Cache metrics. */
-    protected volatile GridCacheMetricsAdapter metrics;
+    protected volatile CacheMetricsMxBeanImpl metrics;
 
     /** Logger. */
     protected IgniteLogger log;
@@ -225,7 +225,7 @@ public abstract class GridCacheAdapter<K, V> extends 
GridMetadataAwareAdapter im
 
         log = ctx.gridConfig().getGridLogger().getLogger(getClass());
 
-        metrics = new GridCacheMetricsAdapter();
+        metrics = new CacheMetricsMxBeanImpl();
 
         IgniteFsConfiguration[] ggfsCfgs = gridCfg.getGgfsConfiguration();
 
@@ -1677,7 +1677,7 @@ public abstract class GridCacheAdapter<K, V> extends 
GridMetadataAwareAdapter im
             val = (V)ctx.config().getInterceptor().onGet(key, val);
 
         if (statsEnabled)
-            ctx.cache().metrics0().addGetTimeNanos(System.nanoTime() - start);
+            metrics0().addGetTimeNanos(System.nanoTime() - start);
 
         return val;
     }
@@ -1698,20 +1698,7 @@ public abstract class GridCacheAdapter<K, V> extends 
GridMetadataAwareAdapter im
             });
 
         if (statsEnabled)
-            fut.listenAsync(new CI1<IgniteFuture<V>>() {
-                @Override public void apply(IgniteFuture<V> fut) {
-                    try {
-                        if (!fut.isCancelled()) {
-                            fut.get();
-
-                            
ctx.cache().metrics0().addGetTimeNanos(System.nanoTime() - start);
-                        }
-                    }
-                    catch (IgniteCheckedException ignore){
-                        //No-op.
-                    }
-                }
-            });
+            fut.listenAsync(new UpdateGetTimeStatClosure<V>(metrics0(), 
start));
 
         return fut;
     }
@@ -1728,7 +1715,7 @@ public abstract class GridCacheAdapter<K, V> extends 
GridMetadataAwareAdapter im
             map = interceptGet(keys, map);
 
         if (statsEnabled)
-            ctx.cache().metrics0().addGetTimeNanos(System.nanoTime() - start);
+            metrics0().addGetTimeNanos(System.nanoTime() - start);
 
         return map;
     }
@@ -1749,7 +1736,7 @@ public abstract class GridCacheAdapter<K, V> extends 
GridMetadataAwareAdapter im
             });
 
         if (statsEnabled)
-            fut.listenAsync(new UpdateGetTimeMetricsClosure<Map<K, 
V>>(ctx.cache().metrics0(), start));
+            fut.listenAsync(new UpdateGetTimeStatClosure<Map<K, 
V>>(metrics0(), start));
 
         return fut;
     }
@@ -2139,7 +2126,7 @@ public abstract class GridCacheAdapter<K, V> extends 
GridMetadataAwareAdapter im
         }));
 
         if (statsEnabled)
-            ctx.cache().metrics0().addPutAndGetTimeNanos(System.nanoTime() - 
start);
+            metrics0().addPutAndGetTimeNanos(System.nanoTime() - start);
 
         return prevValue;
     }
@@ -2179,19 +2166,7 @@ public abstract class GridCacheAdapter<K, V> extends 
GridMetadataAwareAdapter im
         IgniteFuture<V> fut = putAsync(key, val, null, -1, filter);
 
         if (statsEnabled)
-            fut.listenAsync(new CI1<IgniteFuture<V>>() {
-                @Override public void apply(IgniteFuture<V> fut) {
-                    try {
-                        if (!fut.isCancelled()) {
-                            fut.get();
-
-                            
ctx.cache().metrics0().addPutAndGetTimeNanos(System.nanoTime() - start);
-                        }
-                    } catch (IgniteCheckedException ignore) {
-                        //No-op.
-                    }
-                }
-            });
+            fut.listenAsync(new UpdatePutAndGetTimeStatClosure<V>(metrics0(), 
start));
 
         return fut;
     }
@@ -2251,7 +2226,7 @@ public abstract class GridCacheAdapter<K, V> extends 
GridMetadataAwareAdapter im
         });
 
         if (statsEnabled)
-            ctx.cache().metrics0().addPutTimeNanos(System.nanoTime() - start);
+            metrics0().addPutTimeNanos(System.nanoTime() - start);
 
         return stored;
     }
@@ -2516,20 +2491,7 @@ public abstract class GridCacheAdapter<K, V> extends 
GridMetadataAwareAdapter im
         IgniteFuture<Boolean> fut = putxAsync(key, val, null, -1, filter);
 
         if (statsEnabled)
-            fut.listenAsync(new CI1<IgniteFuture<Boolean>>() {
-                @Override public void apply(IgniteFuture<Boolean> fut) {
-                    try {
-                        if (!fut.isCancelled()) {
-                            fut.get();
-
-                            
ctx.cache().metrics0().addPutTimeNanos(System.nanoTime() - start);
-                        }
-                    }
-                    catch (IgniteCheckedException ignore) {
-                        //No-op.
-                    }
-                }
-            });
+            fut.listenAsync(new UpdatePutTimeStatClosure<Boolean>(metrics0(), 
start));
 
         return fut;
     }
@@ -2608,20 +2570,7 @@ public abstract class GridCacheAdapter<K, V> extends 
GridMetadataAwareAdapter im
         }));
 
         if(statsEnabled)
-            fut.listenAsync(new CI1<IgniteFuture<V>>() {
-                @Override public void apply(IgniteFuture<V> fut) {
-                    try {
-                        if (!fut.isCancelled()) {
-                            fut.get();
-
-                            
ctx.cache().metrics0().addPutTimeNanos(System.nanoTime() - start);
-                        }
-                    }
-                    catch (IgniteCheckedException ignore) {
-                        //No-op.
-                    }
-                }
-            });
+            fut.listenAsync(new UpdatePutTimeStatClosure<V>(metrics0(), 
start));
 
         return fut;
     }
@@ -2652,7 +2601,7 @@ public abstract class GridCacheAdapter<K, V> extends 
GridMetadataAwareAdapter im
         });
 
         if (statsEnabled && stored)
-            ctx.cache().metrics0().addPutTimeNanos(System.nanoTime() - start);
+            metrics0().addPutTimeNanos(System.nanoTime() - start);
 
         return stored;
     }
@@ -2684,19 +2633,7 @@ public abstract class GridCacheAdapter<K, V> extends 
GridMetadataAwareAdapter im
         });
 
         if (statsEnabled)
-            fut.listenAsync(new CI1<IgniteFuture<Boolean>>() {
-                @Override public void apply(IgniteFuture<Boolean> fut) {
-                    try {
-                        if (!fut.isCancelled()) {
-                            fut.get();
-
-                            
ctx.cache().metrics0().addPutTimeNanos(System.nanoTime() - start);
-                        }
-                    } catch (IgniteCheckedException ignore) {
-                        //No-op.
-                    }
-                }
-            });
+            fut.listenAsync(new UpdatePutTimeStatClosure<Boolean>(metrics0(), 
start));
 
         return fut;
     }
@@ -2751,20 +2688,7 @@ public abstract class GridCacheAdapter<K, V> extends 
GridMetadataAwareAdapter im
         }));
 
         if (statsEnabled)
-            fut.listenAsync(new CI1<IgniteFuture<V>>() {
-                @Override public void apply(IgniteFuture<V> fut) {
-                    try {
-                        if (!fut.isCancelled()) {
-                            fut.get();
-
-                            
ctx.cache().metrics0().addPutAndGetTimeNanos(System.nanoTime() - start);
-                        }
-                    }
-                    catch (IgniteCheckedException ignore) {
-                        //No-op.
-                    }
-                }
-            });
+            fut.listenAsync(new UpdatePutAndGetTimeStatClosure<V>(metrics0(), 
start));
 
         return fut;
     }
@@ -2882,20 +2806,7 @@ public abstract class GridCacheAdapter<K, V> extends 
GridMetadataAwareAdapter im
         });
 
         if (statsEnabled)
-            fut.listenAsync(new CI1<IgniteFuture<Boolean>>() {
-                @Override public void apply(IgniteFuture<Boolean> fut) {
-                    try {
-                        if (!fut.isCancelled()) {
-                            fut.get();
-
-                            
ctx.cache().metrics0().addPutAndGetTimeNanos(System.nanoTime() - start);
-                        }
-                    }
-                    catch (IgniteCheckedException ignore) {
-                        //No-op.
-                    }
-                }
-            });
+            fut.listenAsync(new 
UpdatePutAndGetTimeStatClosure<Boolean>(metrics0(), start));
 
         return fut;
     }
@@ -2928,7 +2839,7 @@ public abstract class GridCacheAdapter<K, V> extends 
GridMetadataAwareAdapter im
         });
 
         if (statsEnabled)
-            ctx.cache().metrics0().addPutTimeNanos(System.nanoTime() - start);
+            metrics0().addPutTimeNanos(System.nanoTime() - start);
     }
 
     /** {@inheritDoc} */
@@ -2991,7 +2902,7 @@ public abstract class GridCacheAdapter<K, V> extends 
GridMetadataAwareAdapter im
         }));
 
         if (statsEnabled)
-            ctx.cache().metrics0().addRemoveAndGetTimeNanos(System.nanoTime() 
- start);
+            metrics0().addRemoveAndGetTimeNanos(System.nanoTime() - start);
 
         return prevVal;
     }
@@ -3005,21 +2916,7 @@ public abstract class GridCacheAdapter<K, V> extends 
GridMetadataAwareAdapter im
         IgniteFuture<V> fut = removeAsync(key, null, filter);
 
         if (statsEnabled)
-            fut.listenAsync(new CI1<IgniteFuture<V>>() {
-                @Override public void apply(IgniteFuture<V> fut) {
-                    try {
-                        if (!fut.isCancelled()) {
-                            fut.get();
-
-                            
ctx.cache().metrics0().addRemoveTimeNanos(System.nanoTime() - start);
-                        }
-                    }
-                    catch (IgniteCheckedException ignore) {
-                        //No-op.
-                    }
-
-                }
-            });
+            fut.listenAsync(new UpdateRemoveTimeStatClosure<V>(metrics0(), 
start));
 
         return fut;
     }
@@ -3051,20 +2948,7 @@ public abstract class GridCacheAdapter<K, V> extends 
GridMetadataAwareAdapter im
         }));
 
         if (statsEnabled)
-            fut.listenAsync(new CI1<IgniteFuture<V>>() {
-                @Override public void apply(IgniteFuture<V> fut) {
-                    try {
-                        if (!fut.isCancelled()) {
-                            fut.get();
-
-                            
ctx.cache().metrics0().addRemoveTimeNanos(System.nanoTime() - start);
-                        }
-                    }
-                    catch (IgniteCheckedException ignore) {
-                        //No-op.
-                    }
-                }
-            });
+            fut.listenAsync(new UpdateRemoveTimeStatClosure<V>(metrics0(), 
start));
 
         return fut;
     }
@@ -3106,7 +2990,7 @@ public abstract class GridCacheAdapter<K, V> extends 
GridMetadataAwareAdapter im
         });
 
         if (statsEnabled)
-            ctx.cache().metrics0().addRemoveTimeNanos(System.nanoTime() - 
start);
+            metrics0().addRemoveTimeNanos(System.nanoTime() - start);
     }
 
     /** {@inheritDoc} */
@@ -3135,19 +3019,7 @@ public abstract class GridCacheAdapter<K, V> extends 
GridMetadataAwareAdapter im
         });
 
         if (statsEnabled)
-            fut.listenAsync(new CI1<IgniteFuture<Object>>() {
-                @Override public void apply(IgniteFuture<Object> fut) {
-                    try {
-                        if (!fut.isCancelled()) {
-                            fut.get();
-
-                            
ctx.cache().metrics0().addRemoveTimeNanos(System.nanoTime() - start);
-                        }
-                    } catch (IgniteCheckedException ignore) {
-                        //No-op.
-                    }
-                }
-            });
+            fut.listenAsync(new UpdateRemoveTimeStatClosure<>(metrics0(), 
start));
 
         return fut;
     }
@@ -3162,7 +3034,7 @@ public abstract class GridCacheAdapter<K, V> extends 
GridMetadataAwareAdapter im
         boolean removed = removex(key, null, filter);
 
         if (statsEnabled && removed)
-            ctx.cache().metrics0().addRemoveTimeNanos(System.nanoTime() - 
start);
+            metrics0().addRemoveTimeNanos(System.nanoTime() - start);
 
         return removed;
     }
@@ -3192,7 +3064,7 @@ public abstract class GridCacheAdapter<K, V> extends 
GridMetadataAwareAdapter im
         });
 
         if (statsEnabled && removed)
-            ctx.cache().metrics0().addRemoveTimeNanos(System.nanoTime() - 
start);
+            metrics0().addRemoveTimeNanos(System.nanoTime() - start);
 
         return removed;
     }
@@ -3228,19 +3100,7 @@ public abstract class GridCacheAdapter<K, V> extends 
GridMetadataAwareAdapter im
         });
 
         if (statsEnabled)
-            fut.listenAsync(new CI1<IgniteFuture<Boolean>>() {
-                @Override public void apply(IgniteFuture<Boolean> fut) {
-                    try {
-                        if (!fut.isCancelled()) {
-                            fut.get();
-
-                            
ctx.cache().metrics0().addRemoveTimeNanos(System.nanoTime() - start);
-                        }
-                    } catch (IgniteCheckedException ignore) {
-                        //No-op.
-                    }
-                }
-            });
+            fut.listenAsync(new 
UpdateRemoveTimeStatClosure<Boolean>(metrics0(), start));
 
         return fut;
     }
@@ -3430,7 +3290,7 @@ public abstract class GridCacheAdapter<K, V> extends 
GridMetadataAwareAdapter im
         });
 
         if (statsEnabled && removed)
-            ctx.cache().metrics0().addRemoveTimeNanos(System.nanoTime() - 
start);
+            metrics0().addRemoveTimeNanos(System.nanoTime() - start);
 
         return removed;
     }
@@ -3484,20 +3344,7 @@ public abstract class GridCacheAdapter<K, V> extends 
GridMetadataAwareAdapter im
         });
 
         if (statsEnabled)
-            fut.listenAsync(new CI1<IgniteFuture<Boolean>>() {
-                @Override public void apply(IgniteFuture<Boolean> fut) {
-                    try {
-                        if (!fut.isCancelled()) {
-                            fut.get();
-
-                            
ctx.cache().metrics0().addRemoveTimeNanos(System.nanoTime() - start);
-                        }
-                    }
-                    catch (IgniteCheckedException ignore) {
-                        //No-op.
-                    }
-                }
-            });
+            fut.listenAsync(new 
UpdateRemoveTimeStatClosure<Boolean>(metrics0(), start));
 
         return fut;
     }
@@ -3547,7 +3394,7 @@ public abstract class GridCacheAdapter<K, V> extends 
GridMetadataAwareAdapter im
     /**
      * @return Metrics.
      */
-    public GridCacheMetricsAdapter metrics0() {
+    public CacheMetricsMxBeanImpl metrics0() {
         return metrics;
     }
 
@@ -4389,11 +4236,6 @@ public abstract class GridCacheAdapter<K, V> extends 
GridMetadataAwareAdapter im
     }
 
     /** {@inheritDoc} */
-    @Override public void resetMetrics() {
-        metrics = new GridCacheMetricsAdapter();
-    }
-
-    /** {@inheritDoc} */
     @Override public IgniteFuture<?> forceRepartition() {
         ctx.preloader().forcePreload();
 
@@ -5438,18 +5280,18 @@ public abstract class GridCacheAdapter<K, V> extends 
GridMetadataAwareAdapter im
     /**
      *
      */
-    protected static class UpdateGetTimeMetricsClosure<T> implements 
CI1<IgniteFuture<T>> {
+    protected static abstract class UpdateTimeStatClosure<T> implements 
CI1<IgniteFuture<T>> {
         /** */
-        private final GridCacheMetricsAdapter metrics;
+        protected final CacheMetricsMxBeanImpl metrics;
 
         /** */
-        private final long start;
+        protected final long start;
 
         /**
          * @param metrics Metrics.
          * @param start   Start time.
          */
-        public UpdateGetTimeMetricsClosure(GridCacheMetricsAdapter metrics, 
long start) {
+        public UpdateTimeStatClosure(CacheMetricsMxBeanImpl metrics, long 
start) {
             this.metrics = metrics;
             this.start = start;
         }
@@ -5460,11 +5302,88 @@ public abstract class GridCacheAdapter<K, V> extends 
GridMetadataAwareAdapter im
                 if (!fut.isCancelled()) {
                     fut.get();
 
-                    metrics.addGetTimeNanos(System.nanoTime() - start);
+                    updateTimeStat();
                 }
             } catch (IgniteCheckedException ignore) {
                 //No-op.
             }
         }
+
+        /**
+         * Updates statistics.
+         */
+        abstract protected void updateTimeStat();
+    }
+
+    /**
+     *
+     */
+    protected static class UpdateGetTimeStatClosure<T> extends 
UpdateTimeStatClosure<T> {
+        /**
+         * @param metrics Metrics.
+         * @param start   Start time.
+         */
+        public UpdateGetTimeStatClosure(CacheMetricsMxBeanImpl metrics, long 
start) {
+            super(metrics, start);
+        }
+
+        /** {@inheritDoc} */
+        @Override protected void updateTimeStat() {
+            metrics.addGetTimeNanos(System.nanoTime() - start);
+        }
+    }
+
+    /**
+     *
+     */
+    protected static class UpdateRemoveTimeStatClosure<T> extends 
UpdateTimeStatClosure<T> {
+        /**
+         * @param metrics Metrics.
+         * @param start   Start time.
+         */
+        public UpdateRemoveTimeStatClosure(CacheMetricsMxBeanImpl metrics, 
long start) {
+            super(metrics, start);
+        }
+
+        /** {@inheritDoc} */
+        @Override protected void updateTimeStat() {
+            metrics.addRemoveTimeNanos(System.nanoTime() - start);
+        }
+    }
+
+    /**
+     *
+     */
+    protected static class UpdatePutTimeStatClosure<T> extends 
UpdateTimeStatClosure {
+        /**
+         * @param metrics Metrics.
+         * @param start   Start time.
+         */
+        public UpdatePutTimeStatClosure(CacheMetricsMxBeanImpl metrics, long 
start) {
+            super(metrics, start);
+        }
+
+        /** {@inheritDoc} */
+        @Override protected void updateTimeStat() {
+            metrics.addPutTimeNanos(System.nanoTime() - start);
+        }
+    }
+
+    /**
+     *
+     */
+    protected static class UpdatePutAndGetTimeStatClosure<T> extends 
UpdateTimeStatClosure {
+        /**
+         * @param metrics Metrics.
+         * @param start   Start time.
+         */
+        public UpdatePutAndGetTimeStatClosure(CacheMetricsMxBeanImpl metrics, 
long start) {
+            super(metrics, start);
+        }
+
+        /** {@inheritDoc} */
+        @Override protected void updateTimeStat() {
+            metrics.addPutAndGetTimeNanos(System.nanoTime() - start);
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2a599ec/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/GridCacheMetricsAdapter.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/GridCacheMetricsAdapter.java
 
b/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/GridCacheMetricsAdapter.java
deleted file mode 100644
index e4c106b..0000000
--- 
a/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/GridCacheMetricsAdapter.java
+++ /dev/null
@@ -1,426 +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.gridgain.grid.kernal.processors.cache;
-
-import org.gridgain.grid.cache.*;
-import org.gridgain.grid.util.tostring.*;
-import org.gridgain.grid.util.typedef.internal.*;
-import org.jetbrains.annotations.*;
-
-import java.io.*;
-
-/**
- * Adapter for cache metrics.
- */
-public class GridCacheMetricsAdapter implements CacheMetricsMxBean, 
Externalizable {
-    /** */
-    private static final long NANOS_IN_MICROSECOND = 1000L;
-
-    /** */
-    private static final long serialVersionUID = 0L;
-
-    /** Number of reads. */
-    private volatile int reads;
-
-    /** Number of writes. */
-    private volatile int writes;
-
-    /** Number of hits. */
-    private volatile int hits;
-
-    /** Number of misses. */
-    private volatile int misses;
-
-    /** Number of transaction commits. */
-    private volatile int txCommits;
-
-    /** Number of transaction rollbacks. */
-    private volatile int txRollbacks;
-
-    /** Number of evictions. */
-    private volatile long evictCnt;
-
-    /** Number of removed entries. */
-    private volatile long rmCnt;
-
-    /** Put time taken nanos. */
-    private volatile long putTimeNanos;
-
-    /** Get time taken nanos. */
-    private volatile long getTimeNanos;
-
-    /** Remove time taken nanos. */
-    private volatile long removeTimeNanos;
-
-    /** Cache metrics. */
-    @GridToStringExclude
-    private transient GridCacheMetricsAdapter delegate;
-
-    /**
-     * No-args constructor.
-     */
-    public GridCacheMetricsAdapter() {
-        delegate = null;
-    }
-
-    /**
-     * @param m Metrics to copy from.
-     */
-    public GridCacheMetricsAdapter(GridCacheMetricsAdapter m) {
-        reads = m.reads;
-        writes = m.writes;
-        hits = m.hits;
-        misses = m.misses;
-        txCommits = m.txCommits;
-        txRollbacks = m.txRollbacks;
-        rmCnt = m.rmCnt;
-        evictCnt = m.evictCnt;
-        getTimeNanos = m.getTimeNanos;
-        putTimeNanos = m.putTimeNanos;
-        removeTimeNanos = m.removeTimeNanos;
-    }
-
-    /**
-     * @param delegate Metrics to delegate to.
-     */
-    public void delegate(GridCacheMetricsAdapter delegate) {
-        this.delegate = delegate;
-    }
-
-    /** {@inheritDoc} */
-    @Override public float getAverageTxCommitTime() {
-        return 1.f;
-    }
-
-    /** {@inheritDoc} */
-    @Override public float getAverageTxRollbackTime() {
-        return 1.f;
-    }
-
-    /** {@inheritDoc} */
-    @Override public int getCacheTxCommits() {
-        return txCommits;
-    }
-
-    /** {@inheritDoc} */
-    @Override public int getCacheTxRollbacks() {
-        return txRollbacks;
-    }
-
-    /** {@inheritDoc} */
-    @Override public void clear() {
-        reads = 0;
-        writes = 0;
-        hits = 0;
-        misses = 0;
-        txCommits = 0;
-        txRollbacks = 0;
-
-        putTimeNanos = 0;
-        removeTimeNanos = 0;
-        getTimeNanos = 0;
-    }
-
-    /** {@inheritDoc} */
-    @Override public long getCacheHits() {
-        return hits;
-    }
-
-    /** {@inheritDoc} */
-    @Override public float getCacheHitPercentage() {
-        long hits0 = hits;
-
-        if (hits0 == 0)
-            return 0;
-
-        return (float) hits0 / getCacheGets() * 100.0f;
-    }
-
-    /** {@inheritDoc} */
-    @Override public long getCacheMisses() {
-        return misses;
-    }
-
-    /** {@inheritDoc} */
-    @Override public float getCacheMissPercentage() {
-        long misses0 = misses;
-
-        if (misses0 == 0)
-            return 0;
-
-        return (float) misses0 / getCacheGets() * 100.0f;
-    }
-
-    /** {@inheritDoc} */
-    @Override public long getCacheGets() {
-        return reads;
-    }
-
-    /** {@inheritDoc} */
-    @Override public long getCachePuts() {
-        return writes;
-    }
-
-    /** {@inheritDoc} */
-    @Override public long getCacheRemovals() {
-        return rmCnt;
-    }
-
-    /** {@inheritDoc} */
-    @Override public long getCacheEvictions() {
-        return evictCnt;
-    }
-
-    /**
-     * Increments the get time accumulator.
-     *
-     * @param duration the time taken in nanoseconds.
-     */
-    public void addGetTimeNanos(long duration) {
-        getTimeNanos += duration;
-
-        if (delegate != null)
-            delegate.addGetTimeNanos(duration);
-    }
-
-    /**
-     * Increments the put time accumulator.
-     *
-     * @param duration the time taken in nanoseconds.
-     */
-    public void addPutTimeNanos(long duration) {
-        putTimeNanos += duration;
-
-        if (delegate != null)
-            delegate.addPutTimeNanos(duration);
-    }
-
-    /**
-     * Increments the remove time accumulator.
-     *
-     * @param duration the time taken in nanoseconds.
-     */
-    public void addRemoveTimeNanos(long duration) {
-        removeTimeNanos += duration;
-
-        if (delegate != null)
-            delegate.addRemoveTimeNanos(duration);
-    }
-
-    /**
-     * Increments remove and get time accumulators.
-     *
-     * @param duration the time taken in nanoseconds.
-     */
-    public void addRemoveAndGetTimeNanos(long duration) {
-        removeTimeNanos += duration;
-        getTimeNanos += duration;
-
-        if (delegate != null)
-            delegate.addRemoveAndGetTimeNanos(duration);
-    }
-
-    /**
-     * Increments put and get time accumulators.
-     *
-     * @param duration the time taken in nanoseconds.
-     */
-    public void addPutAndGetTimeNanos(long duration) {
-        putTimeNanos += duration;
-        getTimeNanos += duration;
-
-        if (delegate != null)
-            delegate.addPutAndGetTimeNanos(duration);
-    }
-
-    /** {@inheritDoc} */
-    @Override public float getAverageGetTime() {
-        long timeNanos = getTimeNanos;
-        long readsCnt = reads;
-
-        if (timeNanos == 0 || readsCnt == 0)
-            return 0;
-
-        return ((1f * timeNanos) / readsCnt) / NANOS_IN_MICROSECOND;
-    }
-
-    /** {@inheritDoc} */
-    @Override public float getAveragePutTime() {
-        long timeNanos = putTimeNanos;
-        long putsCnt = writes;
-
-        if (timeNanos == 0 || putsCnt == 0)
-            return 0;
-
-        return ((1f * timeNanos) / putsCnt) / NANOS_IN_MICROSECOND;
-    }
-
-    /** {@inheritDoc} */
-    @Override public float getAverageRemoveTime() {
-        long timeNanos = removeTimeNanos;
-        long removesCnt = rmCnt;
-
-        if (timeNanos == 0 || removesCnt == 0)
-            return 0;
-
-        return ((1f * timeNanos) / removesCnt) / NANOS_IN_MICROSECOND;
-    }
-
-    /**
-     * Cache read callback.
-     * @param isHit Hit or miss flag.
-     */
-    public void onRead(boolean isHit) {
-        reads++;
-
-        if (isHit)
-            hits++;
-        else
-            misses++;
-
-        if (delegate != null)
-            delegate.onRead(isHit);
-    }
-
-    /**
-     * Cache write callback.
-     */
-    public void onWrite() {
-        writes++;
-
-        if (delegate != null)
-            delegate.onWrite();
-    }
-
-    /**
-     * Cache remove callback.
-     */
-    public void onRemove(){
-        rmCnt++;
-
-        if (delegate != null)
-            delegate.onRemove();
-    }
-
-    /**
-     * Cache remove callback.
-     */
-    public void onEvict() {
-        evictCnt++;
-
-        if (delegate != null)
-            delegate.onEvict();
-    }
-
-    /**
-     * Transaction commit callback.
-     */
-    public void onTxCommit() {
-        txCommits++;
-
-        if (delegate != null)
-            delegate.onTxCommit();
-    }
-
-    /**
-     * Transaction rollback callback.
-     */
-    public void onTxRollback() {
-        txRollbacks++;
-
-        if (delegate != null)
-            delegate.onTxRollback();
-    }
-
-    /**
-     * Gets remove time.
-     *
-     * @return Remove time taken nanos.
-     */
-    public long removeTimeNanos() {
-        return removeTimeNanos;
-    }
-
-    /**
-     * Gets get time.
-     *
-     * @return Get time taken nanos.
-     */
-    public long getTimeNanos() {
-        return getTimeNanos;
-    }
-
-    /**
-     * Gets put time.
-     *
-     * @return Get time taken nanos.
-     */
-    public long putTimeNanos() {
-        return putTimeNanos;
-    }
-
-    /**
-     * Create a copy of given metrics object.
-     *
-     * @param m Metrics to copy from.
-     * @return Copy of given metrics.
-     */
-    @Nullable public static GridCacheMetricsAdapter copyOf(@Nullable 
GridCacheMetricsAdapter m) {
-        if (m == null)
-            return null;
-
-        return new GridCacheMetricsAdapter(m);
-    }
-
-    /** {@inheritDoc} */
-    @Override public void writeExternal(ObjectOutput out) throws IOException {
-        out.writeInt(reads);
-        out.writeInt(writes);
-        out.writeInt(hits);
-        out.writeInt(misses);
-        out.writeInt(txCommits);
-        out.writeInt(txRollbacks);
-        out.writeLong(rmCnt);
-        out.writeLong(evictCnt);
-
-        out.writeLong(putTimeNanos);
-        out.writeLong(getTimeNanos);
-        out.writeLong(removeTimeNanos);
-    }
-
-    /** {@inheritDoc} */
-    @Override public void readExternal(ObjectInput in) throws IOException, 
ClassNotFoundException {
-        reads = in.readInt();
-        writes = in.readInt();
-        hits = in.readInt();
-        misses = in.readInt();
-        txCommits = in.readInt();
-        txRollbacks = in.readInt();
-        rmCnt = in.readLong();
-        evictCnt = in.readLong();
-
-        putTimeNanos = in.readLong();
-        getTimeNanos = in.readLong();
-        removeTimeNanos = in.readLong();
-    }
-
-    /** {@inheritDoc} */
-    @Override public String toString() {
-        return S.toString(GridCacheMetricsAdapter.class, this);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2a599ec/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/GridCacheProxyImpl.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/GridCacheProxyImpl.java
 
b/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/GridCacheProxyImpl.java
index 0441549..5c3cc15 100644
--- 
a/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/GridCacheProxyImpl.java
+++ 
b/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/GridCacheProxyImpl.java
@@ -1866,18 +1866,6 @@ public class GridCacheProxyImpl<K, V> implements 
GridCacheProxy<K, V>, Externali
     }
 
     /** {@inheritDoc} */
-    @Override public void resetMetrics() {
-        GridCacheProjectionImpl<K, V> prev = gate.enter(prj);
-
-        try {
-            cache.resetMetrics();
-        }
-        finally {
-            gate.leave(prev);
-        }
-    }
-
-    /** {@inheritDoc} */
     @Nullable @Override public ExpiryPolicy expiry() {
         return delegate.expiry();
     }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2a599ec/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/distributed/dht/GridDhtCache.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/distributed/dht/GridDhtCache.java
 
b/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/distributed/dht/GridDhtCache.java
index e048efc..c3dbd18 100644
--- 
a/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/distributed/dht/GridDhtCache.java
+++ 
b/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/distributed/dht/GridDhtCache.java
@@ -71,20 +71,16 @@ public class GridDhtCache<K, V> extends 
GridDhtTransactionalCacheAdapter<K, V> {
 
     /** {@inheritDoc} */
     @Override public void start() throws IgniteCheckedException {
-        resetMetrics();
-
-        super.start();
-    }
-
-    /** {@inheritDoc} */
-    @Override public void resetMetrics() {
-        GridCacheMetricsAdapter m = new GridCacheMetricsAdapter();
+        CacheMetricsMxBeanImpl m = new CacheMetricsMxBeanImpl();
 
         m.delegate(ctx.dht().near().metrics0());
 
         metrics = m;
 
         ctx.dr().resetMetrics();
+
+
+        super.start();
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2a599ec/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java
 
b/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java
index 87e43ca..f1e9c51 100644
--- 
a/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java
+++ 
b/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java
@@ -116,8 +116,9 @@ public class GridDhtAtomicCache<K, V> extends 
GridDhtCacheAdapter<K, V> {
     @Override protected void init() {
         map.setEntryFactory(new GridCacheMapEntryFactory<K, V>() {
             /** {@inheritDoc} */
-            @Override public GridCacheMapEntry<K, V> 
create(GridCacheContext<K, V> ctx, long topVer, K key, int hash,
-                V val, GridCacheMapEntry<K, V> next, long ttl, int hdrId) {
+            @Override
+            public GridCacheMapEntry<K, V> create(GridCacheContext<K, V> ctx, 
long topVer, K key, int hash,
+                                                  V val, GridCacheMapEntry<K, 
V> next, long ttl, int hdrId) {
                 return new GridDhtAtomicCacheEntry<>(ctx, topVer, key, hash, 
val, next, ttl, hdrId);
             }
         });
@@ -154,7 +155,12 @@ public class GridDhtAtomicCache<K, V> extends 
GridDhtCacheAdapter<K, V> {
     @Override public void start() throws IgniteCheckedException {
         super.start();
 
-        resetMetrics();
+        CacheMetricsMxBeanImpl m = new CacheMetricsMxBeanImpl();
+
+        if (ctx.dht().near() != null)
+            m.delegate(ctx.dht().near().metrics0());
+
+        metrics = m;
 
         preldr = new GridDhtPreloader<>(ctx);
 
@@ -212,18 +218,6 @@ public class GridDhtAtomicCache<K, V> extends 
GridDhtCacheAdapter<K, V> {
         });
     }
 
-    /** {@inheritDoc} */
-    @Override public void resetMetrics() {
-        GridCacheMetricsAdapter m = new GridCacheMetricsAdapter();
-
-        if (ctx.dht().near() != null)
-            m.delegate(ctx.dht().near().metrics0());
-
-        metrics = m;
-
-        ctx.dr().resetMetrics();
-    }
-
     /**
      * @param near Near cache.
      */
@@ -826,21 +820,7 @@ public class GridDhtAtomicCache<K, V> extends 
GridDhtCacheAdapter<K, V> {
             taskNameHash);
 
         if (statsEnabled) {
-            updateFut.listenAsync(new CI1<IgniteFuture<Object>>() {
-                /** {@inheritDoc} */
-                @Override public void apply(IgniteFuture<Object> fut) {
-                    try {
-                        if (!fut.isCancelled()) {
-                            fut.get();
-
-                            
ctx.cache().metrics0().addRemoveTimeNanos(System.nanoTime() - start);
-                        }
-                    }
-                    catch (IgniteCheckedException ignore){
-                        //No-op.
-                    }
-                }
-            });
+            updateFut.listenAsync(new 
UpdateRemoveTimeStatClosure<>(metrics0(), start));
         }
 
         return asyncOp(new CO<IgniteFuture<Object>>() {
@@ -964,7 +944,7 @@ public class GridDhtAtomicCache<K, V> extends 
GridDhtCacheAdapter<K, V> {
                 if (!success)
                     break;
                 else
-                    ctx.cache().metrics0().onRead(true);
+                    metrics0().onRead(true);
             }
 
             if (success) {

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2a599ec/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/distributed/near/GridNearCacheAdapter.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/distributed/near/GridNearCacheAdapter.java
 
b/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/distributed/near/GridNearCacheAdapter.java
index efcd6dd..2920032 100644
--- 
a/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/distributed/near/GridNearCacheAdapter.java
+++ 
b/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/distributed/near/GridNearCacheAdapter.java
@@ -316,13 +316,6 @@ public abstract class GridNearCacheAdapter<K, V> extends 
GridDistributedCacheAda
         return dht().loadCacheAsync(p, ttl, args);
     }
 
-    /** {@inheritDoc} */
-    @Override public void resetMetrics() {
-        super.resetMetrics();
-
-        dht().resetMetrics();
-    }
-
     /**
      * @param nodeId Sender ID.
      * @param res Response.

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2a599ec/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/local/atomic/GridLocalAtomicCache.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/local/atomic/GridLocalAtomicCache.java
 
b/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/local/atomic/GridLocalAtomicCache.java
index a2a3b13..bb65bc4 100644
--- 
a/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/local/atomic/GridLocalAtomicCache.java
+++ 
b/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/local/atomic/GridLocalAtomicCache.java
@@ -422,7 +422,7 @@ public class GridLocalAtomicCache<K, V> extends 
GridCacheAdapter<K, V> {
                 ctx.isStoreEnabled());
 
         if (statsEnabled && removed)
-            ctx.cache().metrics0().addRemoveTimeNanos(System.nanoTime() - 
start);
+            metrics0().addRemoveTimeNanos(System.nanoTime() - start);
 
         return  removed;
     }
@@ -840,21 +840,7 @@ public class GridLocalAtomicCache<K, V> extends 
GridCacheAdapter<K, V> {
         });
 
         if (statsEnabled)
-            fut.listenAsync(new CI1<IgniteFuture<Boolean>>() {
-                /** {@inheritDoc} */
-                @Override public void apply(IgniteFuture<Boolean> fut) {
-                    try {
-                        if (!fut.isCancelled()) {
-                            fut.get();
-
-                            
ctx.cache().metrics0().addRemoveTimeNanos(System.nanoTime() - start);
-                        }
-                    }
-                    catch (IgniteCheckedException ignore) {
-                        //No-op.
-                    }
-                }
-            });
+            fut.listenAsync(new UpdateRemoveTimeStatClosure<>(metrics0(), 
start));
 
         return fut;
     }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2a599ec/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/transactions/IgniteTxManager.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/transactions/IgniteTxManager.java
 
b/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/transactions/IgniteTxManager.java
index bc78303..209ea49 100644
--- 
a/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/transactions/IgniteTxManager.java
+++ 
b/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/transactions/IgniteTxManager.java
@@ -1257,7 +1257,7 @@ public class IgniteTxManager<K, V> extends 
GridCacheSharedManagerAdapter<K, V> {
                     GridCacheContext<K, V> cacheCtx = 
cctx.cacheContext(cacheId);
 
                     if (cacheCtx.cache().configuration().isStatisticsEnabled())
-                        cacheCtx.cache().metrics0().onTxCommit();
+                        
cacheCtx.cache().metrics0().onTxCommit(System.nanoTime() - tx.startTime());
                 }
             }
 
@@ -1331,7 +1331,7 @@ public class IgniteTxManager<K, V> extends 
GridCacheSharedManagerAdapter<K, V> {
                     GridCacheContext<K, V> cacheCtx = 
cctx.cacheContext(cacheId);
 
                     if (cacheCtx.cache().configuration().isStatisticsEnabled())
-                        cacheCtx.cache().metrics0().onTxRollback();
+                        
cacheCtx.cache().metrics0().onTxRollback(System.nanoTime() - tx.startTime());
                 }
             }
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2a599ec/modules/core/src/main/java/org/gridgain/grid/kernal/processors/rest/handlers/top/GridTopologyCommandHandler.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/gridgain/grid/kernal/processors/rest/handlers/top/GridTopologyCommandHandler.java
 
b/modules/core/src/main/java/org/gridgain/grid/kernal/processors/rest/handlers/top/GridTopologyCommandHandler.java
index 8560db3..084444a 100644
--- 
a/modules/core/src/main/java/org/gridgain/grid/kernal/processors/rest/handlers/top/GridTopologyCommandHandler.java
+++ 
b/modules/core/src/main/java/org/gridgain/grid/kernal/processors/rest/handlers/top/GridTopologyCommandHandler.java
@@ -201,7 +201,7 @@ public class GridTopologyCommandHandler extends 
GridRestCommandHandlerAdapter {
         }
 
         if (mtr) {
-            ClusterNodeMetrics metrics = node.metrics();
+            ClusterNodeMetricsMBean metrics = node.metrics();
 
             GridClientNodeMetricsBean metricsBean = new 
GridClientNodeMetricsBean();
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2a599ec/modules/core/src/main/java/org/gridgain/grid/kernal/visor/cache/VisorCacheResetMetricsTask.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/gridgain/grid/kernal/visor/cache/VisorCacheResetMetricsTask.java
 
b/modules/core/src/main/java/org/gridgain/grid/kernal/visor/cache/VisorCacheResetMetricsTask.java
index c1d8bf0..3a18008 100644
--- 
a/modules/core/src/main/java/org/gridgain/grid/kernal/visor/cache/VisorCacheResetMetricsTask.java
+++ 
b/modules/core/src/main/java/org/gridgain/grid/kernal/visor/cache/VisorCacheResetMetricsTask.java
@@ -56,7 +56,7 @@ public class VisorCacheResetMetricsTask extends 
VisorOneNodeTask<String, Void> {
             GridCache cache = g.cachex(cacheName);
 
             if (cache != null)
-                cache.resetMetrics();
+                cache.metrics().clear();
 
             return null;
         }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2a599ec/modules/core/src/main/java/org/gridgain/grid/kernal/visor/node/VisorNodeGcTask.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/gridgain/grid/kernal/visor/node/VisorNodeGcTask.java
 
b/modules/core/src/main/java/org/gridgain/grid/kernal/visor/node/VisorNodeGcTask.java
index edf5020..356b482 100644
--- 
a/modules/core/src/main/java/org/gridgain/grid/kernal/visor/node/VisorNodeGcTask.java
+++ 
b/modules/core/src/main/java/org/gridgain/grid/kernal/visor/node/VisorNodeGcTask.java
@@ -87,7 +87,7 @@ public class VisorNodeGcTask extends VisorMultiNodeTask<Void, 
Map<UUID, IgniteBi
          * @return Current free heap.
          */
         private long freeHeap(ClusterNode node) {
-            final ClusterNodeMetrics m = node.metrics();
+            final ClusterNodeMetricsMBean m = node.metrics();
 
             return m.getHeapMemoryMaximum() - m.getHeapMemoryUsed();
         }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2a599ec/modules/core/src/main/java/org/gridgain/grid/util/GridUtils.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/gridgain/grid/util/GridUtils.java 
b/modules/core/src/main/java/org/gridgain/grid/util/GridUtils.java
index 390f61f..a9f84e7 100644
--- a/modules/core/src/main/java/org/gridgain/grid/util/GridUtils.java
+++ b/modules/core/src/main/java/org/gridgain/grid/util/GridUtils.java
@@ -793,7 +793,7 @@ public abstract class GridUtils {
         double heap = 0.0;
 
         for (ClusterNode n : nodesPerJvm(nodes)) {
-            ClusterNodeMetrics m = n.metrics();
+            ClusterNodeMetricsMBean m = n.metrics();
 
             heap += Math.max(m.getHeapMemoryInitialized(), 
m.getHeapMemoryMaximum());
         }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2a599ec/modules/core/src/test/java/org/apache/ignite/spi/discovery/GridDiscoveryMetricsHelperSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/test/java/org/apache/ignite/spi/discovery/GridDiscoveryMetricsHelperSelfTest.java
 
b/modules/core/src/test/java/org/apache/ignite/spi/discovery/GridDiscoveryMetricsHelperSelfTest.java
index 7fd7847..04b13ba 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/spi/discovery/GridDiscoveryMetricsHelperSelfTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/spi/discovery/GridDiscoveryMetricsHelperSelfTest.java
@@ -46,7 +46,7 @@ public class GridDiscoveryMetricsHelperSelfTest extends 
GridCommonAbstractTest {
         assert off == DiscoveryMetricsHelper.METRICS_SIZE;
 
         // Test deserialization.
-        ClusterNodeMetrics res = DiscoveryMetricsHelper.deserialize(data, 0);
+        ClusterNodeMetricsMBean res = DiscoveryMetricsHelper.deserialize(data, 
0);
 
         assert res != null;
     }
@@ -55,7 +55,7 @@ public class GridDiscoveryMetricsHelperSelfTest extends 
GridCommonAbstractTest {
     public void testSerialization() {
         byte[] data = new byte[DiscoveryMetricsHelper.METRICS_SIZE];
 
-        ClusterNodeMetrics metrics1 = createMetrics();
+        ClusterNodeMetricsMBean metrics1 = createMetrics();
 
         // Test serialization.
         int off = DiscoveryMetricsHelper.serialize(data, 0, metrics1);
@@ -63,7 +63,7 @@ public class GridDiscoveryMetricsHelperSelfTest extends 
GridCommonAbstractTest {
         assert off == DiscoveryMetricsHelper.METRICS_SIZE;
 
         // Test deserialization.
-        ClusterNodeMetrics metrics2 = DiscoveryMetricsHelper.deserialize(data, 
0);
+        ClusterNodeMetricsMBean metrics2 = 
DiscoveryMetricsHelper.deserialize(data, 0);
 
         assert metrics2 != null;
 
@@ -74,7 +74,7 @@ public class GridDiscoveryMetricsHelperSelfTest extends 
GridCommonAbstractTest {
      * @throws IOException If I/O error occurs.
      */
     public void testMultipleMetricsSerialization() throws IOException {
-        Map<UUID, ClusterNodeMetrics> metrics = new HashMap<>(METRICS_COUNT);
+        Map<UUID, ClusterNodeMetricsMBean> metrics = new 
HashMap<>(METRICS_COUNT);
 
         for (int i = 0; i < METRICS_COUNT; i++)
             metrics.put(UUID.randomUUID(), createMetrics());
@@ -94,7 +94,7 @@ public class GridDiscoveryMetricsHelperSelfTest extends 
GridCommonAbstractTest {
     /**
      * @return Test metrics.
      */
-    private ClusterNodeMetrics createMetrics() {
+    private ClusterNodeMetricsMBean createMetrics() {
         DiscoveryNodeMetricsAdapter metrics = new 
DiscoveryNodeMetricsAdapter();
 
         metrics.setAvailableProcessors(1);

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2a599ec/modules/core/src/test/java/org/gridgain/grid/kernal/ClusterNodeMetricsSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/test/java/org/gridgain/grid/kernal/ClusterNodeMetricsSelfTest.java
 
b/modules/core/src/test/java/org/gridgain/grid/kernal/ClusterNodeMetricsSelfTest.java
index 5ca829c..a59f4b6 100644
--- 
a/modules/core/src/test/java/org/gridgain/grid/kernal/ClusterNodeMetricsSelfTest.java
+++ 
b/modules/core/src/test/java/org/gridgain/grid/kernal/ClusterNodeMetricsSelfTest.java
@@ -88,7 +88,7 @@ public class ClusterNodeMetricsSelfTest extends 
GridCommonAbstractTest {
         // Wait for metrics update.
         latch.await();
 
-        ClusterNodeMetrics metrics = ignite.cluster().localNode().metrics();
+        ClusterNodeMetricsMBean metrics = 
ignite.cluster().localNode().metrics();
 
         info("Node metrics: " + metrics);
 
@@ -144,7 +144,7 @@ public class ClusterNodeMetricsSelfTest extends 
GridCommonAbstractTest {
         // Wait for metrics update.
         latch.await();
 
-        ClusterNodeMetrics metrics = ignite.cluster().localNode().metrics();
+        ClusterNodeMetricsMBean metrics = 
ignite.cluster().localNode().metrics();
 
         info("Node metrics: " + metrics);
 
@@ -207,7 +207,7 @@ public class ClusterNodeMetricsSelfTest extends 
GridCommonAbstractTest {
 
         latch.await();
 
-        ClusterNodeMetrics metrics = ignite0.cluster().localNode().metrics();
+        ClusterNodeMetricsMBean metrics = 
ignite0.cluster().localNode().metrics();
 
         info("Node 0 metrics: " + metrics);
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2a599ec/modules/core/src/test/java/org/gridgain/grid/kernal/GridDiscoverySelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/test/java/org/gridgain/grid/kernal/GridDiscoverySelfTest.java
 
b/modules/core/src/test/java/org/gridgain/grid/kernal/GridDiscoverySelfTest.java
index bf8f394..96aa26c 100644
--- 
a/modules/core/src/test/java/org/gridgain/grid/kernal/GridDiscoverySelfTest.java
+++ 
b/modules/core/src/test/java/org/gridgain/grid/kernal/GridDiscoverySelfTest.java
@@ -371,7 +371,7 @@ public class GridDiscoverySelfTest extends 
GridCommonAbstractTest {
         }
 
         /** {@inheritDoc} */
-        @Nullable @Override public ClusterNodeMetrics metrics() {
+        @Nullable @Override public ClusterNodeMetricsMBean metrics() {
             return null;
         }
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2a599ec/modules/core/src/test/java/org/gridgain/grid/kernal/GridNonHistoryMetricsSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/test/java/org/gridgain/grid/kernal/GridNonHistoryMetricsSelfTest.java
 
b/modules/core/src/test/java/org/gridgain/grid/kernal/GridNonHistoryMetricsSelfTest.java
index f1fb44f..66bd632 100644
--- 
a/modules/core/src/test/java/org/gridgain/grid/kernal/GridNonHistoryMetricsSelfTest.java
+++ 
b/modules/core/src/test/java/org/gridgain/grid/kernal/GridNonHistoryMetricsSelfTest.java
@@ -84,13 +84,13 @@ public class GridNonHistoryMetricsSelfTest extends 
GridCommonAbstractTest {
 
         GridTestUtils.waitForCondition(new GridAbsPredicate() {
             @Override public boolean apply() {
-                ClusterNodeMetrics metrics = 
ignite.cluster().localNode().metrics();
+                ClusterNodeMetricsMBean metrics = 
ignite.cluster().localNode().metrics();
 
                 return metrics.getTotalExecutedJobs() == 5;
             }
         }, 5000);
 
-        ClusterNodeMetrics metrics = ignite.cluster().localNode().metrics();
+        ClusterNodeMetricsMBean metrics = 
ignite.cluster().localNode().metrics();
 
         info("Node metrics: " + metrics);
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2a599ec/modules/core/src/test/java/org/gridgain/grid/kernal/processors/cache/GridCacheAbstractMetricsSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/test/java/org/gridgain/grid/kernal/processors/cache/GridCacheAbstractMetricsSelfTest.java
 
b/modules/core/src/test/java/org/gridgain/grid/kernal/processors/cache/GridCacheAbstractMetricsSelfTest.java
index c347f29..4563d3d 100644
--- 
a/modules/core/src/test/java/org/gridgain/grid/kernal/processors/cache/GridCacheAbstractMetricsSelfTest.java
+++ 
b/modules/core/src/test/java/org/gridgain/grid/kernal/processors/cache/GridCacheAbstractMetricsSelfTest.java
@@ -81,7 +81,7 @@ public abstract class GridCacheAbstractMetricsSelfTest 
extends GridCacheAbstract
 
             assert g.cache(null).isEmpty();
 
-            g.cache(null).resetMetrics();
+            g.cache(null).metrics().clear();
 
             g.transactions().resetMetrics();
         }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2a599ec/modules/core/src/test/java/org/gridgain/grid/kernal/processors/cache/GridCacheTransactionalAbstractMetricsSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/test/java/org/gridgain/grid/kernal/processors/cache/GridCacheTransactionalAbstractMetricsSelfTest.java
 
b/modules/core/src/test/java/org/gridgain/grid/kernal/processors/cache/GridCacheTransactionalAbstractMetricsSelfTest.java
index 1e0b38c..b01b562 100644
--- 
a/modules/core/src/test/java/org/gridgain/grid/kernal/processors/cache/GridCacheTransactionalAbstractMetricsSelfTest.java
+++ 
b/modules/core/src/test/java/org/gridgain/grid/kernal/processors/cache/GridCacheTransactionalAbstractMetricsSelfTest.java
@@ -225,8 +225,10 @@ public abstract class 
GridCacheTransactionalAbstractMetricsSelfTest extends Grid
             if (i == 0) {
                 assertEquals(TX_CNT, metrics.txCommits());
 
-                if (put)
+                if (put) {
                     assertEquals(TX_CNT, cacheMetrics.getCacheTxCommits());
+                    assert cacheMetrics.getAverageTxCommitTime() > 0;
+                }
             }
             else {
                 assertEquals(0, metrics.txCommits());
@@ -268,8 +270,10 @@ public abstract class 
GridCacheTransactionalAbstractMetricsSelfTest extends Grid
             if (i == 0) {
                 assertEquals(TX_CNT, metrics.txRollbacks());
 
-                if (put)
+                if (put) {
                     assertEquals(TX_CNT, cacheMetrics.getCacheTxRollbacks());
+                    assert cacheMetrics.getAverageTxRollbackTime() > 0;
+                }
             }
             else {
                 assertEquals(0, metrics.txRollbacks());

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2a599ec/modules/core/src/test/java/org/gridgain/grid/kernal/processors/cache/distributed/dht/GridCachePartitionedNearDisabledMetricsSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/test/java/org/gridgain/grid/kernal/processors/cache/distributed/dht/GridCachePartitionedNearDisabledMetricsSelfTest.java
 
b/modules/core/src/test/java/org/gridgain/grid/kernal/processors/cache/distributed/dht/GridCachePartitionedNearDisabledMetricsSelfTest.java
index 8b76feb..6ef9187 100644
--- 
a/modules/core/src/test/java/org/gridgain/grid/kernal/processors/cache/distributed/dht/GridCachePartitionedNearDisabledMetricsSelfTest.java
+++ 
b/modules/core/src/test/java/org/gridgain/grid/kernal/processors/cache/distributed/dht/GridCachePartitionedNearDisabledMetricsSelfTest.java
@@ -91,7 +91,7 @@ public class GridCachePartitionedNearDisabledMetricsSelfTest 
extends GridCacheAb
 
             assert g.cache(null).isEmpty();
 
-            g.cache(null).resetMetrics();
+            g.cache(null).metrics().clear();
         }
 
         assertNull("Value is not null for key: " + 0, cache.get(0));

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2a599ec/modules/core/src/test/java/org/gridgain/grid/kernal/processors/cache/distributed/near/GridCacheNearMetricsSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/test/java/org/gridgain/grid/kernal/processors/cache/distributed/near/GridCacheNearMetricsSelfTest.java
 
b/modules/core/src/test/java/org/gridgain/grid/kernal/processors/cache/distributed/near/GridCacheNearMetricsSelfTest.java
index 28e7eb5..3a8d991 100644
--- 
a/modules/core/src/test/java/org/gridgain/grid/kernal/processors/cache/distributed/near/GridCacheNearMetricsSelfTest.java
+++ 
b/modules/core/src/test/java/org/gridgain/grid/kernal/processors/cache/distributed/near/GridCacheNearMetricsSelfTest.java
@@ -69,7 +69,7 @@ public class GridCacheNearMetricsSelfTest extends 
GridCacheAbstractSelfTest {
 
             assert g.cache(null).isEmpty();
 
-            g.cache(null).resetMetrics();
+            g.cache(null).metrics().clear();
         }
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2a599ec/modules/core/src/test/java/org/gridgain/grid/p2p/GridP2PClassLoadingSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/test/java/org/gridgain/grid/p2p/GridP2PClassLoadingSelfTest.java
 
b/modules/core/src/test/java/org/gridgain/grid/p2p/GridP2PClassLoadingSelfTest.java
index 2109fba..e279a6e 100644
--- 
a/modules/core/src/test/java/org/gridgain/grid/p2p/GridP2PClassLoadingSelfTest.java
+++ 
b/modules/core/src/test/java/org/gridgain/grid/p2p/GridP2PClassLoadingSelfTest.java
@@ -110,7 +110,7 @@ public class GridP2PClassLoadingSelfTest extends 
GridCommonAbstractTest {
         }
 
         /** {@inheritDoc} */
-        @Nullable @Override public ClusterNodeMetrics metrics() {
+        @Nullable @Override public ClusterNodeMetricsMBean metrics() {
             return null;
         }
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2a599ec/modules/core/src/test/java/org/gridgain/testframework/GridTestNode.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/test/java/org/gridgain/testframework/GridTestNode.java 
b/modules/core/src/test/java/org/gridgain/testframework/GridTestNode.java
index 083a1bf..032e152 100644
--- a/modules/core/src/test/java/org/gridgain/testframework/GridTestNode.java
+++ b/modules/core/src/test/java/org/gridgain/testframework/GridTestNode.java
@@ -53,7 +53,7 @@ public class GridTestNode extends GridMetadataAwareAdapter 
implements ClusterNod
     private Object consistentId = consistentIdCtr.incrementAndGet();
 
     /** */
-    private ClusterNodeMetrics metrics;
+    private ClusterNodeMetricsMBean metrics;
 
     /** */
     private long order;
@@ -84,7 +84,7 @@ public class GridTestNode extends GridMetadataAwareAdapter 
implements ClusterNod
      * @param id Node ID.
      * @param metrics Node metrics.
      */
-    public GridTestNode(UUID id, ClusterNodeMetrics metrics) {
+    public GridTestNode(UUID id, ClusterNodeMetricsMBean metrics) {
         this.id = id;
         this.metrics = metrics;
 
@@ -182,7 +182,7 @@ public class GridTestNode extends GridMetadataAwareAdapter 
implements ClusterNod
     }
 
     /** {@inheritDoc} */
-    @Override public ClusterNodeMetrics metrics() {
+    @Override public ClusterNodeMetricsMBean metrics() {
         return metrics;
     }
 
@@ -208,7 +208,7 @@ public class GridTestNode extends GridMetadataAwareAdapter 
implements ClusterNod
      *
      * @param metrics Node metrics.
      */
-    public void setMetrics(ClusterNodeMetrics metrics) {
+    public void setMetrics(ClusterNodeMetricsMBean metrics) {
         this.metrics = metrics;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e2a599ec/modules/core/src/test/java/org/gridgain/testframework/junits/spi/GridSpiAbstractTest.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/test/java/org/gridgain/testframework/junits/spi/GridSpiAbstractTest.java
 
b/modules/core/src/test/java/org/gridgain/testframework/junits/spi/GridSpiAbstractTest.java
index 3f7eb27..a2c1fd1 100644
--- 
a/modules/core/src/test/java/org/gridgain/testframework/junits/spi/GridSpiAbstractTest.java
+++ 
b/modules/core/src/test/java/org/gridgain/testframework/junits/spi/GridSpiAbstractTest.java
@@ -347,7 +347,7 @@ public abstract class GridSpiAbstractTest<T extends 
IgniteSpi> extends GridAbstr
     protected DiscoveryMetricsProvider createMetricsProvider() {
         return new DiscoveryMetricsProvider() {
             /** {@inheritDoc} */
-            @Override public ClusterNodeMetrics getMetrics() { return new 
DiscoveryNodeMetricsAdapter(); }
+            @Override public ClusterNodeMetricsMBean getMetrics() { return new 
DiscoveryNodeMetricsAdapter(); }
         };
     }
 

Reply via email to