You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ag...@apache.org on 2018/04/20 13:11:34 UTC

ignite git commit: IGNITE-8078 Introduced additional data storage metrics - Fixes #3845.

Repository: ignite
Updated Branches:
  refs/heads/master 8caeb3dc1 -> ae18817fb


IGNITE-8078 Introduced additional data storage metrics - Fixes #3845.

Signed-off-by: Alexey Goncharuk <al...@gmail.com>


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

Branch: refs/heads/master
Commit: ae18817fbce547fcc8da42dc7ab7589f51e652e8
Parents: 8caeb3d
Author: Dmitriy Govorukhin <dm...@gmail.com>
Authored: Fri Apr 20 16:00:00 2018 +0300
Committer: Alexey Goncharuk <al...@gmail.com>
Committed: Fri Apr 20 16:00:00 2018 +0300

----------------------------------------------------------------------
 .../org/apache/ignite/DataRegionMetrics.java    |  35 ++++
 .../org/apache/ignite/DataStorageMetrics.java   |  70 +++++++
 .../apache/ignite/internal/IgniteKernal.java    |   1 +
 .../cache/CacheGroupMetricsMXBeanImpl.java      |  86 +++++++-
 .../persistence/DataRegionMetricsImpl.java      |  98 +++++++++-
 .../DataRegionMetricsMXBeanImpl.java            |  25 +++
 .../persistence/DataRegionMetricsSnapshot.java  |  45 +++++
 .../persistence/DataStorageMetricsImpl.java     | 195 ++++++++++++++++++-
 .../persistence/DataStorageMetricsSnapshot.java |  90 +++++++++
 .../GridCacheDatabaseSharedManager.java         |   7 +-
 .../IgniteCacheDatabaseSharedManager.java       |  37 +++-
 .../persistence/file/FilePageStoreManager.java  |  17 +-
 .../persistence/pagemem/PageMemoryImpl.java     |   6 +
 .../wal/FileWriteAheadLogManager.java           |  24 ++-
 .../wal/FsyncModeFileWriteAheadLogManager.java  |  22 ++-
 .../ignite/mxbean/CacheGroupMetricsMXBean.java  |  24 +++
 .../ignite/mxbean/DataRegionMetricsMXBean.java  |  20 ++
 .../ignite/mxbean/DataStorageMetricsMXBean.java |  40 ++++
 .../database/SwapPathConstructionSelfTest.java  |   4 +-
 .../ApiParity/DataRegionMetricsParityTest.cs    |   8 +-
 .../ApiParity/DataStorageMetricsParityTest.cs   |  14 +-
 21 files changed, 849 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/ae18817f/modules/core/src/main/java/org/apache/ignite/DataRegionMetrics.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/DataRegionMetrics.java b/modules/core/src/main/java/org/apache/ignite/DataRegionMetrics.java
