IGNITE-12552: Move ReadOnlyMetricRegistry to public API. (#7269)

diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheMetricsImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheMetricsImpl.java
index cfc72b4..1865512 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheMetricsImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheMetricsImpl.java
@@ -29,7 +29,7 @@
 import org.apache.ignite.internal.processors.cache.store.GridCacheWriteBehindStore;
 import org.apache.ignite.internal.processors.metric.MetricRegistry;
 import org.apache.ignite.internal.processors.metric.impl.AtomicLongMetric;
-import org.apache.ignite.internal.processors.metric.impl.HistogramMetric;
+import org.apache.ignite.internal.processors.metric.impl.HistogramMetricImpl;
 import org.apache.ignite.internal.processors.metric.impl.HitRateMetric;
 import org.apache.ignite.internal.processors.metric.impl.MetricUtils;
 import org.apache.ignite.internal.util.collection.ImmutableIntSet;
@@ -176,19 +176,19 @@
     private final AtomicLongMetric rebalanceClearingPartitions;
 
     /** Get time. */
-    private final HistogramMetric getTime;
+    private final HistogramMetricImpl getTime;
 
     /** Put time. */
-    private final HistogramMetric putTime;
+    private final HistogramMetricImpl putTime;
 
     /** Remove time. */
-    private final HistogramMetric rmvTime;
+    private final HistogramMetricImpl rmvTime;
 
     /** Commit time. */
-    private final HistogramMetric commitTime;
+    private final HistogramMetricImpl commitTime;
 
     /** Rollback time. */
-    private final HistogramMetric rollbackTime;
+    private final HistogramMetricImpl rollbackTime;
 
     /** Cache metrics. */
     @GridToStringExclude
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java
index 0e4a5ff..9d9917a 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java
@@ -111,7 +111,7 @@
 import org.apache.ignite.internal.processors.cluster.ChangeGlobalStateFinishMessage;
 import org.apache.ignite.internal.processors.cluster.ChangeGlobalStateMessage;
 import org.apache.ignite.internal.processors.metric.MetricRegistry;
-import org.apache.ignite.internal.processors.metric.impl.HistogramMetric;
+import org.apache.ignite.internal.processors.metric.impl.HistogramMetricImpl;
 import org.apache.ignite.internal.processors.query.schema.SchemaNodeLeaveExchangeWorkerTask;
 import org.apache.ignite.internal.processors.timeout.GridTimeoutObject;
 import org.apache.ignite.internal.util.GridListSet;
@@ -278,10 +278,10 @@
     private final List<PartitionsExchangeAware> exchangeAwareComps = new ArrayList<>();
 
     /** Histogram of PME durations. */
-    private volatile HistogramMetric durationHistogram;
+    private volatile HistogramMetricImpl durationHistogram;
 
     /** Histogram of blocking PME durations. */
-    private volatile HistogramMetric blockingDurationHistogram;
+    private volatile HistogramMetricImpl blockingDurationHistogram;
 
     /** Delay before rebalancing code is start executing after exchange completion. For tests only. */
     private volatile long rebalanceDelay;
@@ -2853,12 +2853,12 @@
     }
 
     /** @return Histogram of PME durations metric. */
