You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ni...@apache.org on 2019/08/02 10:05:22 UTC

[ignite] branch master updated: IGNITE-11922: Migration of ClusterMetricsMXBeanImpl to the new metric framework (#6648)

This is an automated email from the ASF dual-hosted git repository.

nizhikov pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/master by this push:
     new 4efe78b  IGNITE-11922: Migration of ClusterMetricsMXBeanImpl to the new metric framework (#6648)
4efe78b is described below

commit 4efe78b3b709505d49e8b73ae59a42d2eed07b30
Author: Ivan Fedotov <va...@gmail.com>
AuthorDate: Fri Aug 2 13:05:06 2019 +0300

    IGNITE-11922: Migration of ClusterMetricsMXBeanImpl to the new metric framework (#6648)
    
    Metrics migration
---
 .../managers/communication/GridIoManager.java      | 36 ++++++++++++++
 .../managers/discovery/ClusterMetricsImpl.java     | 57 +++++++++++++++++++---
 .../processors/cache/GridCacheProcessor.java       | 23 ---------
 .../wal/reader/StandaloneGridKernalContext.java    |  3 +-
 .../cache/version/GridCacheVersionManager.java     | 19 ++++++++
 .../processors/task/GridTaskProcessor.java         | 26 +++++-----
 .../tcp/TcpCommunicationMetricsListener.java       |  3 ++
 .../internal/managers/GridManagerStopSelfTest.java |  4 ++
 8 files changed, 125 insertions(+), 46 deletions(-)

diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoManager.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoManager.java
index 83ad60f..91064d3 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoManager.java
@@ -68,6 +68,7 @@ import org.apache.ignite.internal.managers.deployment.GridDeployment;
 import org.apache.ignite.internal.managers.eventstorage.GridEventStorageManager;
 import org.apache.ignite.internal.managers.eventstorage.GridLocalEventListener;
 import org.apache.ignite.internal.processors.cache.mvcc.msg.MvccMessage;
+import org.apache.ignite.internal.processors.metric.MetricRegistry;
 import org.apache.ignite.internal.processors.platform.message.PlatformMessageFilter;
 import org.apache.ignite.internal.processors.pool.PoolProcessor;
 import org.apache.ignite.internal.processors.security.OperationSecurityContext;
@@ -120,6 +121,7 @@ import static org.apache.ignite.internal.managers.communication.GridIoPolicy.SER
 import static org.apache.ignite.internal.managers.communication.GridIoPolicy.SYSTEM_POOL;
 import static org.apache.ignite.internal.managers.communication.GridIoPolicy.UTILITY_CACHE_POOL;
 import static org.apache.ignite.internal.managers.communication.GridIoPolicy.isReservedGridIoPolicy;
+import static org.apache.ignite.internal.processors.metric.impl.MetricUtils.metricName;
 import static org.apache.ignite.internal.util.nio.GridNioBackPressureControl.threadProcessingMessage;
 import static org.jsr166.ConcurrentLinkedHashMap.QueuePolicy.PER_SEGMENT_Q_OPTIMIZED_RMV;
 
@@ -127,6 +129,24 @@ import static org.jsr166.ConcurrentLinkedHashMap.QueuePolicy.PER_SEGMENT_Q_OPTIM
  * Grid communication manager.
  */
 public class GridIoManager extends GridManagerAdapter<CommunicationSpi<Serializable>> {
+    /** Io communication metrics registry name. */
+    public static final String COMM_METRICS = metricName("io", "communication");
+
+    /** Outbound message queue size metric name. */
+    public static final String OUTBOUND_MSG_QUEUE_CNT = "OutboundMessagesQueueSize";
+
+    /** Sent messages count metric name. */
+    public static final String SENT_MSG_CNT = "SentMessagesCount";
+
+    /** Sent bytes count metric name. */
+    public static final String SENT_BYTES_CNT = "SentBytesCount";
+
+    /** Received messages count metric name. */
+    public static final String RCVD_MSGS_CNT = "ReceivedMessagesCount";
+
+    /** Received bytes count metric name. */
+    public static final String RCVD_BYTES_CNT = "ReceivedBytesCount";
+
     /** Empty array of message factories. */
     public static final MessageFactory[] EMPTY = {};
 
@@ -227,6 +247,22 @@ public class GridIoManager extends GridManagerAdapter<CommunicationSpi<Serializa
         synchronized (sysLsnrsMux) {
             sysLsnrs = new GridMessageListener[GridTopic.values().length];
         }
+
+        MetricRegistry ioMetric = ctx.metric().registry(COMM_METRICS);
+
+        CommunicationSpi spi = ctx.config().getCommunicationSpi();
+
+        ioMetric.register(OUTBOUND_MSG_QUEUE_CNT, spi::getOutboundMessagesQueueSize,
+            "Outbound messages queue size.");
+
+        ioMetric.register(SENT_MSG_CNT, spi::getSentMessagesCount, "Sent messages count.");
+
+        ioMetric.register(SENT_BYTES_CNT, spi::getSentBytesCount, "Sent bytes count.");
+
+        ioMetric.register(RCVD_MSGS_CNT, spi::getReceivedMessagesCount,
+            "Received messages count.");
+
+        ioMetric.register(RCVD_BYTES_CNT, spi::getReceivedBytesCount, "Received bytes count.");
     }
 
     /**
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/ClusterMetricsImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/ClusterMetricsImpl.java
index 3e5e66f..fbb1a3d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/ClusterMetricsImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/ClusterMetricsImpl.java
@@ -33,6 +33,14 @@ import org.apache.ignite.spi.metric.DoubleMetric;
 import org.apache.ignite.spi.metric.IntMetric;
 import org.apache.ignite.spi.metric.LongMetric;
 
+import static org.apache.ignite.internal.managers.communication.GridIoManager.COMM_METRICS;
+import static org.apache.ignite.internal.managers.communication.GridIoManager.OUTBOUND_MSG_QUEUE_CNT;
+import static org.apache.ignite.internal.managers.communication.GridIoManager.RCVD_BYTES_CNT;
+import static org.apache.ignite.internal.managers.communication.GridIoManager.RCVD_MSGS_CNT;
+import static org.apache.ignite.internal.managers.communication.GridIoManager.SENT_BYTES_CNT;
+import static org.apache.ignite.internal.managers.communication.GridIoManager.SENT_MSG_CNT;
+import static org.apache.ignite.internal.processors.cache.CacheMetricsImpl.CACHE_METRICS;
+import static org.apache.ignite.internal.processors.cache.version.GridCacheVersionManager.LAST_DATA_VER;
 import static org.apache.ignite.internal.processors.metric.GridMetricManager.CPU_LOAD;
 import static org.apache.ignite.internal.processors.metric.GridMetricManager.PME_DURATION;
 import static org.apache.ignite.internal.processors.metric.GridMetricManager.DAEMON_THREAD_CNT;
@@ -44,9 +52,10 @@ import static org.apache.ignite.internal.processors.metric.GridMetricManager.THR
 import static org.apache.ignite.internal.processors.metric.GridMetricManager.TOTAL_STARTED_THREAD_CNT;
 import static org.apache.ignite.internal.processors.metric.GridMetricManager.UP_TIME;
 import static org.apache.ignite.internal.processors.metric.impl.MetricUtils.metricName;
+import static org.apache.ignite.internal.processors.task.GridTaskProcessor.TOTAL_EXEC_TASKS;
 
 /**
- * Cluster metrics proxy
+ * Cluster metrics proxy.
  */
 public class ClusterMetricsImpl implements ClusterMetrics {
     /** */
@@ -67,6 +76,9 @@ public class ClusterMetricsImpl implements ClusterMetrics {
     /** Node start time. */
     private final long nodeStartTime;
 
+    /** Total executed tasks metric. */
+    private final LongMetric execTasks;
+
     /** GC CPU load. */
     private final DoubleMetric gcCpuLoad;
 
@@ -142,6 +154,24 @@ public class ClusterMetricsImpl implements ClusterMetrics {
      */
     private final IntMetric threadCnt;
 
+    /** Last data version metric. */
+    private final LongMetric lastDataVer;
+
+    /** Sent messages count metric. */
+    private final IntMetric sentMsgsCnt;
+
+    /** Sent bytes count metric. */
+    private final LongMetric sentBytesCnt;
+
+    /** Received messages count metric. */
+    private final IntMetric rcvdMsgsCnt;
+
+    /** Received bytes count metric. */
+    private final LongMetric rcvdBytesCnt;
+
+    /** Outbound message queue size metric. */
+    private final IntMetric outboundMsgCnt;
+
     /**
      * Metric reflecting {@link ThreadMXBean#getPeakThreadCount()}.
      *
@@ -184,6 +214,7 @@ public class ClusterMetricsImpl implements ClusterMetrics {
         peakThreadCnt = mreg.findMetric(PEAK_THREAD_CNT);
         totalStartedThreadCnt = mreg.findMetric(TOTAL_STARTED_THREAD_CNT);
         daemonThreadCnt = mreg.findMetric(DAEMON_THREAD_CNT);
+        execTasks = mreg.findMetric(TOTAL_EXEC_TASKS);
 
         availableProcessors = ManagementFactory.getOperatingSystemMXBean().getAvailableProcessors();
 
@@ -200,6 +231,16 @@ public class ClusterMetricsImpl implements ClusterMetrics {
         MetricRegistry pmeReg = ctx.metric().registry(PME_METRICS);
 
         pmeDuration = pmeReg.findMetric(PME_DURATION);
+
+        lastDataVer = ctx.metric().registry(CACHE_METRICS).findMetric(LAST_DATA_VER);
+
+        MetricRegistry ioReg = ctx.metric().registry(COMM_METRICS);
+
+        sentMsgsCnt = ioReg.findMetric(SENT_MSG_CNT);
+        sentBytesCnt = ioReg.findMetric(SENT_BYTES_CNT);
+        rcvdMsgsCnt = ioReg.findMetric(RCVD_MSGS_CNT);
+        rcvdBytesCnt = ioReg.findMetric(RCVD_BYTES_CNT);
+        outboundMsgCnt = ioReg.findMetric(OUTBOUND_MSG_QUEUE_CNT);
     }
 
     /** {@inheritDoc} */
@@ -319,7 +360,7 @@ public class ClusterMetricsImpl implements ClusterMetrics {
 
     /** {@inheritDoc} */
     @Override public int getTotalExecutedTasks() {
-        return ctx.task().getTotalExecutedTasks();
+        return (int)execTasks.value();
     }
 
     /** {@inheritDoc} */
@@ -463,32 +504,32 @@ public class ClusterMetricsImpl implements ClusterMetrics {
 
     /** {@inheritDoc} */
     @Override public long getLastDataVersion() {
-        return ctx.cache().lastDataVersion();
+        return lastDataVer.value();
     }
 
     /** {@inheritDoc} */
     @Override public int getSentMessagesCount() {
-        return ctx.io().getSentMessagesCount();
+        return sentMsgsCnt.value();
     }
 
     /** {@inheritDoc} */
     @Override public long getSentBytesCount() {
-        return ctx.io().getSentBytesCount();
+        return sentBytesCnt.value();
     }
 
     /** {@inheritDoc} */
     @Override public int getReceivedMessagesCount() {
-        return ctx.io().getReceivedMessagesCount();
+        return rcvdMsgsCnt.value();
     }
 
     /** {@inheritDoc} */
     @Override public long getReceivedBytesCount() {
-        return ctx.io().getReceivedBytesCount();
+        return rcvdBytesCnt.value();
     }
 
     /** {@inheritDoc} */
     @Override public int getOutboundMessagesQueueSize() {
-        return ctx.io().getOutboundMessagesQueueSize();
+        return outboundMsgCnt.value();
     }
 
     /** {@inheritDoc} */
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
index daa2992..7ba8ae3 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
@@ -4961,29 +4961,6 @@ public class GridCacheProcessor extends GridProcessorAdapter {
     }
 
     /**
-     * @return Last data version.
-     */
-    public long lastDataVersion() {
-        long max = 0;
-
-        for (GridCacheAdapter<?, ?> cache : caches.values()) {
-            GridCacheContext<?, ?> ctx = cache.context();
-
-            if (ctx.versions().last().order() > max)
-                max = ctx.versions().last().order();
-
-            if (ctx.isNear()) {
-                ctx = ctx.near().dht().context();
-
-                if (ctx.versions().last().order() > max)
-                    max = ctx.versions().last().order();
-            }
-        }
-
-        return max;
-    }
-
-    /**
      * @return Keep static cache configuration flag. If {@code true}, static cache configuration will override
      * configuration persisted on disk.
      */
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/reader/StandaloneGridKernalContext.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/reader/StandaloneGridKernalContext.java
index 468d603..9826227 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/reader/StandaloneGridKernalContext.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/reader/StandaloneGridKernalContext.java
@@ -156,6 +156,7 @@ public class StandaloneGridKernalContext implements GridKernalContext {
 
         this.marshallerCtx = new MarshallerContextImpl(null, null);
         this.cfg = prepareIgniteConfiguration();
+        this.metricMgr = new GridMetricManager(this);
 
         // Fake folder provided to perform processor startup on empty folder.
         if (binaryMetadataFileStoreDir == null)
@@ -167,8 +168,6 @@ public class StandaloneGridKernalContext implements GridKernalContext {
             marshallerCtx.setMarshallerMappingFileStoreDir(marshallerMappingFileStoreDir);
             marshallerCtx.onMarshallerProcessorStarted(this, null);
         }
-
-        metricMgr = new GridMetricManager(this);
     }
 
     /**
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/version/GridCacheVersionManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/version/GridCacheVersionManager.java
index 82faefe..b41dc63 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/version/GridCacheVersionManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/version/GridCacheVersionManager.java
@@ -26,9 +26,12 @@ import org.apache.ignite.events.Event;
 import org.apache.ignite.internal.managers.eventstorage.GridLocalEventListener;
 import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import org.apache.ignite.internal.processors.cache.GridCacheSharedManagerAdapter;
+import org.apache.ignite.internal.processors.metric.MetricRegistry;
+import org.apache.ignite.internal.processors.metric.impl.AtomicLongMetric;
 import org.apache.ignite.internal.util.typedef.internal.U;
 
 import static org.apache.ignite.events.EventType.EVT_NODE_METRICS_UPDATED;
+import static org.apache.ignite.internal.processors.cache.CacheMetricsImpl.CACHE_METRICS;
 
 /**
  * Makes sure that cache lock order values come in proper sequence.
@@ -44,6 +47,12 @@ public class GridCacheVersionManager extends GridCacheSharedManagerAdapter {
     /** Timestamp used as base time for cache topology version (January 1, 2014). */
     public static final long TOP_VER_BASE_TIME = 1388520000000L;
 
+    /** Last data version metric name. */
+    public static final String LAST_DATA_VER = "LastDataVersion";
+
+    /** Last version metric. */
+    protected AtomicLongMetric lastDataVer;
+
     /**
      * Current order. Initialize to current time to make sure that
      * local version increments even after restarts.
@@ -84,8 +93,14 @@ public class GridCacheVersionManager extends GridCacheSharedManagerAdapter {
 
     /** {@inheritDoc} */
     @Override public void start0() throws IgniteCheckedException {
+        MetricRegistry sysreg = cctx.kernalContext().metric().registry(CACHE_METRICS);
+
+        lastDataVer = sysreg.longMetric(LAST_DATA_VER, "The latest data version on the node.");
+
         last = new GridCacheVersion(0, order.get(), 0, dataCenterId);
 
+        lastDataVer.value(last.order());
+
         startVer = new GridCacheVersion(0, 0, 0, dataCenterId);
 
         cctx.gridEvents().addLocalEventListener(discoLsnr, EVT_NODE_METRICS_UPDATED);
@@ -106,6 +121,8 @@ public class GridCacheVersionManager extends GridCacheSharedManagerAdapter {
 
         last = new GridCacheVersion(0, order.get(), 0, dataCenterId);
 
+        lastDataVer.value(last.order());
+
         startVer = new GridCacheVersion(0, 0, 0, dataCenterId);
     }
 
@@ -293,6 +310,8 @@ public class GridCacheVersionManager extends GridCacheSharedManagerAdapter {
 
         last = next;
 
+        lastDataVer.value(last.order());
+
         return next;
     }
 
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/task/GridTaskProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/task/GridTaskProcessor.java
index 665caa8..b5b45c8 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/task/GridTaskProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/task/GridTaskProcessor.java
@@ -29,7 +29,6 @@ import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.RejectedExecutionException;
 import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.LongAdder;
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.IgniteException;
 import org.apache.ignite.cluster.ClusterNode;
@@ -65,6 +64,8 @@ import org.apache.ignite.internal.managers.eventstorage.GridLocalEventListener;
 import org.apache.ignite.internal.processors.GridProcessorAdapter;
 import org.apache.ignite.internal.processors.cache.IgniteInternalCache;
 import org.apache.ignite.internal.processors.cluster.IgniteChangeGlobalStateSupport;
+import org.apache.ignite.internal.processors.metric.MetricRegistry;
+import org.apache.ignite.internal.processors.metric.impl.LongAdderMetric;
 import org.apache.ignite.internal.util.GridConcurrentFactory;
 import org.apache.ignite.internal.util.GridSpinReadWriteLock;
 import org.apache.ignite.internal.util.lang.GridPeerDeployAware;
@@ -89,6 +90,7 @@ import static org.apache.ignite.internal.GridTopic.TOPIC_JOB_SIBLINGS;
 import static org.apache.ignite.internal.GridTopic.TOPIC_TASK;
 import static org.apache.ignite.internal.GridTopic.TOPIC_TASK_CANCEL;
 import static org.apache.ignite.internal.managers.communication.GridIoPolicy.SYSTEM_POOL;
+import static org.apache.ignite.internal.processors.metric.GridMetricManager.SYS_METRICS;
 import static org.apache.ignite.internal.processors.task.GridTaskThreadContextKey.TC_SKIP_AUTH;
 import static org.apache.ignite.internal.processors.task.GridTaskThreadContextKey.TC_SUBGRID;
 import static org.apache.ignite.internal.processors.task.GridTaskThreadContextKey.TC_SUBGRID_PREDICATE;
@@ -100,6 +102,9 @@ import static org.apache.ignite.internal.processors.task.GridTaskThreadContextKe
  * This class defines task processor.
  */
 public class GridTaskProcessor extends GridProcessorAdapter implements IgniteChangeGlobalStateSupport {
+    /** Total executed tasks metric name. */
+    public static final String TOTAL_EXEC_TASKS = "TotalExecutedTasks";
+
     /** Wait for 5 seconds to allow discovery to take effect (best effort). */
     private static final long DISCO_TIMEOUT = 5000;
 
@@ -122,8 +127,8 @@ public class GridTaskProcessor extends GridProcessorAdapter implements IgniteCha
     /** */
     private final GridLocalEventListener discoLsnr;
 
-    /** Total executed tasks. */
-    private final LongAdder execTasks = new LongAdder();
+    /** Total executed tasks metric. */
+    private final LongAdderMetric execTasks;
 
     /** */
     private final ThreadLocal<Map<GridTaskThreadContextKey, Object>> thCtx = new ThreadLocal<>();
@@ -146,6 +151,10 @@ public class GridTaskProcessor extends GridProcessorAdapter implements IgniteCha
         marsh = ctx.config().getMarshaller();
 
         discoLsnr = new TaskDiscoveryListener();
+
+        MetricRegistry sysreg = ctx.metric().registry(SYS_METRICS);
+
+        execTasks = sysreg.longAdderMetric(TOTAL_EXEC_TASKS, "Total executed tasks.");
     }
 
     /** {@inheritDoc} */
@@ -1217,19 +1226,10 @@ public class GridTaskProcessor extends GridProcessorAdapter implements IgniteCha
     }
 
     /**
-     * @return Number of executed tasks.
-     */
-    public int getTotalExecutedTasks() {
-        return execTasks.intValue();
-    }
-
-    /**
      * Resets processor metrics.
      */
     public void resetMetrics() {
-        // Can't use 'reset' method because it is not thread-safe
-        // according to javadoc.
-        execTasks.add(-execTasks.sum());
+        execTasks.reset();
     }
 
     /** {@inheritDoc} */
diff --git a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationMetricsListener.java b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationMetricsListener.java
index 838ee00..1ca5451 100644
--- a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationMetricsListener.java
+++ b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationMetricsListener.java
@@ -261,6 +261,9 @@ public class TcpCommunicationMetricsListener implements GridNioMetricsListener{
     public void resetMetrics() {
         for (ThreadMetrics metrics : allMetrics)
             metrics.reset();
+
+        sentBytesCnt.reset();
+        rcvdBytesCnt.reset();
     }
 
     /**
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/managers/GridManagerStopSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/managers/GridManagerStopSelfTest.java
index b1b94e1..532aba0 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/managers/GridManagerStopSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/managers/GridManagerStopSelfTest.java
@@ -27,6 +27,7 @@ import org.apache.ignite.internal.managers.discovery.GridDiscoveryManager;
 import org.apache.ignite.internal.managers.eventstorage.GridEventStorageManager;
 import org.apache.ignite.internal.managers.failover.GridFailoverManager;
 import org.apache.ignite.internal.managers.loadbalancer.GridLoadBalancerManager;
+import org.apache.ignite.internal.processors.metric.GridMetricManager;
 import org.apache.ignite.internal.processors.pool.PoolProcessor;
 import org.apache.ignite.internal.processors.resource.GridResourceProcessor;
 import org.apache.ignite.resources.LoggerResource;
@@ -44,6 +45,7 @@ import org.apache.ignite.spi.eventstorage.EventStorageSpi;
 import org.apache.ignite.spi.eventstorage.memory.MemoryEventStorageSpi;
 import org.apache.ignite.spi.failover.always.AlwaysFailoverSpi;
 import org.apache.ignite.spi.loadbalancing.roundrobin.RoundRobinLoadBalancingSpi;
+import org.apache.ignite.spi.metric.noop.NoopMetricExporterSpi;
 import org.apache.ignite.testframework.junits.GridTestKernalContext;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.junit.Test;
@@ -128,6 +130,8 @@ public class GridManagerStopSelfTest extends GridCommonAbstractTest {
 
         ctx.config().setCommunicationSpi(spi);
         ctx.config().setMarshaller(new BinaryMarshaller());
+        ctx.config().setMetricExporterSpi(new NoopMetricExporterSpi());
+        ctx.add(new GridMetricManager(ctx));
 
         GridIoManager mgr = new GridIoManager(ctx);