index dc48f11..ca2fc66 100644
--- a/modules/core/src/main/java/org/apache/ignite/DataRegionMetrics.java
+++ b/modules/core/src/main/java/org/apache/ignite/DataRegionMetrics.java
@@ -165,4 +165,39 @@ public interface DataRegionMetrics {
      * @return Page size in bytes.
      */
     public int getPageSize();
+
+    /**
+     * The number of read pages from last restart.
+     *
+     * @return The number of read pages from last restart.
+     */
+    public long getPagesRead();
+
+    /**
+     * The number of written pages from last restart.
+     *
+     * @return The number of written pages from last restart.
+     */
+    public long getPagesWritten();
+
+    /**
+     * The number of replaced pages from last restart .
+     *
+     * @return The number of replaced pages from last restart .
+     */
+    public long getPagesReplaced();
+
+    /**
+     * Total offheap size in bytes.
+     *
+     * @return Total offheap size in bytes.
+     */
+    public long getOffHeapSize();
+
+    /**
+     * Total used offheap size in bytes.
+     *
+     * @return Total used offheap size in bytes.
+     */
+    public long getOffheapUsedSize();
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/ae18817f/modules/core/src/main/java/org/apache/ignite/DataStorageMetrics.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/DataStorageMetrics.java b/modules/core/src/main/java/org/apache/ignite/DataStorageMetrics.java
index 680caba..5fb2b1e 100644
--- a/modules/core/src/main/java/org/apache/ignite/DataStorageMetrics.java
+++ b/modules/core/src/main/java/org/apache/ignite/DataStorageMetrics.java
@@ -67,6 +67,27 @@ public interface DataStorageMetrics {
     public long getWalBuffPollSpinsRate();
 
     /**
+     * Total size in bytes for storage wal files.
+     *
+     * @return Total size in bytes for storage wal files.
+     */
+    public long getWalTotalSize();
+
+    /**
+     * Time of the last WAL segment rollover.
+     *
+     * @return  Time of the last WAL segment rollover.
+     */
+    public long getWalLastRollOverTime();
+
+    /**
+     * Total checkpoint time from last restart.
+     *
+     * @return  Total checkpoint time from last restart.
+     */
+    public long getCheckpointTotalTime();
+
+    /**
      * Gets the duration of the last checkpoint in milliseconds.
      *
      * @return Total checkpoint duration in milliseconds.
@@ -121,4 +142,53 @@ public interface DataStorageMetrics {
      * @return Total number of pages copied to a temporary checkpoint buffer during the last checkpoint.
      */
     public long getLastCheckpointCopiedOnWritePagesNumber();
+
+    /**
+     * Total dirty pages for the next checkpoint.
+     *
+     * @return  Total dirty pages for the next checkpoint.
+     */
+    public long getDirtyPages();
+
+    /**
+     * The number of read pages from last restart.
+     *
+     * @return The number of read pages from last restart.
+     */
+    public long getPagesRead();
+
+    /**
+     * The number of written pages from last restart.
+     *
+     * @return The number of written pages from last restart.
+     */
+    public long getPagesWritten();
+
+    /**
+     * The number of replaced pages from last restart.
+     *
+     * @return The number of replaced pages from last restart.
+     */
+    public long getPagesReplaced();
+
+    /**
+     * Total offheap size in bytes.
+     *
+     * @return Total offheap size in bytes.
+     */
+    public long getOffHeapSize();
+
+    /**
+     * Total used offheap size in bytes.
+     *
+     * @return Total used offheap size in bytes.
+     */
+    public long getOffheapUsedSize();
+
+    /**
+     * Total size of memory allocated in bytes.
+     *
+     * @return Total size of memory allocated in bytes.
+     */
+    public long getTotalAllocatedSize();
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/ae18817f/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 795601e..019938f 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
@@ -104,6 +104,7 @@ import org.apache.ignite.internal.binary.BinaryMarshaller;
 import org.apache.ignite.internal.binary.BinaryUtils;
 import org.apache.ignite.internal.cluster.ClusterGroupAdapter;
 import org.apache.ignite.internal.cluster.IgniteClusterEx;
+import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import org.apache.ignite.internal.processors.failure.FailureProcessor;
 import org.apache.ignite.internal.managers.GridManager;
 import org.apache.ignite.internal.managers.checkpoint.GridCheckpointManager;

http://git-wip-us.apache.org/repos/asf/ignite/blob/ae18817f/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheGroupMetricsMXBeanImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheGroupMetricsMXBeanImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheGroupMetricsMXBeanImpl.java
index 0788ee9..e9a2736 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheGroupMetricsMXBeanImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheGroupMetricsMXBeanImpl.java
@@ -25,12 +25,18 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
+import java.util.concurrent.atomic.LongAdder;
+import org.apache.ignite.cache.CacheMode;
 import org.apache.ignite.cluster.ClusterNode;
 import org.apache.ignite.internal.processors.affinity.AffinityAssignment;
 import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
+import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtLocalPartition;
 import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtPartitionState;
 import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionFullMap;
 import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionMap;
+import org.apache.ignite.internal.processors.cache.persistence.AllocatedPageTracker;
+import org.apache.ignite.internal.processors.cache.persistence.DataRegion;
+import org.apache.ignite.internal.processors.cache.persistence.DataRegionMetricsImpl;
 import org.apache.ignite.mxbean.CacheGroupMetricsMXBean;
 
 /**
@@ -40,6 +46,9 @@ public class CacheGroupMetricsMXBeanImpl implements CacheGroupMetricsMXBean {
     /** Cache group context. */
     private final CacheGroupContext ctx;
 
+    /** */
+    private final GroupAllocationTrucker groupPageAllocationTracker;
+
     /** Interface describing a predicate of two integers. */
     private interface IntBiPredicate {
         /**
@@ -52,12 +61,58 @@ public class CacheGroupMetricsMXBeanImpl implements CacheGroupMetricsMXBean {
     }
 
     /**
-     * Creates MBean;
+     *
+     */
+    public static class GroupAllocationTrucker implements AllocatedPageTracker {
+        /** */
+        private final LongAdder totalAllocatedPages = new LongAdder();
+
+        /** */
+        private final AllocatedPageTracker delegate;
+
+        /**
+         * @param delegate Delegate allocation trucker.
+         */
+        public GroupAllocationTrucker(AllocatedPageTracker delegate) {
+            this.delegate = delegate;
+        }
+
+        /** {@inheritDoc} */
+        @Override public void updateTotalAllocatedPages(long delta) {
+            totalAllocatedPages.add(delta);
+
+            delegate.updateTotalAllocatedPages(delta);
+        }
+    }
+
+    /**
+     *
+     */
+    private static class NoopAllocationTrucker implements AllocatedPageTracker{
+        /** {@inheritDoc} */
+        @Override public void updateTotalAllocatedPages(long delta) {
+            // No-op.
+        }
+    }
+
+    /**
+     * Creates Group metrics MBean.
      *
      * @param ctx Cache group context.
      */
     public CacheGroupMetricsMXBeanImpl(CacheGroupContext ctx) {
         this.ctx = ctx;
+
+        DataRegion region = ctx.dataRegion();
+
+        // On client node, region is null.
+        if (region != null) {
+            DataRegionMetricsImpl dataRegionMetrics = ctx.dataRegion().memoryMetrics();
+
+            this.groupPageAllocationTracker = dataRegionMetrics.getOrAllocateGroupPageAllocationTracker(ctx.groupId());
+        }
+        else
+            this.groupPageAllocationTracker = new GroupAllocationTrucker(new NoopAllocationTrucker());
     }
 
     /** {@inheritDoc} */
@@ -252,4 +307,33 @@ public class CacheGroupMetricsMXBeanImpl implements CacheGroupMetricsMXBean {
 
         return assignmentMap;
     }
+
+    /** {@inheritDoc} */
+    @Override public String getType() {
+        CacheMode type = ctx.config().getCacheMode();
+
+        return String.valueOf(type);
+    }
+
+    /** {@inheritDoc} */
+    @Override public List<Integer> getPartitionIds() {
+        List<GridDhtLocalPartition> parts = ctx.topology().localPartitions();
+
+        List<Integer> partsRes = new ArrayList<>(parts.size());
+
+        for (GridDhtLocalPartition part : parts)
+            partsRes.add(part.id());
+
+        return partsRes;
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getTotalAllocatedPages() {
+        return groupPageAllocationTracker.totalAllocatedPages.longValue();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getTotalAllocatedSize() {
+        return getTotalAllocatedPages() * ctx.dataRegion().pageMemory().pageSize();
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/ae18817f/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/DataRegionMetricsImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/DataRegionMetricsImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/DataRegionMetricsImpl.java
index 7d6b478..cb13747 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/DataRegionMetricsImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/DataRegionMetricsImpl.java
@@ -16,10 +16,13 @@
  */
 package org.apache.ignite.internal.processors.cache.persistence;
 
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicLong;
 import java.util.concurrent.atomic.LongAdder;
 import org.apache.ignite.DataRegionMetrics;
 import org.apache.ignite.configuration.DataRegionConfiguration;
 import org.apache.ignite.internal.pagemem.PageMemory;
+import org.apache.ignite.internal.processors.cache.CacheGroupMetricsMXBeanImpl.GroupAllocationTrucker;
 import org.apache.ignite.internal.processors.cache.ratemetrics.HitRateMetrics;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.lang.IgniteOutClosure;
@@ -35,13 +38,28 @@ public class DataRegionMetricsImpl implements DataRegionMetrics, AllocatedPageTr
     /** */
     private final LongAdder totalAllocatedPages = new LongAdder();
 
+    /** */
+    private final ConcurrentHashMap<Integer, GroupAllocationTrucker> groupAllocationTruckers = new ConcurrentHashMap<>();
+
     /**
      * Counter for number of pages occupied by large entries (one entry is larger than one page).
      */
     private final LongAdder largeEntriesPages = new LongAdder();
 
     /** Counter for number of dirty pages. */
-    private LongAdder dirtyPages = new LongAdder();
+    private final LongAdder dirtyPages = new LongAdder();
+
+    /** */
+    private final LongAdder readPages = new LongAdder();
+
+    /** */
+    private final LongAdder writtenPages = new LongAdder();
+
+    /** */
+    private final LongAdder replacedPages = new LongAdder();
+
+    /** */
+    private final AtomicLong offHeapSize = new AtomicLong();
 
     /** */
     private volatile boolean metricsEnabled;
@@ -212,7 +230,7 @@ public class DataRegionMetricsImpl implements DataRegionMetrics, AllocatedPageTr
     }
 
     /** {@inheritDoc} */
-    public int getPageSize() {
+    @Override public int getPageSize() {
         if (!metricsEnabled)
             return 0;
 
@@ -221,6 +239,54 @@ public class DataRegionMetricsImpl implements DataRegionMetrics, AllocatedPageTr
         return pageMem.pageSize();
     }
 
+    /** {@inheritDoc} */
+    @Override public long getPagesRead() {
+        if (!metricsEnabled)
+            return 0;
+
+        return readPages.longValue();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getPagesWritten() {
+        if (!metricsEnabled)
+            return 0;
+
+        return writtenPages.longValue();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getPagesReplaced() {
+        if (!metricsEnabled)
+            return 0;
+
+        return replacedPages.longValue();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getOffHeapSize() {
+        if (!metricsEnabled)
+            return 0;
+
+        return offHeapSize.get();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getOffheapUsedSize() {
+        if (!metricsEnabled)
+            return 0;
+
+        return pageMem.loadedPages() * pageMem.pageSize();
+    }
+
+    /**
+     *
+     * @param size Region size.
+     */
+    public void updateOffHeapSize(long size) {
+        this.offHeapSize.addAndGet(size);
+    }
+
     /**
      * Updates pageReplaceRate metric.
      */
@@ -229,10 +295,28 @@ public class DataRegionMetricsImpl implements DataRegionMetrics, AllocatedPageTr
             pageReplaceRate.onHit();
 
             pageReplaceAge.onHits(pageAge);
+
+            replacedPages.increment();
         }
     }
 
     /**
+     * Updates page read.
+     */
+    public void onPageRead(){
+        if (metricsEnabled)
+            readPages.increment();
+    }
+
+    /**
+     * Updates page written.
+     */
+    public void onPageWritten(){
+        if (metricsEnabled)
+            writtenPages.increment();
+    }
+
+    /**
      * Increments dirtyPages counter.
      */
     public void incrementDirtyPages() {
@@ -274,6 +358,16 @@ public class DataRegionMetricsImpl implements DataRegionMetrics, AllocatedPageTr
     }
 
     /**
+     * Get or allocate group allocation trucker.
+     *
+     * @param grpId Group id.
+     * @return Group allocation trucker.
+     */
+    public GroupAllocationTrucker getOrAllocateGroupPageAllocationTracker(int grpId) {
+        return groupAllocationTruckers.getOrDefault(grpId, new GroupAllocationTrucker(this));
+    }
+
+    /**
      *
      */
     private void updateAllocationRateMetrics(long hits) {

http://git-wip-us.apache.org/repos/asf/ignite/blob/ae18817f/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/DataRegionMetricsMXBeanImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/DataRegionMetricsMXBeanImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/DataRegionMetricsMXBeanImpl.java
index fc746fe..9ab6824 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/DataRegionMetricsMXBeanImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/DataRegionMetricsMXBeanImpl.java
@@ -158,4 +158,29 @@ class DataRegionMetricsMXBeanImpl implements DataRegionMetricsMXBean {
     @Override public String getSwapPath() {
         return dataRegCfg.getSwapPath();
     }
+
+    /** {@inheritDoc} */
+    @Override public long getPagesRead() {
+        return memMetrics.getPagesRead();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getPagesWritten() {
+        return memMetrics.getPagesWritten();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getPagesReplaced() {
+        return memMetrics.getPagesReplaced();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getOffHeapSize() {
+        return memMetrics.getOffHeapSize();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getOffheapUsedSize() {
+        return memMetrics.getOffheapUsedSize();
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/ae18817f/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/DataRegionMetricsSnapshot.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/DataRegionMetricsSnapshot.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/DataRegionMetricsSnapshot.java
index d715e82..6126c4b 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/DataRegionMetricsSnapshot.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/DataRegionMetricsSnapshot.java
@@ -68,6 +68,21 @@ public class DataRegionMetricsSnapshot implements DataRegionMetrics {
     /** */
     private int pageSize;
 
+    /** */
+    private long readPages;
+
+    /** */
+    private long writtenPages;
+
+    /** */
+    private long replacedPage;
+
+    /** */
+    private long offHeapSize;
+
+    /** */
+    private long offHeapUsedSize;
+
     /**
      * @param metrics Metrics instance to take a copy.
      */
@@ -87,6 +102,11 @@ public class DataRegionMetricsSnapshot implements DataRegionMetrics {
         checkpointBufferPages = metrics.getCheckpointBufferPages();
         checkpointBufferSize = metrics.getCheckpointBufferSize();
         pageSize = metrics.getPageSize();
+        readPages = metrics.getPagesRead();
+        writtenPages = metrics.getPagesWritten();
+        replacedPage = metrics.getPagesReplaced();
+        offHeapSize = metrics.getOffHeapSize();
+        offHeapUsedSize = metrics.getOffheapUsedSize();
     }
 
     /** {@inheritDoc} */
@@ -163,4 +183,29 @@ public class DataRegionMetricsSnapshot implements DataRegionMetrics {
     @Override public int getPageSize() {
         return pageSize;
     }
+
+    /** {@inheritDoc} */
+    @Override public long getPagesRead() {
+        return readPages;
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getPagesWritten() {
+        return writtenPages;
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getPagesReplaced() {
+        return replacedPage;
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getOffHeapSize() {
+        return offHeapSize;
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getOffheapUsedSize() {
+        return offHeapUsedSize;
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/ae18817f/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/DataStorageMetricsImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/DataStorageMetricsImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/DataStorageMetricsImpl.java
index 4f32c25..b7f99e5 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/DataStorageMetricsImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/DataStorageMetricsImpl.java
@@ -16,8 +16,14 @@
  */
 package org.apache.ignite.internal.processors.cache.persistence;
 
+import java.util.Collection;
+import java.util.concurrent.atomic.AtomicLong;
+import org.apache.ignite.DataRegionMetrics;
 import org.apache.ignite.internal.pagemem.wal.IgniteWriteAheadLogManager;
 import org.apache.ignite.internal.processors.cache.ratemetrics.HitRateMetrics;
+import org.apache.ignite.internal.util.typedef.F;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.lang.IgniteOutClosure;
 import org.apache.ignite.mxbean.DataStorageMetricsMXBean;
 
 /**
@@ -73,7 +79,19 @@ public class DataStorageMetricsImpl implements DataStorageMetricsMXBean {
     private volatile boolean metricsEnabled;
 
     /** */
-    private IgniteWriteAheadLogManager wal;
+    private volatile IgniteWriteAheadLogManager wal;
+
+    /** */
+    private volatile IgniteOutClosure<Long> walSizeProvider;
+
+    /** */
+    private volatile long lastWalSegmentRollOverTime;
+
+    /** */
+    private final AtomicLong totalCheckpointTime = new AtomicLong();
+
+    /** */
+    private volatile Collection<DataRegionMetrics> regionMetrics;
 
     /**
      * @param metricsEnabled Metrics enabled flag.
@@ -226,6 +244,158 @@ public class DataStorageMetricsImpl implements DataStorageMetricsMXBean {
         resetRates();
     }
 
+    /** {@inheritDoc} */
+    @Override public long getWalTotalSize() {
+        if (!metricsEnabled)
+            return 0;
+
+        IgniteOutClosure<Long> walSize = this.walSizeProvider;
+
+        return walSize != null ? walSize.apply() : 0;
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getWalLastRollOverTime() {
+        if (!metricsEnabled)
+            return 0;
+
+        return lastWalSegmentRollOverTime;
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getCheckpointTotalTime() {
+        if (!metricsEnabled)
+            return 0;
+
+        return totalCheckpointTime.get();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getDirtyPages() {
+        if (!metricsEnabled)
+            return 0;
+
+        Collection<DataRegionMetrics> regionMetrics0 = regionMetrics;
+
+        if (F.isEmpty(regionMetrics0))
+            return 0;
+
+        long dirtyPages = 0L;
+
+        for (DataRegionMetrics rm : regionMetrics0)
+            dirtyPages += rm.getDirtyPages();
+
+        return dirtyPages;
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getPagesRead() {
+        if (!metricsEnabled)
+            return 0;
+
+        Collection<DataRegionMetrics> regionMetrics0 = regionMetrics;
+
+        if (F.isEmpty(regionMetrics0))
+            return 0;
+
+        long readPages = 0L;
+
+        for (DataRegionMetrics rm : regionMetrics0)
+            readPages += rm.getPagesRead();
+
+        return readPages;
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getPagesWritten() {
+        if (!metricsEnabled)
+            return 0;
+
+        Collection<DataRegionMetrics> regionMetrics0 = regionMetrics;
+
+        if (F.isEmpty(regionMetrics0))
+            return 0;
+
+        long writtenPages = 0L;
+
+        for (DataRegionMetrics rm : regionMetrics0)
+            writtenPages += rm.getPagesWritten();
+
+        return writtenPages;
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getPagesReplaced() {
+        if (!metricsEnabled)
+            return 0;
+
+        Collection<DataRegionMetrics> regionMetrics0 = regionMetrics;
+
+        if (F.isEmpty(regionMetrics0))
+            return 0;
+
+        long replacedPages = 0L;
+
+        for (DataRegionMetrics rm : regionMetrics0)
+            replacedPages += rm.getPagesReplaced();
+
+        return replacedPages;
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getOffHeapSize() {
+        if (!metricsEnabled)
+            return 0;
+
+        Collection<DataRegionMetrics> regionMetrics0 = regionMetrics;
+
+        if (F.isEmpty(regionMetrics0))
+            return 0;
+
+        long offHeapSize = 0L;
+
+        for (DataRegionMetrics rm : regionMetrics0)
+            offHeapSize += rm.getOffHeapSize();
+
+        return offHeapSize;
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getOffheapUsedSize() {
+        if (!metricsEnabled)
+            return 0;
+
+        Collection<DataRegionMetrics> regionMetrics0 = regionMetrics;
+
+        if (F.isEmpty(regionMetrics0))
+            return 0;
+
+        long offHeapUsedSize = 0L;
+
+        for (DataRegionMetrics rm : regionMetrics0)
+            offHeapUsedSize += rm.getOffheapUsedSize();
+
+        return offHeapUsedSize;
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getTotalAllocatedSize() {
+        if (!metricsEnabled)
+            return 0;
+
+        Collection<DataRegionMetrics> regionMetrics0 = regionMetrics;
+
+        if (F.isEmpty(regionMetrics0))
+            return 0;
+
+        long totalAllocatedSize = 0L;
+
+        for (DataRegionMetrics rm : regionMetrics0)
+            totalAllocatedSize += rm.getTotalAllocatedSize();
+
+        return totalAllocatedSize;
+    }
+
     /**
      * @param wal Write-ahead log manager.
      */
@@ -234,6 +404,27 @@ public class DataStorageMetricsImpl implements DataStorageMetricsMXBean {
     }
 
     /**
+     * @param walSizeProvider Wal size provider.
+     */
+    public void setWalSizeProvider(IgniteOutClosure<Long> walSizeProvider){
+        this.walSizeProvider = walSizeProvider;
+    }
+
+    /**
+     *
+     */
+    public void onWallRollOver() {
+        this.lastWalSegmentRollOverTime = U.currentTimeMillis();
+    }
+
+    /**
+     *
+     */
+    public void regionMetrics(Collection<DataRegionMetrics> regionMetrics){
+        this.regionMetrics = regionMetrics;
+    }
+
+    /**
      * @return Metrics enabled flag.
      */
     public boolean metricsEnabled() {
@@ -269,6 +460,8 @@ public class DataStorageMetricsImpl implements DataStorageMetricsMXBean {
             lastCpTotalPages = totalPages;
             lastCpDataPages = dataPages;
             lastCpCowPages = cowPages;
+
+            totalCheckpointTime.addAndGet(duration);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/ae18817f/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/DataStorageMetricsSnapshot.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/DataStorageMetricsSnapshot.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/DataStorageMetricsSnapshot.java
index c67eeeb..cb52279 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/DataStorageMetricsSnapshot.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/DataStorageMetricsSnapshot.java
@@ -62,6 +62,36 @@ public class DataStorageMetricsSnapshot implements DataStorageMetrics {
     /** */
     private long lastCpCowPages;
 
+    /** */
+    private long walTotalSize;
+
+    /** */
+    private long walLastRollOverTime;
+
+    /** */
+    private long checkpointTotalSize;
+
+    /** */
+    private long dirtyPages;
+
+    /** */
+    private long readPages;
+
+    /** */
+    private long writtenPages;
+
+    /** */
+    private long replacedPages;
+
+    /** */
+    private long offHeapSize;
+
+    /** */
+    private long offHeadUsedSize;
+
+    /** */
+    private long totalAllocatedSize;
+
     /**
      * @param metrics Metrics.
      */
@@ -79,6 +109,16 @@ public class DataStorageMetricsSnapshot implements DataStorageMetrics {
         lastCpTotalPages = metrics.getLastCheckpointTotalPagesNumber();
         lastCpDataPages = metrics.getLastCheckpointDataPagesNumber();
         lastCpCowPages = metrics.getLastCheckpointCopiedOnWritePagesNumber();
+        walTotalSize = metrics.getWalTotalSize();
+        walLastRollOverTime = metrics.getWalLastRollOverTime();
+        checkpointTotalSize = metrics.getCheckpointTotalTime();
+        dirtyPages = metrics.getDirtyPages();
+        readPages = metrics.getPagesRead();
+        writtenPages = metrics.getPagesWritten();
+        replacedPages = metrics.getPagesReplaced();
+        offHeapSize = metrics.getOffHeapSize();
+        offHeadUsedSize = metrics.getOffheapUsedSize();
+        totalAllocatedSize = metrics.getTotalAllocatedSize();
     }
 
     /** {@inheritDoc} */
@@ -147,6 +187,56 @@ public class DataStorageMetricsSnapshot implements DataStorageMetrics {
     }
 
     /** {@inheritDoc} */
+    @Override public long getWalTotalSize() {
+        return walTotalSize;
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getWalLastRollOverTime() {
+        return walLastRollOverTime;
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getCheckpointTotalTime() {
+        return checkpointTotalSize;
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getDirtyPages() {
+        return dirtyPages;
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getPagesRead() {
+        return readPages;
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getPagesWritten() {
+        return writtenPages;
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getPagesReplaced() {
+        return replacedPages;
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getOffHeapSize() {
+        return offHeapSize;
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getOffheapUsedSize() {
+        return offHeadUsedSize;
+    }
+
+    /** {@inheritDoc} */
+    @Override public long getTotalAllocatedSize() {
+        return totalAllocatedSize;
+    }
+
+    /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(DataStorageMetricsSnapshot.class, this);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/ae18817f/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheDatabaseSharedManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheDatabaseSharedManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheDatabaseSharedManager.java
index d314d50..e20abd6 100755
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheDatabaseSharedManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheDatabaseSharedManager.java
@@ -86,6 +86,7 @@ import org.apache.ignite.internal.IgniteInterruptedCheckedException;
 import org.apache.ignite.internal.NodeStoppingException;
 import org.apache.ignite.internal.managers.discovery.GridDiscoveryManager;
 import org.apache.ignite.internal.mem.DirectMemoryProvider;
+import org.apache.ignite.internal.mem.DirectMemoryRegion;
 import org.apache.ignite.internal.mem.file.MappedFileMemoryProvider;
 import org.apache.ignite.internal.mem.unsafe.UnsafeMemoryProvider;
 import org.apache.ignite.internal.pagemem.FullPageId;
@@ -470,6 +471,8 @@ public class GridCacheDatabaseSharedManager extends IgniteCacheDatabaseSharedMan
             createDataRegionConfiguration(memCfg),
             false
         );
+
+        persStoreMetrics.regionMetrics(memMetricsMap.values());
     }
 
     /**
@@ -1009,7 +1012,7 @@ public class GridCacheDatabaseSharedManager extends IgniteCacheDatabaseSharedMan
             changeTracker = null;
 
         PageMemoryImpl pageMem = new PageMemoryImpl(
-            memProvider,
+            wrapMetricsMemoryProvider(memProvider, memMetrics),
             calculateFragmentSizes(
                 memCfg.getConcurrencyLevel(),
                 cacheSize,
@@ -1018,6 +1021,8 @@ public class GridCacheDatabaseSharedManager extends IgniteCacheDatabaseSharedMan
             cctx,
             memCfg.getPageSize(),
             (fullId, pageBuf, tag) -> {
+                memMetrics.onPageWritten();
+
                 // First of all, write page to disk.
                 storeMgr.write(fullId.groupId(), fullId.pageId(), pageBuf, tag);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/ae18817f/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IgniteCacheDatabaseSharedManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IgniteCacheDatabaseSharedManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IgniteCacheDatabaseSharedManager.java
index bf080b6..a251234 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IgniteCacheDatabaseSharedManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IgniteCacheDatabaseSharedManager.java
@@ -37,6 +37,7 @@ import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.internal.GridKernalContext;
 import org.apache.ignite.internal.IgniteInternalFuture;
 import org.apache.ignite.internal.mem.DirectMemoryProvider;
+import org.apache.ignite.internal.mem.DirectMemoryRegion;
 import org.apache.ignite.internal.mem.file.MappedFileMemoryProvider;
 import org.apache.ignite.internal.mem.unsafe.UnsafeMemoryProvider;
 import org.apache.ignite.internal.pagemem.PageMemory;
@@ -247,6 +248,7 @@ public class IgniteCacheDatabaseSharedManager extends GridCacheSharedManagerAdap
             CU.isPersistenceEnabled(memCfg)
         );
 
+
         dataRegionsInitialized = true;
     }
 
@@ -957,7 +959,7 @@ public class IgniteCacheDatabaseSharedManager extends GridCacheSharedManagerAdap
 
         PageMemory pageMem = new PageMemoryNoStoreImpl(
             log,
-            memProvider,
+            wrapMetricsMemoryProvider(memProvider, memMetrics),
             cctx,
             memCfg.getPageSize(),
             memPlcCfg,
@@ -971,6 +973,39 @@ public class IgniteCacheDatabaseSharedManager extends GridCacheSharedManagerAdap
     }
 
     /**
+     * @param memoryProvider0 Memory provider.
+     * @param memMetrics Memory metrics.
+     * @return Wrapped memory provider.
+     */
+    protected DirectMemoryProvider wrapMetricsMemoryProvider(
+        final DirectMemoryProvider memoryProvider0,
+        final DataRegionMetricsImpl memMetrics
+    ) {
+        return new DirectMemoryProvider() {
+            private final DirectMemoryProvider memProvider = memoryProvider0;
+
+            @Override public void initialize(long[] chunkSizes) {
+                memProvider.initialize(chunkSizes);
+            }
+
+            @Override public void shutdown() {
+                memProvider.shutdown();
+            }
+
+            @Override public DirectMemoryRegion nextRegion() {
+                DirectMemoryRegion nextMemoryRegion = memProvider.nextRegion();
+
+                if (nextMemoryRegion == null)
+                    return null;
+
+                memMetrics.updateOffHeapSize(nextMemoryRegion.size());
+
+                return nextMemoryRegion;
+            }
+        };
+    }
+
+    /**
      * @param path Path to the working directory.
      * @param consId Consistent ID of the local node.
      * @return DB storage path.

http://git-wip-us.apache.org/repos/asf/ignite/blob/ae18817f/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/file/FilePageStoreManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/file/FilePageStoreManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/file/FilePageStoreManager.java
index 1c1b3e2..661694d 100755
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/file/FilePageStoreManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/file/FilePageStoreManager.java
@@ -52,10 +52,12 @@ import org.apache.ignite.internal.processors.cache.CacheGroupDescriptor;
 import org.apache.ignite.internal.processors.cache.GridCacheSharedManagerAdapter;
 import org.apache.ignite.internal.processors.cache.StoredCacheData;
 import org.apache.ignite.internal.processors.cache.persistence.AllocatedPageTracker;
+import org.apache.ignite.internal.processors.cache.persistence.DataRegionMetricsImpl;
 import org.apache.ignite.internal.processors.cache.persistence.filename.PdsFolderSettings;
 import org.apache.ignite.internal.processors.cache.persistence.metastorage.MetaStorage;
 import org.apache.ignite.internal.processors.cache.persistence.snapshot.IgniteCacheSnapshotManager;
 import org.apache.ignite.internal.util.IgniteUtils;
+import org.apache.ignite.internal.util.typedef.internal.CU;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.marshaller.Marshaller;
 import org.apache.ignite.marshaller.jdk.JdkMarshaller;
@@ -409,13 +411,20 @@ public class FilePageStoreManager extends GridCacheSharedManagerAdapter implemen
 
         File cacheWorkDir = cacheWorkDir(ccfg);
 
-        AllocatedPageTracker allocatedTracker =
-            cctx.database().dataRegion(grpDesc.config().getDataRegionName()).memoryMetrics();
+        String dataRegionName = grpDesc.config().getDataRegionName();
 
-        return initDir(cacheWorkDir,
+        DataRegionMetricsImpl regionMetrics = cctx.database().dataRegion(dataRegionName).memoryMetrics();
+
+        int grpId = CU.cacheId(grpDesc.cacheOrGroupName());
+
+        AllocatedPageTracker allocatedTracker = regionMetrics.getOrAllocateGroupPageAllocationTracker(grpId);
+
+        return initDir(
+            cacheWorkDir,
             grpDesc.groupId(),
             grpDesc.config().getAffinity().partitions(),
-            allocatedTracker);
+            allocatedTracker
+        );
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/ae18817f/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/PageMemoryImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/PageMemoryImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/PageMemoryImpl.java
index c684ce1..10d0a3f 100755
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/PageMemoryImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/PageMemoryImpl.java
@@ -777,6 +777,8 @@ public class PageMemoryImpl implements PageMemoryEx {
 
                 try {
                     storeMgr.read(grpId, pageId, buf);
+
+                    memMetrics.onPageRead();
                 }
                 catch (IgniteDataIntegrityViolationException ignore) {
                     U.warn(log, "Failed to read page (data integrity violation encountered, will try to " +
@@ -785,6 +787,8 @@ public class PageMemoryImpl implements PageMemoryEx {
                     buf.rewind();
 
                     tryToRestorePage(fullId, buf);
+
+                    memMetrics.onPageRead();
                 }
                 finally {
                     rwLock.writeUnlock(lockedPageAbsPtr + PAGE_LOCK_OFFSET, OffheapReadWriteLock.TAG_LOCK_ALWAYS);
@@ -1173,6 +1177,8 @@ public class PageMemoryImpl implements PageMemoryEx {
             assert PageIO.getType(outBuf) != 0 : "Invalid state. Type is 0! pageId = " + U.hexLong(fullId.pageId());
             assert PageIO.getVersion(outBuf) != 0 : "Invalid state. Version is 0! pageId = " + U.hexLong(fullId.pageId());
 
+            memMetrics.onPageWritten();
+
             return true;
         }
         finally {

http://git-wip-us.apache.org/repos/asf/ignite/blob/ae18817f/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/FileWriteAheadLogManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/FileWriteAheadLogManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/FileWriteAheadLogManager.java
index 9917e85..a28b73b 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/FileWriteAheadLogManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/FileWriteAheadLogManager.java
@@ -66,7 +66,6 @@ import org.apache.ignite.configuration.WALMode;
 import org.apache.ignite.events.EventType;
 import org.apache.ignite.events.WalSegmentArchivedEvent;
 import org.apache.ignite.failure.FailureContext;
-import org.apache.ignite.failure.FailureType;
 import org.apache.ignite.internal.GridKernalContext;
 import org.apache.ignite.internal.IgniteInternalFuture;
 import org.apache.ignite.internal.IgniteInterruptedCheckedException;
@@ -101,6 +100,7 @@ import org.apache.ignite.internal.util.future.GridFinishedFuture;
 import org.apache.ignite.internal.util.future.GridFutureAdapter;
 import org.apache.ignite.internal.util.typedef.CI1;
 import org.apache.ignite.internal.util.typedef.CIX1;
+import org.apache.ignite.internal.util.typedef.CO;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.internal.SB;
 import org.apache.ignite.internal.util.typedef.internal.U;
@@ -367,14 +367,14 @@ public class FileWriteAheadLogManager extends GridCacheSharedManagerAdapter impl
 
             checkWalConfiguration();
 
-            walWorkDir = initDirectory(
+            final File walWorkDir0 = walWorkDir = initDirectory(
                 dsCfg.getWalPath(),
                 DataStorageConfiguration.DFLT_WAL_PATH,
                 resolveFolders.folderName(),
                 "write ahead log work directory"
             );
 
-            walArchiveDir = initDirectory(
+            final File walArchiveDir0 = walArchiveDir = initDirectory(
                 dsCfg.getWalArchivePath(),
                 DataStorageConfiguration.DFLT_WAL_ARCHIVE_PATH,
                 resolveFolders.folderName(),
@@ -389,6 +389,21 @@ public class FileWriteAheadLogManager extends GridCacheSharedManagerAdapter impl
 
             checkOrPrepareFiles();
 
+            if (metrics != null)
+                metrics.setWalSizeProvider(new CO<Long>() {
+                    @Override public Long apply() {
+                        long size = 0;
+
+                        for (File f : walWorkDir0.listFiles())
+                            size += f.length();
+
+                        for (File f : walArchiveDir0.listFiles())
+                            size += f.length();
+
+                        return size;
+                    }
+                });
+
             IgniteBiTuple<Long, Long> tup = scanMinMaxArchiveIndices();
 
             lastTruncatedArchiveIdx = tup == null ? -1 : tup.get1() - 1;
@@ -1042,6 +1057,9 @@ public class FileWriteAheadLogManager extends GridCacheSharedManagerAdapter impl
             return hnd;
 
         if (hnd.close(true)) {
+            if (metrics.metricsEnabled())
+                metrics.onWallRollOver();
+
             FileWriteHandle next = initNextWriteHandle(cur);
 
             next.writeHeader();

http://git-wip-us.apache.org/repos/asf/ignite/blob/ae18817f/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/FsyncModeFileWriteAheadLogManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/FsyncModeFileWriteAheadLogManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/FsyncModeFileWriteAheadLogManager.java
index 2305389..e354b43 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/FsyncModeFileWriteAheadLogManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/FsyncModeFileWriteAheadLogManager.java
@@ -94,6 +94,7 @@ import org.apache.ignite.internal.util.future.GridFinishedFuture;
 import org.apache.ignite.internal.util.future.GridFutureAdapter;
 import org.apache.ignite.internal.util.typedef.CI1;
 import org.apache.ignite.internal.util.typedef.CIX1;
+import org.apache.ignite.internal.util.typedef.CO;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.internal.util.typedef.internal.SB;
@@ -320,14 +321,14 @@ public class FsyncModeFileWriteAheadLogManager extends GridCacheSharedManagerAda
 
             checkWalConfiguration();
 
-            walWorkDir = initDirectory(
+            final File walWorkDir0 = walWorkDir = initDirectory(
                 dsCfg.getWalPath(),
                 DataStorageConfiguration.DFLT_WAL_PATH,
                 resolveFolders.folderName(),
                 "write ahead log work directory"
             );
 
-            walArchiveDir = initDirectory(
+            final File walArchiveDir0 = walArchiveDir = initDirectory(
                 dsCfg.getWalArchivePath(),
                 DataStorageConfiguration.DFLT_WAL_ARCHIVE_PATH,
                 resolveFolders.folderName(),
@@ -342,6 +343,20 @@ public class FsyncModeFileWriteAheadLogManager extends GridCacheSharedManagerAda
 
             checkOrPrepareFiles();
 
+            metrics.setWalSizeProvider(new CO<Long>() {
+                @Override public Long apply() {
+                    long size = 0;
+
+                    for (File f : walWorkDir0.listFiles())
+                        size += f.length();
+
+                    for (File f : walArchiveDir0.listFiles())
+                        size += f.length();
+
+                    return size;
+                }
+            });
+
             IgniteBiTuple<Long, Long> tup = scanMinMaxArchiveIndices();
 
             lastTruncatedArchiveIdx = tup == null ? -1 : tup.get1() - 1;
@@ -944,6 +959,9 @@ public class FsyncModeFileWriteAheadLogManager extends GridCacheSharedManagerAda
             return hnd;
 
         if (hnd.close(true)) {
+            if (metrics.metricsEnabled())
+                metrics.onWallRollOver();
+
             FileWriteHandle next = initNextWriteHandle(cur.idx);
 
             boolean swapped = currentHndUpd.compareAndSet(this, hnd, next);

http://git-wip-us.apache.org/repos/asf/ignite/blob/ae18817f/modules/core/src/main/java/org/apache/ignite/mxbean/CacheGroupMetricsMXBean.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/mxbean/CacheGroupMetricsMXBean.java b/modules/core/src/main/java/org/apache/ignite/mxbean/CacheGroupMetricsMXBean.java
index 46b99b1..9973d84 100644
--- a/modules/core/src/main/java/org/apache/ignite/mxbean/CacheGroupMetricsMXBean.java
+++ b/modules/core/src/main/java/org/apache/ignite/mxbean/CacheGroupMetricsMXBean.java
@@ -139,4 +139,28 @@ public interface CacheGroupMetricsMXBean {
      */
     @MXBeanDescription("Affinity partitions assignment map.")
     public Map<Integer, List<String>> getAffinityPartitionsAssignmentMap();
+
+    /**
+     * Cache group type.
+     */
+    @MXBeanDescription("Cache group type.")
+    public String getType();
+
+    /**
+     * Local partition ids.
+     */
+    @MXBeanDescription("Local partition ids.")
+    public List<Integer> getPartitionIds();
+
+    /**
+     * Cache group total allocated pages.
+     */
+    @MXBeanDescription("Cache group total allocated pages.")
+    public long getTotalAllocatedPages();
+
+    /**
+     * Total size of memory allocated for group, in bytes.
+     */
+    @MXBeanDescription("Total size of memory allocated for group, in bytes.")
+    public long getTotalAllocatedSize();
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/ae18817f/modules/core/src/main/java/org/apache/ignite/mxbean/DataRegionMetricsMXBean.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/mxbean/DataRegionMetricsMXBean.java b/modules/core/src/main/java/org/apache/ignite/mxbean/DataRegionMetricsMXBean.java
index 5b2697a..9bb1af6 100644
--- a/modules/core/src/main/java/org/apache/ignite/mxbean/DataRegionMetricsMXBean.java
+++ b/modules/core/src/main/java/org/apache/ignite/mxbean/DataRegionMetricsMXBean.java
@@ -89,6 +89,26 @@ public interface DataRegionMetricsMXBean extends DataRegionMetrics {
     @MXBeanDescription("Number of pages residing in physical RAM.")
     @Override public long getPhysicalMemoryPages();
 
+    /** {@inheritDoc} */
+    @MXBeanDescription("Number of pages read from last restart.")
+    @Override public long getPagesRead();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Number of pages written from last restart.")
+    @Override public long getPagesWritten();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Number of pages replaced from last restart.")
+    @Override public long getPagesReplaced();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Offheap size in bytes.")
+    @Override public long getOffHeapSize();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Offheap used size in bytes.")
+    @Override public long getOffheapUsedSize();
+
     /**
      * Enables memory metrics collection on an Apache Ignite node.
      */

http://git-wip-us.apache.org/repos/asf/ignite/blob/ae18817f/modules/core/src/main/java/org/apache/ignite/mxbean/DataStorageMetricsMXBean.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/mxbean/DataStorageMetricsMXBean.java b/modules/core/src/main/java/org/apache/ignite/mxbean/DataStorageMetricsMXBean.java
index 2051da3..2450874 100644
--- a/modules/core/src/main/java/org/apache/ignite/mxbean/DataStorageMetricsMXBean.java
+++ b/modules/core/src/main/java/org/apache/ignite/mxbean/DataStorageMetricsMXBean.java
@@ -45,6 +45,18 @@ public interface DataStorageMetricsMXBean extends DataStorageMetrics {
     @Override long getWalBuffPollSpinsRate();
 
     /** {@inheritDoc} */
+    @MXBeanDescription("Total size in bytes for storage wal files.")
+    @Override long getWalTotalSize();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Time of the last WAL segment rollover.")
+    @Override long getWalLastRollOverTime();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Total checkpoint time from last restart.")
+    @Override long getCheckpointTotalTime();
+
+    /** {@inheritDoc} */
     @MXBeanDescription("Duration of the last checkpoint in milliseconds.")
     @Override long getLastCheckpointDuration();
 
@@ -76,6 +88,34 @@ public interface DataStorageMetricsMXBean extends DataStorageMetrics {
     @MXBeanDescription("Number of pages copied to a temporary checkpoint buffer during the last checkpoint.")
     @Override long getLastCheckpointCopiedOnWritePagesNumber();
 
+    /** {@inheritDoc} */
+    @MXBeanDescription("Total dirty pages for the next checkpoint.")
+    @Override long getDirtyPages();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("The number of read pages from last restart.")
+    @Override long getPagesRead();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("The number of written pages from last restart.")
+    @Override long getPagesWritten();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("The number of replaced pages from last restart.")
+    @Override long getPagesReplaced();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Total offheap size in bytes.")
+    @Override long getOffHeapSize();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Total used offheap size in bytes.")
+    @Override long getOffheapUsedSize();
+
+    /** {@inheritDoc} */
+    @MXBeanDescription("Total size of memory allocated in bytes.")
+    @Override long getTotalAllocatedSize();
+
     /**
      * Enables persistence metrics collection on an Apache Ignite node.
      */

http://git-wip-us.apache.org/repos/asf/ignite/blob/ae18817f/modules/core/src/test/java/org/apache/ignite/internal/processors/database/SwapPathConstructionSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/SwapPathConstructionSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/SwapPathConstructionSelfTest.java
index 416087b..177bcbe 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/SwapPathConstructionSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/SwapPathConstructionSelfTest.java
@@ -124,7 +124,9 @@ public class SwapPathConstructionSelfTest extends GridCommonAbstractTest {
 
         Object memProvider = U.field(pageMem, "directMemoryProvider");
 
-        return ((File) U.field(memProvider, "allocationPath")).getAbsolutePath();
+        Object memProvider0 = U.field(memProvider, "memProvider");
+
+        return ((File) U.field(memProvider0, "allocationPath")).getAbsolutePath();
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/ae18817f/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/DataRegionMetricsParityTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/DataRegionMetricsParityTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/DataRegionMetricsParityTest.cs
index bea31b1..22b8986 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/DataRegionMetricsParityTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/DataRegionMetricsParityTest.cs
@@ -34,7 +34,13 @@ namespace Apache.Ignite.Core.Tests.ApiParity
         };
 
         /** Properties that are missing on .NET side. */
-        private static readonly string[] MissingProperties = {};
+        private static readonly string[] MissingProperties = {
+            "PagesRead",
+            "PagesWritten",
+            "PagesReplaced",
+            "OffHeapSize",
+            "OffheapUsedSize"
+        };
 
         /// <summary>
         /// Tests the API parity.

http://git-wip-us.apache.org/repos/asf/ignite/blob/ae18817f/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/DataStorageMetricsParityTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/DataStorageMetricsParityTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/DataStorageMetricsParityTest.cs
index 2206891..300ab25 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/DataStorageMetricsParityTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/DataStorageMetricsParityTest.cs
@@ -1,4 +1,4 @@
-/*
+/*
  * 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.
@@ -28,7 +28,17 @@ namespace Apache.Ignite.Core.Tests.ApiParity
         private static readonly string[] MissingProperties =
         {
             // IGNITE-7305
-            "WalBuffPollSpinsRate"
+            "WalBuffPollSpinsRate",
+            "WalTotalSize",
+            "WalLastRollOverTime",
+            "CheckpointTotalTime",
+            "DirtyPages",
+            "PagesRead",
+            "PagesWritten",
+            "PagesReplaced",
+            "OffHeapSize",
+            "OffheapUsedSize",
+            "TotalAllocatedSize"
         };
 
         /// <summary>