-    public HistogramMetric durationHistogram() {
+    public HistogramMetricImpl durationHistogram() {
         return durationHistogram;
     }
 
     /** @return Histogram of blocking PME durations metric. */
-    public HistogramMetric blockingDurationHistogram() {
+    public HistogramMetricImpl blockingDurationHistogram() {
         return blockingDurationHistogram;
     }
 
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/TransactionMetricsAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/TransactionMetricsAdapter.java
index 28a8882..e28c48e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/TransactionMetricsAdapter.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/TransactionMetricsAdapter.java
@@ -32,7 +32,7 @@
 import org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal;
 import org.apache.ignite.internal.processors.metric.MetricRegistry;
 import org.apache.ignite.internal.processors.metric.impl.AtomicLongMetric;
-import org.apache.ignite.internal.processors.metric.impl.HistogramMetric;
+import org.apache.ignite.internal.processors.metric.impl.HistogramMetricImpl;
 import org.apache.ignite.internal.processors.metric.impl.IntMetricImpl;
 import org.apache.ignite.internal.processors.metric.impl.LongAdderMetric;
 import org.apache.ignite.internal.util.GridStringBuilder;
@@ -88,10 +88,10 @@
     private LongAdderMetric totalTxUserTime;
 
     /** Holds the reference to metric for system time histogram on node. */
-    private HistogramMetric txSystemTimeHistogram;
+    private HistogramMetricImpl txSystemTimeHistogram;
 
     /** Holds the reference to metric for user time histogram on node. */
-    private HistogramMetric txUserTimeHistogram;
+    private HistogramMetricImpl txUserTimeHistogram;
 
     /**
      * @param ctx Kernal context.
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/metric/GridMetricManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/metric/GridMetricManager.java
index 339d0f8..8ad0a5e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/metric/GridMetricManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/metric/GridMetricManager.java
@@ -46,7 +46,7 @@
 import org.apache.ignite.internal.processors.metastorage.ReadableDistributedMetaStorage;
 import org.apache.ignite.internal.processors.metric.impl.AtomicLongMetric;
 import org.apache.ignite.internal.processors.metric.impl.DoubleMetricImpl;
-import org.apache.ignite.internal.processors.metric.impl.HistogramMetric;
+import org.apache.ignite.internal.processors.metric.impl.HistogramMetricImpl;
 import org.apache.ignite.internal.processors.metric.impl.HitRateMetric;
 import org.apache.ignite.internal.processors.timeout.GridTimeoutProcessor;
 import org.apache.ignite.internal.util.StripedExecutor;
@@ -55,9 +55,11 @@
 import org.apache.ignite.internal.util.typedef.internal.A;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.spi.metric.HistogramMetric;
 import org.apache.ignite.spi.metric.Metric;
 import org.apache.ignite.spi.metric.MetricExporterSpi;
 import org.apache.ignite.spi.metric.ReadOnlyMetricRegistry;
+import org.apache.ignite.spi.metric.ReadOnlyMetricManager;
 import org.apache.ignite.thread.IgniteStripedThreadPoolExecutor;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
@@ -69,12 +71,12 @@
 import static org.apache.ignite.internal.util.IgniteUtils.notifyListeners;
 
 /**
- * This manager should provide {@link ReadOnlyMetricRegistry} for each configured {@link MetricExporterSpi}.
+ * This manager should provide {@link ReadOnlyMetricManager} for each configured {@link MetricExporterSpi}.
  *
  * @see MetricExporterSpi
  * @see MetricRegistry
  */
-public class GridMetricManager extends GridManagerAdapter<MetricExporterSpi> implements ReadOnlyMetricRegistry {
+public class GridMetricManager extends GridManagerAdapter<MetricExporterSpi> implements ReadOnlyMetricManager {
     /** */
     public static final String ACTIVE_COUNT_DESC = "Approximate number of threads that are actively executing tasks.";
 
@@ -197,13 +199,13 @@
     public static final String HISTOGRAM_CFG_PREFIX = metricName("metrics", "histogram");
 
     /** Registered metrics registries. */
-    private final ConcurrentHashMap<String, MetricRegistry> registries = new ConcurrentHashMap<>();
+    private final ConcurrentHashMap<String, ReadOnlyMetricRegistry> registries = new ConcurrentHashMap<>();
 
     /** Metric registry creation listeners. */
-    private final List<Consumer<MetricRegistry>> metricRegCreationLsnrs = new CopyOnWriteArrayList<>();
+    private final List<Consumer<ReadOnlyMetricRegistry>> metricRegCreationLsnrs = new CopyOnWriteArrayList<>();
 
     /** Metric registry remove listeners. */
-    private final List<Consumer<MetricRegistry>> metricRegRemoveLsnrs = new CopyOnWriteArrayList<>();
+    private final List<Consumer<ReadOnlyMetricRegistry>> metricRegRemoveLsnrs = new CopyOnWriteArrayList<>();
 
     /** Read-only metastorage. */
     private volatile ReadableDistributedMetaStorage roMetastorage;
@@ -325,7 +327,7 @@
      * @return Group of metrics.
      */
     public MetricRegistry registry(String name) {
-        return registries.computeIfAbsent(name, n -> {
+        return (MetricRegistry)registries.computeIfAbsent(name, n -> {
             MetricRegistry mreg = new MetricRegistry(name,
                 mname -> readFromMetastorage(metricName(HITRATE_CFG_PREFIX, mname)),
                 mname -> readFromMetastorage(metricName(HISTOGRAM_CFG_PREFIX, mname)),
@@ -357,17 +359,17 @@
     }
 
     /** {@inheritDoc} */
-    @NotNull @Override public Iterator<MetricRegistry> iterator() {
+    @NotNull @Override public Iterator<ReadOnlyMetricRegistry> iterator() {
         return registries.values().iterator();
     }
 
     /** {@inheritDoc} */
-    @Override public void addMetricRegistryCreationListener(Consumer<MetricRegistry> lsnr) {
+    @Override public void addMetricRegistryCreationListener(Consumer<ReadOnlyMetricRegistry> lsnr) {
         metricRegCreationLsnrs.add(lsnr);
     }
 
     /** {@inheritDoc} */
-    @Override public void addMetricRegistryRemoveListener(Consumer<MetricRegistry> lsnr) {
+    @Override public void addMetricRegistryRemoveListener(Consumer<ReadOnlyMetricRegistry> lsnr) {
         metricRegRemoveLsnrs.add(lsnr);
     }
 
@@ -377,7 +379,7 @@
      * @param regName Metric registry name.
      */
     public void remove(String regName) {
-        MetricRegistry mreg = registries.remove(regName);
+        ReadOnlyMetricRegistry mreg = registries.remove(regName);
 
         if (mreg == null)
             return;
@@ -444,7 +446,7 @@
      *
      * @param name Metric name.
      * @param rateTimeInterval New rateTimeInterval.
-     * @see HistogramMetric#reset(long[])
+     * @see HistogramMetricImpl#reset(long[])
      */
     private void onHitRateConfigChanged(String name, @Nullable Long rateTimeInterval) {
         if (rateTimeInterval == null)
@@ -470,7 +472,7 @@
         if (bounds == null)
             return;
 
-        HistogramMetric m = find(name, HistogramMetric.class);
+        HistogramMetricImpl m = find(name, HistogramMetricImpl.class);
 
         if (m == null)
             return;
@@ -488,7 +490,7 @@
 
         T2<String, String> splitted = fromFullName(name);
 
-        MetricRegistry mreg = registries.get(splitted.get1());
+        MetricRegistry mreg = (MetricRegistry)registries.get(splitted.get1());
 
         if (mreg == null) {
             if (log.isInfoEnabled())
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/metric/MetricRegistry.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/metric/MetricRegistry.java
index 5be8a9e..e4223c2 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/metric/MetricRegistry.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/metric/MetricRegistry.java
@@ -32,7 +32,7 @@
 import org.apache.ignite.internal.processors.metric.impl.BooleanMetricImpl;
 import org.apache.ignite.internal.processors.metric.impl.DoubleGauge;
 import org.apache.ignite.internal.processors.metric.impl.DoubleMetricImpl;
-import org.apache.ignite.internal.processors.metric.impl.HistogramMetric;
+import org.apache.ignite.internal.processors.metric.impl.HistogramMetricImpl;
 import org.apache.ignite.internal.processors.metric.impl.HitRateMetric;
 import org.apache.ignite.internal.processors.metric.impl.IntGauge;
 import org.apache.ignite.internal.processors.metric.impl.IntMetricImpl;
@@ -44,6 +44,7 @@
 import org.apache.ignite.spi.metric.BooleanMetric;
 import org.apache.ignite.spi.metric.IntMetric;
 import org.apache.ignite.spi.metric.Metric;
+import org.apache.ignite.spi.metric.ReadOnlyMetricRegistry;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
@@ -54,9 +55,9 @@
 /**
  * Metric registry.
  */
-public class MetricRegistry implements Iterable<Metric> {
+public class MetricRegistry implements ReadOnlyMetricRegistry {
     /** Registry name. */
-    private String grpName;
+    private String regName;
 
     /** Logger. */
     private IgniteLogger log;
@@ -71,28 +72,25 @@
     private final Function<String, long[]> histogramCfgProvider;
 
     /**
-     * @param grpName Group name.
+     * @param regName Registry name.
      * @param hitRateCfgProvider HitRate config provider.
      * @param histogramCfgProvider Histogram config provider.
      * @param log Logger.
      */
-    public MetricRegistry(String grpName, Function<String, Long> hitRateCfgProvider,
+    public MetricRegistry(String regName, Function<String, Long> hitRateCfgProvider,
         Function<String, long[]> histogramCfgProvider, IgniteLogger log) {
-        this.grpName = grpName;
+        this.regName = regName;
         this.log = log;
         this.hitRateCfgProvider = hitRateCfgProvider;
         this.histogramCfgProvider = histogramCfgProvider;
     }
 
-    /**
-     * @param name Name of the metric.
-     * @return Metric with specified name if exists. Null otherwise.
-     */
-    @Nullable public <M extends Metric> M findMetric(String name) {
+    /** {@inheritDoc} */
+    @Nullable @Override public <M extends Metric> M findMetric(String name) {
         return (M)metrics.get(name);
     }
 
-    /** Resets state of this metric set. */
+    /** Resets state of this metric registry. */
     public void reset() {
         for (Metric m : metrics.values())
             m.reset();
@@ -108,7 +106,7 @@
      * @return {@link ObjectMetricImpl}
      */
     public <T> ObjectMetricImpl<T> objectMetric(String name, Class<T> type, @Nullable String desc) {
-        return addMetric(name, new ObjectMetricImpl<>(metricName(grpName, name), desc, type));
+        return addMetric(name, new ObjectMetricImpl<>(metricName(regName, name), desc, type));
     }
 
     /** {@inheritDoc} */
@@ -142,7 +140,7 @@
      * @param desc Description.
      */
     public void register(String name, BooleanSupplier supplier, @Nullable String desc) {
-        addMetric(name, new BooleanGauge(metricName(grpName, name), desc, nonThrowableSupplier(supplier, log)));
+        addMetric(name, new BooleanGauge(metricName(regName, name), desc, nonThrowableSupplier(supplier, log)));
     }
 
     /**
@@ -153,7 +151,7 @@
      * @param desc Description.
      */
     public void register(String name, DoubleSupplier supplier, @Nullable String desc) {
-        addMetric(name, new DoubleGauge(metricName(grpName, name), desc, nonThrowableSupplier(supplier, log)));
+        addMetric(name, new DoubleGauge(metricName(regName, name), desc, nonThrowableSupplier(supplier, log)));
     }
 
     /**
@@ -164,7 +162,7 @@
      * @param desc Description.
      */
     public void register(String name, IntSupplier supplier, @Nullable String desc) {
-        addMetric(name, new IntGauge(metricName(grpName, name), desc, nonThrowableSupplier(supplier, log)));
+        addMetric(name, new IntGauge(metricName(regName, name), desc, nonThrowableSupplier(supplier, log)));
     }
 
     /**
@@ -176,7 +174,7 @@
      * @return Metric of type {@link LongGauge}.
      */
     public LongGauge register(String name, LongSupplier supplier, @Nullable String desc) {
-        return addMetric(name, new LongGauge(metricName(grpName, name), desc, nonThrowableSupplier(supplier, log)));
+        return addMetric(name, new LongGauge(metricName(regName, name), desc, nonThrowableSupplier(supplier, log)));
     }
 
     /**
@@ -188,7 +186,7 @@
      * @param desc Description.
      */
     public <T> void register(String name, Supplier<T> supplier, Class<T> type, @Nullable String desc) {
-        addMetric(name, new ObjectGauge<>(metricName(grpName, name), desc,
+        addMetric(name, new ObjectGauge<>(metricName(regName, name), desc,
             nonThrowableSupplier(supplier, log), type));
     }
 
@@ -201,7 +199,7 @@
      * @return {@link DoubleMetricImpl}.
      */
     public DoubleMetricImpl doubleMetric(String name, @Nullable String desc) {
-        return addMetric(name, new DoubleMetricImpl(metricName(grpName, name), desc));
+        return addMetric(name, new DoubleMetricImpl(metricName(regName, name), desc));
     }
 
     /**
@@ -213,7 +211,7 @@
      * @return {@link IntMetricImpl}.
      */
     public IntMetricImpl intMetric(String name, @Nullable String desc) {
-        return addMetric(name, new IntMetricImpl(metricName(grpName, name), desc));
+        return addMetric(name, new IntMetricImpl(metricName(regName, name), desc));
     }
 
     /**
@@ -225,7 +223,7 @@
      * @return {@link AtomicLongMetric}.
      */
     public AtomicLongMetric longMetric(String name, @Nullable String desc) {
-        return addMetric(name, new AtomicLongMetric(metricName(grpName, name), desc));
+        return addMetric(name, new AtomicLongMetric(metricName(regName, name), desc));
     }
 
     /**
@@ -237,7 +235,7 @@
      * @return {@link LongAdderMetric}.
      */
     public LongAdderMetric longAdderMetric(String name, @Nullable String desc) {
-        return addMetric(name, new LongAdderMetric(metricName(grpName, name), desc));
+        return addMetric(name, new LongAdderMetric(metricName(regName, name), desc));
     }
 
     /**
@@ -250,7 +248,7 @@
      * @return {@link LongAdderWithDelegateMetric}.
      */
     public LongAdderMetric longAdderMetric(String name, LongConsumer delegate, @Nullable String desc) {
-        return addMetric(name, new LongAdderWithDelegateMetric(metricName(grpName, name), delegate, desc));
+        return addMetric(name, new LongAdderWithDelegateMetric(metricName(regName, name), delegate, desc));
     }
 
     /**
@@ -265,7 +263,7 @@
      * @see HitRateMetric
      */
     public HitRateMetric hitRateMetric(String name, @Nullable String desc, long rateTimeInterval, int size) {
-        String fullName = metricName(grpName, name);
+        String fullName = metricName(regName, name);
 
         HitRateMetric metric = addMetric(name, new HitRateMetric(fullName, desc, rateTimeInterval, size));
 
@@ -286,7 +284,7 @@
      * @return {@link BooleanMetricImpl}
      */
     public BooleanMetricImpl booleanMetric(String name, @Nullable String desc) {
-        return addMetric(name, new BooleanMetricImpl(metricName(grpName, name), desc));
+        return addMetric(name, new BooleanMetricImpl(metricName(regName, name), desc));
     }
 
     /**
@@ -295,12 +293,12 @@
      * @param name Name
      * @param bounds Bounds of measurements.
      * @param desc Description.
-     * @return {@link HistogramMetric}
+     * @return {@link HistogramMetricImpl}
      */
-    public HistogramMetric histogram(String name, long[] bounds, @Nullable String desc) {
-        String fullName = metricName(grpName, name);
+    public HistogramMetricImpl histogram(String name, long[] bounds, @Nullable String desc) {
+        String fullName = metricName(regName, name);
 
-        HistogramMetric metric = addMetric(name, new HistogramMetric(fullName, desc, bounds));
+        HistogramMetricImpl metric = addMetric(name, new HistogramMetricImpl(fullName, desc, bounds));
 
         long[] cfgBounds = histogramCfgProvider.apply(fullName);
 
@@ -327,8 +325,8 @@
         return metric;
     }
 
-    /** @return Group name. */
-    public String name() {
-        return grpName;
+    /** {@inheritDoc} */
+    @Override public String name() {
+        return regName;
     }
 }
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/metric/PushMetricsExporterAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/metric/PushMetricsExporterAdapter.java
index d850bf8..411b405 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/metric/PushMetricsExporterAdapter.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/metric/PushMetricsExporterAdapter.java
@@ -25,6 +25,7 @@
 import org.apache.ignite.spi.IgniteSpiException;
 import org.apache.ignite.spi.metric.MetricExporterSpi;
 import org.apache.ignite.spi.metric.ReadOnlyMetricRegistry;
+import org.apache.ignite.spi.metric.ReadOnlyMetricManager;
 import org.jetbrains.annotations.Nullable;
 
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
@@ -34,10 +35,10 @@
  */
 public abstract class PushMetricsExporterAdapter extends IgniteSpiAdapter implements MetricExporterSpi {
     /** Metric registry. */
-    protected ReadOnlyMetricRegistry mreg;
+    protected ReadOnlyMetricManager mreg;
 
     /** Metric filter. */
-    protected  @Nullable Predicate<MetricRegistry> filter;
+    protected  @Nullable Predicate<ReadOnlyMetricRegistry> filter;
 
     /** Export period. */
     private long period;
@@ -93,12 +94,12 @@
     }
 
     /** {@inheritDoc} */
-    @Override public void setMetricRegistry(ReadOnlyMetricRegistry mreg) {
+    @Override public void setMetricRegistry(ReadOnlyMetricManager mreg) {
         this.mreg = mreg;
     }
 
     /** {@inheritDoc} */
-    @Override public void setExportFilter(Predicate<MetricRegistry> filter) {
+    @Override public void setExportFilter(Predicate<ReadOnlyMetricRegistry> filter) {
         this.filter = filter;
     }
 }
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/metric/impl/HistogramMetric.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/metric/impl/HistogramMetricImpl.java
similarity index 84%
rename from modules/core/src/main/java/org/apache/ignite/internal/processors/metric/impl/HistogramMetric.java
rename to modules/core/src/main/java/org/apache/ignite/internal/processors/metric/impl/HistogramMetricImpl.java
index da9cae1..b0de0c5 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/metric/impl/HistogramMetric.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/metric/impl/HistogramMetricImpl.java
@@ -20,15 +20,13 @@
 import java.util.concurrent.atomic.AtomicLongArray;
 import org.apache.ignite.internal.processors.metric.AbstractMetric;
 import org.apache.ignite.internal.util.typedef.F;
-import org.apache.ignite.spi.metric.ObjectMetric;
+import org.apache.ignite.spi.metric.HistogramMetric;
 import org.jetbrains.annotations.Nullable;
 
 /**
- * Histogram metric that will calculate counts of measurements that gets into each bounds interval.
- * Note, that {@link #value()} will return array length of {@code bounds.length + 1}.
- * Last element will contains count of measurements bigger then most right value of bounds.
+ * Histogram metric implementation.
  */
-public class HistogramMetric extends AbstractMetric implements ObjectMetric<long[]> {
+public class HistogramMetricImpl extends AbstractMetric implements HistogramMetric {
     /** Holder of measurements. */
     private volatile HistogramHolder holder;
 
@@ -37,7 +35,7 @@
      * @param desc Description.
      * @param bounds Bounds.
      */
-    public HistogramMetric(String name, @Nullable String desc, long[] bounds) {
+    public HistogramMetricImpl(String name, @Nullable String desc, long[] bounds) {
         super(name, desc);
 
         holder = new HistogramHolder(bounds);
@@ -91,8 +89,8 @@
         return res;
     }
 
-    /** @return Bounds of this histogram. */
-    public long[] bounds() {
+    /** {@inheritDoc} */
+    @Override public long[] bounds() {
         return holder.bounds;
     }
 
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/metric/impl/MetricUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/metric/impl/MetricUtils.java
index 6be260e..9a4c0db 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/metric/impl/MetricUtils.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/metric/impl/MetricUtils.java
@@ -21,6 +21,7 @@
 import org.apache.ignite.internal.processors.metric.GridMetricManager;
 import org.apache.ignite.internal.processors.metric.MetricRegistry;
 import org.apache.ignite.internal.util.typedef.T2;
+import org.apache.ignite.spi.metric.HistogramMetric;
 
 import static org.apache.ignite.internal.processors.cache.CacheMetricsImpl.CACHE_METRICS;
 
@@ -38,26 +39,6 @@
     public static final String INF = "inf";
 
     /**
-     * Example - metric registry name - "io.statistics.PRIMARY_KEY_IDX".
-     * root = io - JMX tree root.
-     * subName = statistics.PRIMARY_KEY_IDX - bean name.
-     *
-     * @param regName Metric registry name.
-     * @return Parsed names parts.
-     */
-    public static MetricName parse(String regName) {
-        int firstDot = regName.indexOf('.');
-
-        if (firstDot == -1)
-            return new MetricName(null, regName);
-
-        String grp = regName.substring(0, firstDot);
-        String beanName = regName.substring(firstDot + 1);
-
-        return new MetricName(grp, beanName);
-    }
-
-    /**
      * Builds metric name. Each parameter will separated by '.' char.
      *
      * @param names Metric name parts.
@@ -188,39 +169,4 @@
 
         return names;
     }
-
-    /**
-     * Parsed metric registry name parts.
-     *
-     * Example - metric registry name - "io.statistics.PRIMARY_KEY_IDX".
-     * root = io - JMX tree root.
-     * subName = statistics.PRIMARY_KEY_IDX - bean name.
-     */
-    public static class MetricName {
-        /** JMX group name. */
-        private String root;
-
-        /** JMX bean name. */
-        private String subName;
-
-        /** */
-        MetricName(String root, String subName) {
-            this.root = root;
-            this.subName = subName;
-        }
-
-        /**
-         * @return JMX group name.
-         */
-        public String root() {
-            return root;
-        }
-
-        /**
-         * @return JMX bean name.
-         */
-        public String subName() {
-            return subName;
-        }
-    }
 }
diff --git a/modules/core/src/main/java/org/apache/ignite/mxbean/MetricsMxBean.java b/modules/core/src/main/java/org/apache/ignite/mxbean/MetricsMxBean.java
index 52eb844..803546b 100644
--- a/modules/core/src/main/java/org/apache/ignite/mxbean/MetricsMxBean.java
+++ b/modules/core/src/main/java/org/apache/ignite/mxbean/MetricsMxBean.java
@@ -18,8 +18,8 @@
 package org.apache.ignite.mxbean;
 
 import org.apache.ignite.IgniteException;
-import org.apache.ignite.internal.processors.metric.impl.HistogramMetric;
 import org.apache.ignite.internal.processors.metric.impl.HitRateMetric;
+import org.apache.ignite.spi.metric.HistogramMetric;
 
 /**
  * Metrics MXBean interface.
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 4fdfa13..504cbb4d 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
@@ -31,6 +31,7 @@
 import org.apache.ignite.plugin.extensions.communication.Message;
 import org.apache.ignite.spi.metric.LongMetric;
 import org.apache.ignite.spi.metric.Metric;
+import org.apache.ignite.spi.metric.ReadOnlyMetricRegistry;
 
 import static org.apache.ignite.internal.processors.metric.impl.MetricUtils.SEPARATOR;
 import static org.apache.ignite.internal.processors.metric.impl.MetricUtils.metricName;
@@ -60,7 +61,7 @@
     private final GridMetricManager mmgr;
 
     /** Metrics registry. */
-    private final MetricRegistry mreg;
+    private final org.apache.ignite.internal.processors.metric.MetricRegistry mreg;
 
     /** All registered metrics. */
     private final Set<ThreadMetrics> allMetrics = Collections.newSetFromMap(new ConcurrentHashMap<>());
@@ -138,9 +139,9 @@
             if (!mreg.name().startsWith(COMMUNICATION_METRICS_GROUP_NAME + SEPARATOR))
                 return;
 
-            mreg.longAdderMetric(SENT_MESSAGES_BY_NODE_ID_METRIC_NAME, SENT_MESSAGES_BY_NODE_ID_METRIC_DESC);
+            ((MetricRegistry)mreg).longAdderMetric(SENT_MESSAGES_BY_NODE_ID_METRIC_NAME, SENT_MESSAGES_BY_NODE_ID_METRIC_DESC);
 
-            mreg.longAdderMetric(RECEIVED_MESSAGES_BY_NODE_ID_METRIC_NAME, RECEIVED_MESSAGES_BY_NODE_ID_METRIC_DESC);
+            ((MetricRegistry)mreg).longAdderMetric(RECEIVED_MESSAGES_BY_NODE_ID_METRIC_NAME, RECEIVED_MESSAGES_BY_NODE_ID_METRIC_DESC);
         });
     }
 
@@ -297,7 +298,7 @@
 
         String mregPrefix = COMMUNICATION_METRICS_GROUP_NAME + SEPARATOR;
 
-        for (MetricRegistry mreg : mmgr) {
+        for (ReadOnlyMetricRegistry mreg : mmgr) {
             if (mreg.name().startsWith(mregPrefix)) {
                 String nodeIdStr = mreg.name().substring(mregPrefix.length());
 
@@ -327,7 +328,7 @@
                 metric.reset();
         }
 
-        for (MetricRegistry mreg : mmgr) {
+        for (ReadOnlyMetricRegistry mreg : mmgr) {
             if (mreg.name().startsWith(COMMUNICATION_METRICS_GROUP_NAME + SEPARATOR)) {
                 mreg.findMetric(SENT_MESSAGES_BY_NODE_ID_METRIC_NAME).reset();
 
diff --git a/modules/core/src/main/java/org/apache/ignite/spi/metric/HistogramMetric.java b/modules/core/src/main/java/org/apache/ignite/spi/metric/HistogramMetric.java
new file mode 100644
index 0000000..3570b4d
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/spi/metric/HistogramMetric.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.spi.metric;
+
+/**
+ * Histogram metric calculates counts of measurements that gets into each bounds interval.
+ * Note, that {@link #value()} will return array length of {@code bounds.length + 1}.
+ * Last element will contains count of measurements bigger then most right value of bounds.
+ */
+public interface HistogramMetric extends ObjectMetric<long[]> {
+    /** @return Bounds of this histogram. */
+    public long[] bounds();
+}
diff --git a/modules/core/src/main/java/org/apache/ignite/spi/metric/MetricExporterSpi.java b/modules/core/src/main/java/org/apache/ignite/spi/metric/MetricExporterSpi.java
index 1783984..de7ba58 100644
--- a/modules/core/src/main/java/org/apache/ignite/spi/metric/MetricExporterSpi.java
+++ b/modules/core/src/main/java/org/apache/ignite/spi/metric/MetricExporterSpi.java
@@ -18,7 +18,6 @@
 package org.apache.ignite.spi.metric;
 
 import java.util.function.Predicate;
-import org.apache.ignite.internal.processors.metric.MetricRegistry;
 import org.apache.ignite.spi.IgniteSpi;
 import org.apache.ignite.spi.metric.jmx.JmxMetricExporterSpi;
 
@@ -30,6 +29,7 @@
  * So after start SPI should respond to some incoming request.
  * HTTP servlet or JMX bean are good examples of expected implementations.
  *
+ * @see ReadOnlyMetricManager
  * @see ReadOnlyMetricRegistry
  * @see Metric
  * @see BooleanMetric
@@ -46,7 +46,7 @@
      *
      * @param registry Metric registry.
      */
-    public void setMetricRegistry(ReadOnlyMetricRegistry registry);
+    public void setMetricRegistry(ReadOnlyMetricManager registry);
 
     /**
      * Sets export filter.
@@ -54,5 +54,5 @@
      *
      * @param filter Filter.
      */
-    public void setExportFilter(Predicate<MetricRegistry> filter);
+    public void setExportFilter(Predicate<ReadOnlyMetricRegistry> filter);
 }
diff --git a/modules/core/src/main/java/org/apache/ignite/spi/metric/ReadOnlyMetricManager.java b/modules/core/src/main/java/org/apache/ignite/spi/metric/ReadOnlyMetricManager.java
new file mode 100644
index 0000000..a5cbb02
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/spi/metric/ReadOnlyMetricManager.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.spi.metric;
+
+import java.util.function.Consumer;
+
+/**
+ * Read only metric manager.
+ */
+public interface ReadOnlyMetricManager extends Iterable<ReadOnlyMetricRegistry> {
+    /**
+     * Adds listener of metrics registry creation events.
+     *
+     * @param lsnr Listener.
+     */
+    public void addMetricRegistryCreationListener(Consumer<ReadOnlyMetricRegistry> lsnr);
+
+    /**
+     * Adds listener of metrics registry remove events.
+     *
+     * @param lsnr Listener.
+     */
+    public void addMetricRegistryRemoveListener(Consumer<ReadOnlyMetricRegistry> lsnr);
+}
diff --git a/modules/core/src/main/java/org/apache/ignite/spi/metric/ReadOnlyMetricRegistry.java b/modules/core/src/main/java/org/apache/ignite/spi/metric/ReadOnlyMetricRegistry.java
index 6fffc72..377f0c9 100644
--- a/modules/core/src/main/java/org/apache/ignite/spi/metric/ReadOnlyMetricRegistry.java
+++ b/modules/core/src/main/java/org/apache/ignite/spi/metric/ReadOnlyMetricRegistry.java
@@ -17,24 +17,18 @@
 
 package org.apache.ignite.spi.metric;
 
-import java.util.function.Consumer;
-import org.apache.ignite.internal.processors.metric.MetricRegistry;
+import org.jetbrains.annotations.Nullable;
 
 /**
  * Read only metric registry.
  */
-public interface ReadOnlyMetricRegistry extends Iterable<MetricRegistry> {
-    /**
-     * Adds listener of metrics registry creation events.
-     *
-     * @param lsnr Listener.
-     */
-    public void addMetricRegistryCreationListener(Consumer<MetricRegistry> lsnr);
+public interface ReadOnlyMetricRegistry extends Iterable<Metric> {
+    /** @return Registry name. */
+    public String name();
 
     /**
-     * Adds listener of metrics registry remove events.
-     *
-     * @param lsnr Listener.
+     * @param name Name of the metric.
+     * @return Metric with specified name if exists. Null otherwise.
      */
-    public void addMetricRegistryRemoveListener(Consumer<MetricRegistry> lsnr);
+    @Nullable public <M extends Metric> M findMetric(String name);
 }
diff --git a/modules/core/src/main/java/org/apache/ignite/spi/metric/jmx/JmxMetricExporterSpi.java b/modules/core/src/main/java/org/apache/ignite/spi/metric/jmx/JmxMetricExporterSpi.java
index 2391f23..f416616 100644
--- a/modules/core/src/main/java/org/apache/ignite/spi/metric/jmx/JmxMetricExporterSpi.java
+++ b/modules/core/src/main/java/org/apache/ignite/spi/metric/jmx/JmxMetricExporterSpi.java
@@ -25,16 +25,14 @@
 import javax.management.MalformedObjectNameException;
 import javax.management.ObjectName;
 import org.apache.ignite.Ignite;
-import org.apache.ignite.internal.processors.metric.MetricRegistry;
-import org.apache.ignite.internal.processors.metric.impl.MetricUtils;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.spi.IgniteSpiAdapter;
 import org.apache.ignite.spi.IgniteSpiException;
 import org.apache.ignite.spi.metric.MetricExporterSpi;
+import org.apache.ignite.spi.metric.ReadOnlyMetricManager;
 import org.apache.ignite.spi.metric.ReadOnlyMetricRegistry;
 import org.jetbrains.annotations.Nullable;
 
-import static org.apache.ignite.internal.processors.metric.impl.MetricUtils.parse;
 import static org.apache.ignite.internal.util.IgniteUtils.makeMBeanName;
 
 /**
@@ -42,10 +40,10 @@
  */
 public class JmxMetricExporterSpi extends IgniteSpiAdapter implements MetricExporterSpi {
     /** Metric registry. */
-    private ReadOnlyMetricRegistry mreg;
+    private ReadOnlyMetricManager mreg;
 
     /** Metric filter. */
-    private @Nullable Predicate<MetricRegistry> filter;
+    private @Nullable Predicate<ReadOnlyMetricRegistry> filter;
 
     /** Registered beans. */
     private final List<ObjectName> mBeans = new ArrayList<>();
@@ -63,7 +61,7 @@
      *
      * @param mreg Metric registry.
      */
-    private void register(MetricRegistry mreg) {
+    private void register(ReadOnlyMetricRegistry mreg) {
         if (filter != null && !filter.test(mreg)) {
             if (log.isDebugEnabled())
                 U.debug(log, "Metric registry filtered and will not be registered.[registry=" + mreg.name() + ']');
@@ -73,7 +71,7 @@
         else if (log.isDebugEnabled())
             log.debug("Found new metric registry [name=" + mreg.name() + ']');
 
-        MetricUtils.MetricName n = parse(mreg.name());
+        MetricName n = parse(mreg.name());
 
         try {
             MetricRegistryMBean mregBean = new MetricRegistryMBean(mreg);
@@ -101,8 +99,8 @@
      *
      * @param mreg Metric registry.
      */
-    private void unregister(MetricRegistry mreg) {
-        MetricUtils.MetricName n = parse(mreg.name());
+    private void unregister(ReadOnlyMetricRegistry mreg) {
+        MetricName n = parse(mreg.name());
 
         try {
             ObjectName mbeanName = makeMBeanName(igniteInstanceName, n.root(), n.subName());
@@ -144,12 +142,67 @@
     }
 
     /** {@inheritDoc} */
-    @Override public void setMetricRegistry(ReadOnlyMetricRegistry reg) {
+    @Override public void setMetricRegistry(ReadOnlyMetricManager reg) {
         this.mreg = reg;
     }
 
     /** {@inheritDoc} */
-    @Override public void setExportFilter(Predicate<MetricRegistry> filter) {
+    @Override public void setExportFilter(Predicate<ReadOnlyMetricRegistry> filter) {
         this.filter = filter;
     }
+
+    /**
+     * Example - metric registry name - "io.statistics.PRIMARY_KEY_IDX".
+     * root = io - JMX tree root.
+     * subName = statistics.PRIMARY_KEY_IDX - bean name.
+     *
+     * @param regName Metric registry name.
+     * @return Parsed names parts.
+     */
+    private MetricName parse(String regName) {
+        int firstDot = regName.indexOf('.');
+
+        if (firstDot == -1)
+            return new MetricName(null, regName);
+
+        String grp = regName.substring(0, firstDot);
+        String beanName = regName.substring(firstDot + 1);
+
+        return new MetricName(grp, beanName);
+    }
+
+    /**
+     * Parsed metric registry name parts.
+     *
+     * Example - metric registry name - "io.statistics.PRIMARY_KEY_IDX".
+     * root = io - JMX tree root.
+     * subName = statistics.PRIMARY_KEY_IDX - bean name.
+     */
+    private class MetricName {
+        /** JMX group name. */
+        private String root;
+
+        /** JMX bean name. */
+        private String subName;
+
+        /** */
+        MetricName(String root, String subName) {
+            this.root = root;
+            this.subName = subName;
+        }
+
+        /**
+         * @return JMX group name.
+         */
+        public String root() {
+            return root;
+        }
+
+        /**
+         * @return JMX bean name.
+         */
+        public String subName() {
+            return subName;
+        }
+    }
 }
diff --git a/modules/core/src/main/java/org/apache/ignite/spi/metric/jmx/MetricRegistryMBean.java b/modules/core/src/main/java/org/apache/ignite/spi/metric/jmx/MetricRegistryMBean.java
index 8c3cb12..5df6d30 100644
--- a/modules/core/src/main/java/org/apache/ignite/spi/metric/jmx/MetricRegistryMBean.java
+++ b/modules/core/src/main/java/org/apache/ignite/spi/metric/jmx/MetricRegistryMBean.java
@@ -25,16 +25,16 @@
 import java.util.Scanner;
 import javax.management.MBeanAttributeInfo;
 import javax.management.MBeanInfo;
-import org.apache.ignite.internal.processors.metric.MetricRegistry;
-import org.apache.ignite.internal.processors.metric.impl.HistogramMetric;
 import org.apache.ignite.internal.processors.metric.impl.MetricUtils;
 import org.apache.ignite.internal.util.typedef.T2;
 import org.apache.ignite.spi.metric.BooleanMetric;
 import org.apache.ignite.spi.metric.DoubleMetric;
+import org.apache.ignite.spi.metric.HistogramMetric;
 import org.apache.ignite.spi.metric.IntMetric;
 import org.apache.ignite.spi.metric.LongMetric;
 import org.apache.ignite.spi.metric.Metric;
 import org.apache.ignite.spi.metric.ObjectMetric;
+import org.apache.ignite.spi.metric.ReadOnlyMetricManager;
 import org.apache.ignite.spi.metric.ReadOnlyMetricRegistry;
 
 import static java.util.Arrays.binarySearch;
@@ -46,7 +46,7 @@
  */
 public class MetricRegistryMBean extends ReadOnlyDynamicMBean {
     /** Metric registry. */
-    MetricRegistry mreg;
+    ReadOnlyMetricRegistry mreg;
 
     /** Cached histogram metrics intervals names. */
     private final Map<String, T2<long[], String[]>> histogramNames = new HashMap<>();
@@ -54,7 +54,7 @@
     /**
      * @param mreg Metric registry.
      */
-    public MetricRegistryMBean(MetricRegistry mreg) {
+    public MetricRegistryMBean(ReadOnlyMetricRegistry mreg) {
         this.mreg = mreg;
     }
 
@@ -119,7 +119,7 @@
         });
 
         return new MBeanInfo(
-            ReadOnlyMetricRegistry.class.getName(),
+            ReadOnlyMetricManager.class.getName(),
             mreg.name(),
             attributes.toArray(new MBeanAttributeInfo[attributes.size()]),
             null,
@@ -154,7 +154,7 @@
      * @return Specific bucket value or {@code null} if not found.
      * @see MetricUtils#histogramBucketNames(HistogramMetric, Map)
      */
-    public static Long searchHistogram(String name, MetricRegistry mreg) {
+    public static Long searchHistogram(String name, ReadOnlyMetricRegistry mreg) {
         Scanner sc = new Scanner(name).useDelimiter("_");
 
         if (!sc.hasNext())
diff --git a/modules/core/src/main/java/org/apache/ignite/spi/metric/noop/NoopMetricExporterSpi.java b/modules/core/src/main/java/org/apache/ignite/spi/metric/noop/NoopMetricExporterSpi.java
index 68427e5..e296f74 100644
--- a/modules/core/src/main/java/org/apache/ignite/spi/metric/noop/NoopMetricExporterSpi.java
+++ b/modules/core/src/main/java/org/apache/ignite/spi/metric/noop/NoopMetricExporterSpi.java
@@ -18,11 +18,11 @@
 package org.apache.ignite.spi.metric.noop;
 
 import java.util.function.Predicate;
-import org.apache.ignite.internal.processors.metric.MetricRegistry;
 import org.apache.ignite.spi.IgniteSpiAdapter;
 import org.apache.ignite.spi.IgniteSpiException;
 import org.apache.ignite.spi.IgniteSpiNoop;
 import org.apache.ignite.spi.metric.MetricExporterSpi;
+import org.apache.ignite.spi.metric.ReadOnlyMetricManager;
 import org.apache.ignite.spi.metric.ReadOnlyMetricRegistry;
 import org.jetbrains.annotations.Nullable;
 
@@ -42,12 +42,12 @@
     }
 
     /** {@inheritDoc} */
-    @Override public void setMetricRegistry(ReadOnlyMetricRegistry registry) {
+    @Override public void setMetricRegistry(ReadOnlyMetricManager registry) {
         // No-op.
     }
 
     /** {@inheritDoc} */
-    @Override public void setExportFilter(Predicate<MetricRegistry> filter) {
+    @Override public void setExportFilter(Predicate<ReadOnlyMetricRegistry> filter) {
         // No-op.
     }
 }
diff --git a/modules/core/src/main/java/org/apache/ignite/spi/systemview/ReadOnlySystemViewRegistry.java b/modules/core/src/main/java/org/apache/ignite/spi/systemview/ReadOnlySystemViewRegistry.java
index 5e06a36..878d775 100644
--- a/modules/core/src/main/java/org/apache/ignite/spi/systemview/ReadOnlySystemViewRegistry.java
+++ b/modules/core/src/main/java/org/apache/ignite/spi/systemview/ReadOnlySystemViewRegistry.java
@@ -18,14 +18,14 @@
 package org.apache.ignite.spi.systemview;
 
 import java.util.function.Consumer;
-import org.apache.ignite.internal.processors.metric.GridMetricManager;
+import org.apache.ignite.internal.managers.systemview.GridSystemViewManager;
 import org.apache.ignite.spi.metric.MetricExporterSpi;
 import org.apache.ignite.spi.systemview.view.SystemView;
 
 /**
  * Read only system view registry.
  *
- * @see GridMetricManager
+ * @see GridSystemViewManager
  * @see SystemView
  * @see MetricExporterSpi
  */
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/metric/IoStatisticsCacheSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/metric/IoStatisticsCacheSelfTest.java
index 0d300d0..43f8c79 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/metric/IoStatisticsCacheSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/metric/IoStatisticsCacheSelfTest.java
@@ -35,6 +35,7 @@
 import org.apache.ignite.internal.processors.metric.MetricRegistry;
 import org.apache.ignite.spi.metric.LongMetric;
 import org.apache.ignite.spi.metric.Metric;
+import org.apache.ignite.spi.metric.ReadOnlyMetricRegistry;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.junit.Test;
 
@@ -258,7 +259,7 @@
 
         GridMetricManager mmgr = ignite.context().metric();
 
-        Stream<MetricRegistry> grpsStream = StreamSupport.stream(mmgr.spliterator(), false)
+        Stream<ReadOnlyMetricRegistry> grpsStream = StreamSupport.stream(mmgr.spliterator(), false)
                 .filter(grp -> grp.name().startsWith(statType.metricGroupName()));
 
         return grpsStream.flatMap(grp -> StreamSupport.stream(grp.spliterator(), false))
@@ -299,7 +300,7 @@
     /**
      * @param mmgr Metric manager.
      * @param type Staticstics type.
-     * @param id Metric set id.
+     * @param id Metric registry id.
      * @return Logical reads count.
      */
     public static long logicalReads(GridMetricManager mmgr, IoStatisticsType type, String id) {
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/metric/IoStatisticsMetricsLocalMXBeanImplSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/metric/IoStatisticsMetricsLocalMXBeanImplSelfTest.java
index c32c567..9f8a324 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/metric/IoStatisticsMetricsLocalMXBeanImplSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/metric/IoStatisticsMetricsLocalMXBeanImplSelfTest.java
@@ -26,6 +26,7 @@
 import org.apache.ignite.internal.processors.metric.GridMetricManager;
 import org.apache.ignite.internal.processors.metric.MetricRegistry;
 import org.apache.ignite.spi.metric.LongMetric;
+import org.apache.ignite.spi.metric.ReadOnlyMetricRegistry;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.junit.Test;
 
@@ -154,7 +155,7 @@
         GridMetricManager mmgr = ignite.context().metric();
 
         StreamSupport.stream(mmgr.spliterator(), false)
-            .map(MetricRegistry::name)
+            .map(ReadOnlyMetricRegistry::name)
             .filter(name -> {
                 for (IoStatisticsType type : IoStatisticsType.values()) {
                     if (name.startsWith(type.metricGroupName()))
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/metric/JmxExporterSpiTest.java b/modules/core/src/test/java/org/apache/ignite/internal/metric/JmxExporterSpiTest.java
index d32a2ba..49cb8fa 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/metric/JmxExporterSpiTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/metric/JmxExporterSpiTest.java
@@ -71,7 +71,7 @@
 import org.apache.ignite.internal.metric.SystemViewSelfTest.TestRunnable;
 import org.apache.ignite.internal.metric.SystemViewSelfTest.TestTransformer;
 import org.apache.ignite.internal.processors.metric.MetricRegistry;
-import org.apache.ignite.internal.processors.metric.impl.HistogramMetric;
+import org.apache.ignite.internal.processors.metric.impl.HistogramMetricImpl;
 import org.apache.ignite.internal.processors.odbc.jdbc.JdbcConnectionContext;
 import org.apache.ignite.internal.processors.service.DummyService;
 import org.apache.ignite.internal.util.StripedExecutor;
@@ -1000,7 +1000,7 @@
     private void createTestHistogram(MetricRegistry mreg) {
         long[] bounds = new long[] {50, 500};
 
-        HistogramMetric histogram = mreg.histogram("histogram", bounds, null);
+        HistogramMetricImpl histogram = mreg.histogram("histogram", bounds, null);
 
         histogram.value(10);
         histogram.value(51);
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/metric/MetricsConfigurationTest.java b/modules/core/src/test/java/org/apache/ignite/internal/metric/MetricsConfigurationTest.java
index f2cbaec..e2e3fdc 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/metric/MetricsConfigurationTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/metric/MetricsConfigurationTest.java
@@ -29,10 +29,11 @@
 import org.apache.ignite.internal.IgniteEx;
 import org.apache.ignite.internal.processors.metric.MetricRegistry;
 import org.apache.ignite.internal.processors.metric.MetricsMxBeanImpl;
-import org.apache.ignite.internal.processors.metric.impl.HistogramMetric;
+import org.apache.ignite.internal.processors.metric.impl.HistogramMetricImpl;
 import org.apache.ignite.internal.processors.metric.impl.HitRateMetric;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.mxbean.MetricsMxBean;
+import org.apache.ignite.spi.metric.HistogramMetric;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.junit.Test;
 
@@ -199,7 +200,7 @@
             MetricRegistry mreg = g0.context().metric().registry(TEST_REG);
 
             HitRateMetric hitRate = mreg.hitRateMetric(HITRATE_NAME, "test", 10000, 5);
-            HistogramMetric histogram = mreg.histogram(HISTOGRAM_NAME, new long[] {250, 500}, "test");
+            HistogramMetricImpl histogram = mreg.histogram(HISTOGRAM_NAME, new long[] {250, 500}, "test");
 
             assertEquals(1000, hitRate.rateTimeInterval());
             assertArrayEquals(BOUNDS, histogram.bounds());
@@ -240,7 +241,7 @@
 
             awaitPartitionMapExchange();
 
-            HistogramMetric getTime = g0.context().metric().registry(cacheRegName).findMetric("GetTime");
+            HistogramMetricImpl getTime = g0.context().metric().registry(cacheRegName).findMetric("GetTime");
 
             assertNotEquals(BOUNDS.length, getTime.bounds().length);
 
@@ -282,7 +283,7 @@
 
             awaitPartitionMapExchange();
 
-            HistogramMetric getTime = g0.context().metric().registry(cacheRegName).findMetric("GetTime");
+            HistogramMetricImpl getTime = g0.context().metric().registry(cacheRegName).findMetric("GetTime");
 
             assertNotEquals(BOUNDS.length, getTime.bounds().length);
 
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/metric/MetricsSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/metric/MetricsSelfTest.java
index a8eaf58..3cd8a4a 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/metric/MetricsSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/metric/MetricsSelfTest.java
@@ -30,7 +30,7 @@
 import org.apache.ignite.internal.processors.metric.impl.AtomicLongMetric;
 import org.apache.ignite.internal.processors.metric.impl.BooleanMetricImpl;
 import org.apache.ignite.internal.processors.metric.impl.DoubleMetricImpl;
-import org.apache.ignite.internal.processors.metric.impl.HistogramMetric;
+import org.apache.ignite.internal.processors.metric.impl.HistogramMetricImpl;
 import org.apache.ignite.internal.processors.metric.impl.HitRateMetric;
 import org.apache.ignite.internal.processors.metric.impl.IntMetricImpl;
 import org.apache.ignite.internal.processors.metric.impl.LongAdderMetric;
@@ -232,7 +232,7 @@
     /** */
     @Test
     public void testHistogram() throws Exception {
-        HistogramMetric h = mreg.histogram("hmtest", new long[] {10, 100, 500}, "test");
+        HistogramMetricImpl h = mreg.histogram("hmtest", new long[] {10, 100, 500}, "test");
 
         List<IgniteInternalFuture> futs = new ArrayList<>();
 
@@ -343,7 +343,7 @@
     /** */
     @Test
     public void testHistogramNames() throws Exception {
-        HistogramMetric h = new HistogramMetric("test", null, new long[]{10, 50, 500});
+        HistogramMetricImpl h = new HistogramMetricImpl("test", null, new long[]{10, 50, 500});
 
         Map<String, T2<long[], String[]>> cache = new HashMap<>();
 
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAbstractMetricsSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAbstractMetricsSelfTest.java
index 4627eee..57ee010 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAbstractMetricsSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAbstractMetricsSelfTest.java
@@ -45,7 +45,7 @@
 import org.apache.ignite.internal.IgniteEx;
 import org.apache.ignite.internal.IgniteKernal;
 import org.apache.ignite.internal.processors.metric.MetricRegistry;
-import org.apache.ignite.internal.processors.metric.impl.HistogramMetric;
+import org.apache.ignite.internal.processors.metric.impl.HistogramMetricImpl;
 import org.apache.ignite.internal.util.lang.GridAbsPredicateX;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.lang.IgniteFuture;
@@ -1415,7 +1415,7 @@
     public void testGetTime() {
         IgniteCache<Integer, Integer> cache = grid(0).cache(DEFAULT_CACHE_NAME);
 
-        HistogramMetric m = metric("GetTime");
+        HistogramMetricImpl m = metric("GetTime");
 
         assertTrue(Arrays.stream(m.value()).allMatch(v -> v == 0));
 
@@ -1433,7 +1433,7 @@
     public void testPutTime() {
         IgniteCache<Integer, Integer> cache = grid(0).cache(DEFAULT_CACHE_NAME);
 
-        HistogramMetric m = metric("PutTime");
+        HistogramMetricImpl m = metric("PutTime");
 
         assertTrue(Arrays.stream(m.value()).allMatch(v -> v == 0));
 
@@ -1447,7 +1447,7 @@
     public void testRemoveTime() {
         IgniteCache<Integer, Integer> cache = grid(0).cache(DEFAULT_CACHE_NAME);
 
-        HistogramMetric m = metric("RemoveTime");
+        HistogramMetricImpl m = metric("RemoveTime");
 
         assertTrue(Arrays.stream(m.value()).allMatch(v -> v == 0));
 
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheTransactionalAbstractMetricsSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheTransactionalAbstractMetricsSelfTest.java
index b6978f2..b076150 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheTransactionalAbstractMetricsSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheTransactionalAbstractMetricsSelfTest.java
@@ -21,7 +21,7 @@
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.IgniteTransactions;
 import org.apache.ignite.cache.CacheMetrics;
-import org.apache.ignite.internal.processors.metric.impl.HistogramMetric;
+import org.apache.ignite.internal.processors.metric.impl.HistogramMetricImpl;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.testframework.GridTestUtils;
 import org.apache.ignite.transactions.Transaction;
@@ -268,7 +268,7 @@
     public void testCommitTime() {
         IgniteCache<Integer, Integer> cache = grid(0).cache(DEFAULT_CACHE_NAME);
 
-        HistogramMetric m = metric("CommitTime");
+        HistogramMetricImpl m = metric("CommitTime");
 
         assertTrue(Arrays.stream(m.value()).allMatch(v -> v == 0));
 
@@ -286,7 +286,7 @@
     public void testRollbackTime() {
         IgniteCache<Integer, Integer> cache = grid(0).cache(DEFAULT_CACHE_NAME);
 
-        HistogramMetric m = metric("RollbackTime");
+        HistogramMetricImpl m = metric("RollbackTime");
 
         assertTrue(Arrays.stream(m.value()).allMatch(v -> v == 0));
 
diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/ClusterMetricsSelfTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/ClusterMetricsSelfTest.java
index 505a1f7..ea11dac 100644
--- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/ClusterMetricsSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/ClusterMetricsSelfTest.java
@@ -26,7 +26,7 @@
 import org.apache.ignite.internal.TestRecordingCommunicationSpi;
 import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsFullMessage;
 import org.apache.ignite.internal.processors.metric.MetricRegistry;
-import org.apache.ignite.internal.processors.metric.impl.HistogramMetric;
+import org.apache.ignite.internal.processors.metric.impl.HistogramMetricImpl;
 import org.apache.ignite.spi.metric.LongMetric;
 import org.apache.ignite.testframework.GridTestUtils;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
@@ -84,8 +84,8 @@
         LongMetric currentPMEDuration = reg.findMetric(PME_DURATION);
         LongMetric currentBlockingPMEDuration = reg.findMetric(PME_OPS_BLOCKED_DURATION);
 
-        HistogramMetric durationHistogram = reg.findMetric(PME_DURATION_HISTOGRAM);
-        HistogramMetric blockindDurationHistogram = reg.findMetric(PME_OPS_BLOCKED_DURATION_HISTOGRAM);
+        HistogramMetricImpl durationHistogram = reg.findMetric(PME_DURATION_HISTOGRAM);
+        HistogramMetricImpl blockindDurationHistogram = reg.findMetric(PME_OPS_BLOCKED_DURATION_HISTOGRAM);
 
         IgniteCache<Object, Object> cache = ignite.getOrCreateCache(
             new CacheConfiguration<>(DEFAULT_CACHE_NAME)
diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridAbstractTest.java
index 259aa99..4b903a4 100755
--- a/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridAbstractTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridAbstractTest.java
@@ -2718,7 +2718,7 @@
     }
 
     /**
-     * Returns metric set.
+     * Returns metric registry.
      *
      * @param igniteInstanceName Ignite instance name.
      * @param grp Name of the group.
diff --git a/modules/indexing/src/main/java/org/apache/ignite/spi/metric/sql/MetricRegistryLocalSystemView.java b/modules/indexing/src/main/java/org/apache/ignite/spi/metric/sql/MetricRegistryLocalSystemView.java
index f44dfdb..60352df 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/spi/metric/sql/MetricRegistryLocalSystemView.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/spi/metric/sql/MetricRegistryLocalSystemView.java
@@ -21,9 +21,9 @@
 import java.util.Iterator;
 import java.util.function.Predicate;
 import org.apache.ignite.internal.GridKernalContext;
-import org.apache.ignite.internal.processors.metric.MetricRegistry;
 import org.apache.ignite.internal.processors.query.h2.sys.view.SqlAbstractLocalSystemView;
 import org.apache.ignite.spi.metric.Metric;
+import org.apache.ignite.spi.metric.ReadOnlyMetricManager;
 import org.apache.ignite.spi.metric.ReadOnlyMetricRegistry;
 import org.h2.engine.Session;
 import org.h2.result.Row;
@@ -36,18 +36,18 @@
  */
 public class MetricRegistryLocalSystemView extends SqlAbstractLocalSystemView {
     /** Metric registry. */
-    private ReadOnlyMetricRegistry mreg;
+    private ReadOnlyMetricManager mreg;
 
     /** Metric filter. */
-    private @Nullable Predicate<MetricRegistry> filter;
+    private @Nullable Predicate<ReadOnlyMetricRegistry> filter;
 
     /**
      * @param ctx Context.
      * @param mreg Metric registry.
      * @param filter Metric registry filter.
      */
-    public MetricRegistryLocalSystemView(GridKernalContext ctx, ReadOnlyMetricRegistry mreg,
-        @Nullable Predicate<MetricRegistry> filter) {
+    public MetricRegistryLocalSystemView(GridKernalContext ctx, ReadOnlyMetricManager mreg,
+        @Nullable Predicate<ReadOnlyMetricRegistry> filter) {
         super(SqlViewMetricExporterSpi.SYS_VIEW_NAME, "Ignite metrics",
             ctx,
             newColumn("NAME", Value.STRING),
@@ -62,7 +62,7 @@
     @Override public Iterator<Row> getRows(Session ses, SearchRow first, SearchRow last) {
         return new Iterator<Row>() {
             /** */
-            private Iterator<MetricRegistry> grps = mreg.iterator();
+            private Iterator<ReadOnlyMetricRegistry> grps = mreg.iterator();
 
             /** */
             private Iterator<Metric> curr = Collections.emptyIterator();
@@ -70,7 +70,7 @@
             /** */
             private boolean advance() {
                 while (grps.hasNext()) {
-                    MetricRegistry mreg = grps.next();
+                    ReadOnlyMetricRegistry mreg = grps.next();
 
                     if (filter != null && !filter.test(mreg))
                         continue;
diff --git a/modules/indexing/src/main/java/org/apache/ignite/spi/metric/sql/SqlViewMetricExporterSpi.java b/modules/indexing/src/main/java/org/apache/ignite/spi/metric/sql/SqlViewMetricExporterSpi.java
index a0014e2..2b0c692 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/spi/metric/sql/SqlViewMetricExporterSpi.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/spi/metric/sql/SqlViewMetricExporterSpi.java
@@ -20,13 +20,13 @@
 import java.util.function.Predicate;
 import org.apache.ignite.internal.GridKernalContext;
 import org.apache.ignite.internal.IgniteEx;
-import org.apache.ignite.internal.processors.metric.MetricRegistry;
 import org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing;
 import org.apache.ignite.internal.processors.query.h2.SchemaManager;
 import org.apache.ignite.spi.IgniteSpiAdapter;
 import org.apache.ignite.spi.IgniteSpiContext;
 import org.apache.ignite.spi.IgniteSpiException;
 import org.apache.ignite.spi.metric.MetricExporterSpi;
+import org.apache.ignite.spi.metric.ReadOnlyMetricManager;
 import org.apache.ignite.spi.metric.ReadOnlyMetricRegistry;
 import org.jetbrains.annotations.Nullable;
 
@@ -40,10 +40,10 @@
     public static final String SYS_VIEW_NAME = "METRICS";
 
     /** Metric filter. */
-    private @Nullable Predicate<MetricRegistry> filter;
+    private @Nullable Predicate<ReadOnlyMetricRegistry> filter;
 
     /** Metric Registry. */
-    private ReadOnlyMetricRegistry mreg;
+    private ReadOnlyMetricManager mreg;
 
     /** {@inheritDoc} */
     @Override protected void onContextInitialized0(IgniteSpiContext spiCtx) throws IgniteSpiException {
@@ -68,12 +68,12 @@
     }
 
     /** {@inheritDoc} */
-    @Override public void setMetricRegistry(ReadOnlyMetricRegistry mreg) {
+    @Override public void setMetricRegistry(ReadOnlyMetricManager mreg) {
         this.mreg = mreg;
     }
 
     /** {@inheritDoc} */
-    @Override public void setExportFilter(Predicate<MetricRegistry> filter) {
+    @Override public void setExportFilter(Predicate<ReadOnlyMetricRegistry> filter) {
         this.filter = filter;
     }
 
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/IoStatisticsBasicIndexSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/IoStatisticsBasicIndexSelfTest.java
index 809a1df..932ee4e 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/IoStatisticsBasicIndexSelfTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/IoStatisticsBasicIndexSelfTest.java
@@ -46,6 +46,7 @@
 import org.apache.ignite.internal.processors.metric.MetricRegistry;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.spi.metric.Metric;
+import org.apache.ignite.spi.metric.ReadOnlyMetricRegistry;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -422,7 +423,7 @@
     public Set<String> deriveStatisticNames(IgniteEx ignite, IoStatisticsType statType) {
         assert statType != null;
 
-        Stream<MetricRegistry> grpsStream = ioStats(ignite, statType);
+        Stream<ReadOnlyMetricRegistry> grpsStream = ioStats(ignite, statType);
 
         return grpsStream.flatMap(grp -> StreamSupport.stream(grp.spliterator(), false))
             .filter(m -> m.name().endsWith("name"))
@@ -431,7 +432,7 @@
     }
 
     /** @return Stream of MetricGroup for specified {@link statType}. */
-    private Stream<MetricRegistry> ioStats(IgniteEx ignite, IoStatisticsType statType) {
+    private Stream<ReadOnlyMetricRegistry> ioStats(IgniteEx ignite, IoStatisticsType statType) {
         GridMetricManager mmgr = ignite.context().metric();
 
         return StreamSupport.stream(mmgr.spliterator(), false)
diff --git a/modules/opencensus/src/main/java/org/apache/ignite/spi/metric/opencensus/OpenCensusMetricExporterSpi.java b/modules/opencensus/src/main/java/org/apache/ignite/spi/metric/opencensus/OpenCensusMetricExporterSpi.java
index e3d1c35..d5bfc97 100644
--- a/modules/opencensus/src/main/java/org/apache/ignite/spi/metric/opencensus/OpenCensusMetricExporterSpi.java
+++ b/modules/opencensus/src/main/java/org/apache/ignite/spi/metric/opencensus/OpenCensusMetricExporterSpi.java
@@ -43,17 +43,17 @@
 import org.apache.ignite.internal.processors.metric.GridMetricManager;
 import org.apache.ignite.internal.processors.metric.MetricRegistry;
 import org.apache.ignite.internal.processors.metric.PushMetricsExporterAdapter;
-import org.apache.ignite.internal.processors.metric.impl.HistogramMetric;
 import org.apache.ignite.internal.util.typedef.T2;
 import org.apache.ignite.spi.IgniteSpiContext;
 import org.apache.ignite.spi.IgniteSpiException;
 import org.apache.ignite.spi.metric.BooleanMetric;
 import org.apache.ignite.spi.metric.DoubleMetric;
+import org.apache.ignite.spi.metric.HistogramMetric;
 import org.apache.ignite.spi.metric.IntMetric;
 import org.apache.ignite.spi.metric.LongMetric;
 import org.apache.ignite.spi.metric.Metric;
 import org.apache.ignite.spi.metric.ObjectMetric;
-import org.apache.ignite.spi.metric.ReadOnlyMetricRegistry;
+import org.apache.ignite.spi.metric.ReadOnlyMetricManager;
 import org.jetbrains.annotations.Nullable;
 
 import static io.opencensus.tags.TagMetadata.TagTtl.UNLIMITED_PROPAGATION;
@@ -81,7 +81,7 @@
  *
  * @see MetricRegistry
  * @see GridMetricManager
- * @see ReadOnlyMetricRegistry
+ * @see ReadOnlyMetricManager
  */
 public class OpenCensusMetricExporterSpi extends PushMetricsExporterAdapter {
     /** Flag to enable or disable tag with Ignite instance name. */
diff --git a/modules/opencensus/src/test/java/org/apache/ignite/internal/processors/monitoring/opencensus/OpenCensusMetricExporterSpiTest.java b/modules/opencensus/src/test/java/org/apache/ignite/internal/processors/monitoring/opencensus/OpenCensusMetricExporterSpiTest.java
index 85f0232..6e6d105 100644
--- a/modules/opencensus/src/test/java/org/apache/ignite/internal/processors/monitoring/opencensus/OpenCensusMetricExporterSpiTest.java
+++ b/modules/opencensus/src/test/java/org/apache/ignite/internal/processors/monitoring/opencensus/OpenCensusMetricExporterSpiTest.java
@@ -30,7 +30,7 @@
 import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.internal.IgniteEx;
 import org.apache.ignite.internal.metric.AbstractExporterSpiTest;
-import org.apache.ignite.internal.processors.metric.impl.HistogramMetric;
+import org.apache.ignite.internal.processors.metric.impl.HistogramMetricImpl;
 import org.apache.ignite.spi.metric.opencensus.OpenCensusMetricExporterSpi;
 import org.junit.Test;
 
@@ -150,7 +150,7 @@
             "test_registry_test_histogram_10_100.* 2",
             "test_registry_test_histogram_100_inf.* 3"};
 
-        HistogramMetric histogramMetric =
+        HistogramMetricImpl histogramMetric =
             ignite.context().metric().registry(registryName).histogram(histogramName, bounds, histogramDesc);
 
         for (long value : testValues)