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

tkalkirill pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


The following commit(s) were added to refs/heads/main by this push:
     new 12785ba668 IGNITE-22334 Fix MetricSource#enable/disable/enabled 
implementations as per contract (#3823)
12785ba668 is described below

commit 12785ba6688b3c1735b3c532fb0ec28c2bcaef5f
Author: Kirill Tkalenko <[email protected]>
AuthorDate: Tue May 28 16:54:28 2024 +0300

    IGNITE-22334 Fix MetricSource#enable/disable/enabled implementations as per 
contract (#3823)
---
 .../client/handler/ClientHandlerMetricSource.java  | 18 ++---
 .../ignite/internal/client/ClientMetricSource.java | 20 ++----
 .../internal/tostring/IgniteToStringBuilder.java   |  9 ++-
 .../metrics/MetaStorageMetricSource.java           |  4 ++
 modules/metrics/README.md                          |  5 ++
 .../metrics/exporters/TestMetricsSource.java       | 43 ++++++------
 .../ignite/internal/metrics/AbstractMetric.java    | 39 +++++------
 .../internal/metrics/AbstractMetricSource.java     | 76 +++++++---------------
 .../ignite/internal/metrics/MetricSource.java      | 10 +--
 .../internal/metrics/sources/JvmMetricSource.java  | 13 ++--
 .../internal/metrics/sources/OsMetricSource.java   |  4 ++
 .../internal/metrics/MetricEntitiesTest.java       | 20 +++---
 .../internal/metrics/ThreadPoolMetricSource.java   | 67 ++++++++++++-------
 .../internal/metrics/sources/RaftMetricSource.java | 44 +++++++++----
 .../sql/metrics/SqlClientMetricSource.java         | 40 ++++++------
 .../sql/metrics/SqlPlanCacheMetricSource.java      | 24 +++----
 16 files changed, 209 insertions(+), 227 deletions(-)

diff --git 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/ClientHandlerMetricSource.java
 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/ClientHandlerMetricSource.java
index db59a07b75..87f43bcf34 100644
--- 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/ClientHandlerMetricSource.java
+++ 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/ClientHandlerMetricSource.java
@@ -17,12 +17,10 @@
 
 package org.apache.ignite.client.handler;
 
-import java.util.Arrays;
 import java.util.List;
 import org.apache.ignite.internal.metrics.AbstractMetricSource;
 import org.apache.ignite.internal.metrics.AtomicLongMetric;
 import org.apache.ignite.internal.metrics.Metric;
-import org.apache.ignite.internal.metrics.MetricSetBuilder;
 
 /**
  * Server-side client handler metrics.
@@ -326,13 +324,6 @@ public class ClientHandlerMetricSource extends 
AbstractMetricSource<ClientHandle
         }
     }
 
-    /** {@inheritDoc} */
-    @Override
-    protected void init(MetricSetBuilder bldr, Holder holder) {
-        holder.register(bldr);
-    }
-
-    /** {@inheritDoc} */
     @Override
     protected Holder createHolder() {
         return new Holder();
@@ -374,7 +365,7 @@ public class ClientHandlerMetricSource extends 
AbstractMetricSource<ClientHandle
 
         private final AtomicLongMetric cursorsActive = new 
AtomicLongMetric("CursorsActive", "Active cursors");
 
-        final List<Metric> metrics = Arrays.asList(
+        final List<Metric> metrics = List.of(
                 connectionsInitiated,
                 sessionsAccepted,
                 sessionsActive,
@@ -390,10 +381,9 @@ public class ClientHandlerMetricSource extends 
AbstractMetricSource<ClientHandle
                 cursorsActive
         );
 
-        void register(MetricSetBuilder bldr) {
-            for (var metric : metrics) {
-                bldr.register(metric);
-            }
+        @Override
+        public Iterable<Metric> metrics() {
+            return metrics;
         }
     }
 }
diff --git 
a/modules/client/src/main/java/org/apache/ignite/internal/client/ClientMetricSource.java
 
b/modules/client/src/main/java/org/apache/ignite/internal/client/ClientMetricSource.java
index dd3c873e86..24bde4dfd4 100644
--- 
a/modules/client/src/main/java/org/apache/ignite/internal/client/ClientMetricSource.java
+++ 
b/modules/client/src/main/java/org/apache/ignite/internal/client/ClientMetricSource.java
@@ -17,12 +17,10 @@
 
 package org.apache.ignite.internal.client;
 
-import java.util.Arrays;
 import java.util.List;
 import org.apache.ignite.internal.metrics.AbstractMetricSource;
 import org.apache.ignite.internal.metrics.AtomicLongMetric;
 import org.apache.ignite.internal.metrics.Metric;
-import org.apache.ignite.internal.metrics.MetricSetBuilder;
 import org.apache.ignite.internal.streamer.StreamerMetricSink;
 
 /**
@@ -445,14 +443,7 @@ public class ClientMetricSource extends 
AbstractMetricSource<ClientMetricSource.
         return new Holder();
     }
 
-    @Override
-    protected void init(MetricSetBuilder bldr, Holder holder) {
-        holder.register(bldr);
-    }
-
-    /**
-     * Metrics holder.
-     */
+    /** Metrics holder. */
     protected static class Holder implements 
AbstractMetricSource.Holder<Holder> {
         private final AtomicLongMetric connectionsActive =
                 new AtomicLongMetric("ConnectionsActive", "Currently active 
connections");
@@ -504,7 +495,7 @@ public class ClientMetricSource extends 
AbstractMetricSource<ClientMetricSource.
         private final AtomicLongMetric streamerItemsQueued = new 
AtomicLongMetric(
                 "StreamerItemsQueued", "Total number of queued data streamer 
items (rows)");
 
-        final List<Metric> metrics = Arrays.asList(
+        final List<Metric> metrics = List.of(
                 connectionsActive,
                 connectionsEstablished,
                 connectionsLost,
@@ -524,10 +515,9 @@ public class ClientMetricSource extends 
AbstractMetricSource<ClientMetricSource.
                 streamerItemsQueued
         );
 
-        void register(MetricSetBuilder bldr) {
-            for (var metric : metrics) {
-                bldr.register(metric);
-            }
+        @Override
+        public Iterable<Metric> metrics() {
+            return metrics;
         }
     }
 }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/tostring/IgniteToStringBuilder.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/tostring/IgniteToStringBuilder.java
index 6d8c88d6b7..4cbd361eca 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/tostring/IgniteToStringBuilder.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/tostring/IgniteToStringBuilder.java
@@ -707,9 +707,12 @@ public class IgniteToStringBuilder {
      * @param val1  Additional parameter value.
      * @return String presentation of the given object.
      */
-    public static <T> String toString(Class<T> cls, T obj,
-            String name0, Object val0,
-            String name1, Object val1) {
+    public static <T> String toString(
+            Class<T> cls,
+            T obj,
+            String name0, @Nullable Object val0,
+            String name1, @Nullable Object val1
+    ) {
         return toString(cls, obj, name0, val0, false, name1, val1, false);
     }
 
diff --git 
a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/metrics/MetaStorageMetricSource.java
 
b/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/metrics/MetaStorageMetricSource.java
index bc12ba3eb2..0fa4dd670e 100644
--- 
a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/metrics/MetaStorageMetricSource.java
+++ 
b/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/metrics/MetaStorageMetricSource.java
@@ -49,6 +49,10 @@ public class MetaStorageMetricSource implements MetricSource 
{
 
     @Override
     public synchronized @Nullable MetricSet enable() {
+        if (enabled) {
+            return null;
+        }
+
         var metrics = new HashMap<String, Metric>();
 
         metrics.put(
diff --git a/modules/metrics/README.md b/modules/metrics/README.md
new file mode 100644
index 0000000000..8951b86a67
--- /dev/null
+++ b/modules/metrics/README.md
@@ -0,0 +1,5 @@
+# Metrics
+
+Module responsible for metrics in the Ignite cluster.
+
+For more information, see 
[IEP-116](https://cwiki.apache.org/confluence/display/IGNITE/IEP-116%3A+Metrics).
\ No newline at end of file
diff --git 
a/modules/metrics/src/integrationTest/java/org/apache/ignite/internal/metrics/exporters/TestMetricsSource.java
 
b/modules/metrics/src/integrationTest/java/org/apache/ignite/internal/metrics/exporters/TestMetricsSource.java
index afa239abae..e808d6b4da 100644
--- 
a/modules/metrics/src/integrationTest/java/org/apache/ignite/internal/metrics/exporters/TestMetricsSource.java
+++ 
b/modules/metrics/src/integrationTest/java/org/apache/ignite/internal/metrics/exporters/TestMetricsSource.java
@@ -17,44 +17,39 @@
 
 package org.apache.ignite.internal.metrics.exporters;
 
+import java.util.List;
 import org.apache.ignite.internal.metrics.AbstractMetricSource;
 import org.apache.ignite.internal.metrics.AtomicIntMetric;
-import org.apache.ignite.internal.metrics.MetricSetBuilder;
+import org.apache.ignite.internal.metrics.Metric;
 import org.apache.ignite.internal.metrics.exporters.TestMetricsSource.Holder;
 
-/**
- * Metric source for {@link ThreadPoolMetricTest}.
- */
+/** Simple test metric source. */
 public class TestMetricsSource extends AbstractMetricSource<Holder> {
-    private AtomicIntMetric atomicIntMetric;
-
-    /**
-     * Constructor.
-     *
-     * @param name Name.
-     */
-    public TestMetricsSource(String name) {
+    /** Constructor. */
+    TestMetricsSource(String name) {
         super(name);
     }
 
-    /** {@inheritDoc} */
-    @Override protected Holder createHolder() {
+    @Override
+    protected Holder createHolder() {
         return new Holder();
     }
 
-    /** {@inheritDoc} */
-    @Override protected void init(MetricSetBuilder bldr, Holder holder) {
-        atomicIntMetric = bldr.atomicInt("Metric", "Metric");
-    }
+    void inc() {
+        Holder holder = holder();
 
-    public void inc() {
-        atomicIntMetric.increment();
+        assert holder != null;
+
+        holder.atomicIntMetric.increment();
     }
 
-    /**
-     * Holder class.
-     */
+    /** Holder class. */
     protected static class Holder implements 
AbstractMetricSource.Holder<Holder> {
-        // No-op.
+        private final AtomicIntMetric atomicIntMetric = new 
AtomicIntMetric("Metric", "Metric");
+
+        @Override
+        public Iterable<Metric> metrics() {
+            return List.of(atomicIntMetric);
+        }
     }
 }
diff --git 
a/modules/metrics/src/main/java/org/apache/ignite/internal/metrics/AbstractMetric.java
 
b/modules/metrics/src/main/java/org/apache/ignite/internal/metrics/AbstractMetric.java
index 6b5f965837..32a6c21db7 100644
--- 
a/modules/metrics/src/main/java/org/apache/ignite/internal/metrics/AbstractMetric.java
+++ 
b/modules/metrics/src/main/java/org/apache/ignite/internal/metrics/AbstractMetric.java
@@ -17,24 +17,22 @@
 
 package org.apache.ignite.internal.metrics;
 
+import org.apache.ignite.internal.tostring.S;
 import org.jetbrains.annotations.Nullable;
 
-/**
- * Abstract metric.
- */
+/** Abstract metric. */
 public abstract class AbstractMetric implements Metric {
     /** Metric name. It is local for a particular {@link MetricSet}. */
     private final String name;
 
     /** Metric description. */
-    @Nullable
-    private final String desc;
+    private final @Nullable String desc;
 
     /**
      * Constructor.
      *
-     * @param name Name.
-     * @param desc Description.
+     * @param name Metric name.
+     * @param desc Metric Description.
      */
     public AbstractMetric(String name, @Nullable String desc) {
         assert name != null;
@@ -44,20 +42,18 @@ public abstract class AbstractMetric implements Metric {
         this.desc = desc;
     }
 
-    /** {@inheritDoc} */
-    @Override public String name() {
+    @Override
+    public String name() {
         return name;
     }
 
-    /** {@inheritDoc} */
     @Override
-    @Nullable
-    public String description() {
+    public @Nullable String description() {
         return desc;
     }
 
-    /** {@inheritDoc} */
-    @Override public boolean equals(Object o) {
+    @Override
+    public boolean equals(Object o) {
         if (this == o) {
             return true;
         }
@@ -68,15 +64,16 @@ public abstract class AbstractMetric implements Metric {
 
         AbstractMetric metric = (AbstractMetric) o;
 
-        if (!name.equals(metric.name)) {
-            return false;
-        }
-
-        return true;
+        return name.equals(metric.name);
     }
 
-    /** {@inheritDoc} */
-    @Override public int hashCode() {
+    @Override
+    public int hashCode() {
         return name.hashCode();
     }
+
+    @Override
+    public String toString() {
+        return S.toString((Class<? super AbstractMetric>) getClass(), this, 
"name", name, "description", desc);
+    }
 }
diff --git 
a/modules/metrics/src/main/java/org/apache/ignite/internal/metrics/AbstractMetricSource.java
 
b/modules/metrics/src/main/java/org/apache/ignite/internal/metrics/AbstractMetricSource.java
index 1c29c95ebf..e2a7624404 100644
--- 
a/modules/metrics/src/main/java/org/apache/ignite/internal/metrics/AbstractMetricSource.java
+++ 
b/modules/metrics/src/main/java/org/apache/ignite/internal/metrics/AbstractMetricSource.java
@@ -20,6 +20,7 @@ package org.apache.ignite.internal.metrics;
 import static 
java.util.concurrent.atomic.AtomicReferenceFieldUpdater.newUpdater;
 
 import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
+import org.jetbrains.annotations.Nullable;
 
 /**
  * Base class for all metric sources.
@@ -47,21 +48,13 @@ public abstract class AbstractMetricSource<T extends 
AbstractMetricSource.Holder
         this.name = name;
     }
 
-    /**
-     * Returns metric source name.
-     *
-     * @return Metric source name.
-     */
-    @Override public final String name() {
+    @Override
+    public final String name() {
         return name;
     }
 
-    /**
-     * Checks whether metrics is enabled (switched on) or not (switched off) 
for metric source.
-     *
-     * @return {@code True} if metrics are enabled, otherwise - {@code false}.
-     */
-    @Override public final boolean enabled() {
+    @Override
+    public final boolean enabled() {
         return holder != null;
     }
 
@@ -71,67 +64,44 @@ public abstract class AbstractMetricSource<T extends 
AbstractMetricSource.Holder
      *
      * @return Metrics holder instance if metrics are enabled, otherwise - 
{@code null}.
      */
-    public final T holder() {
+    public final @Nullable T holder() {
         return holder;
     }
 
     /**
-     * Method is responsible for creation of appropriate holder instance in 
underlying implementations.
+     * Method is responsible for creation of appropriate <b>immutable</b> 
holder instance in underlying implementations.
      *
-     * @return New instance of metrics holder that must implements {@link 
Holder} interface.
+     * @return New <b>immutable</b> instance of metrics holder that must 
implements {@link Holder} interface.
      */
     protected abstract T createHolder();
 
-    /** {@inheritDoc} */
-    @Override public final MetricSet enable() {
-        MetricSetBuilder bldr = new MetricSetBuilder(name);
-
-        T hldr = createHolder();
-
-        init(bldr, hldr);
-
-        MetricSet metricSet = bldr.build();
+    @Override
+    public final @Nullable MetricSet enable() {
+        T newHolder = createHolder();
 
-        return HOLDER_FIELD_UPD.compareAndSet(this, null, hldr) ? metricSet : 
null;
-    }
+        if (HOLDER_FIELD_UPD.compareAndSet(this, null, newHolder)) {
+            var metricSetBuilder = new MetricSetBuilder(name);
 
-    /** {@inheritDoc} */
-    @Override public final void disable() {
-        T holder0 = holder;
+            newHolder.metrics().forEach(metricSetBuilder::register);
 
-        if (HOLDER_FIELD_UPD.compareAndSet(this, holder0, null)) {
-            cleanup(holder0);
+            return metricSetBuilder.build();
         }
-    }
 
-    /**
-     * Method is responsible for:
-     * <ol>
-     *     <li>Creation of {@link MetricSet} instance using provided {@link 
MetricSetBuilder}.</li>
-     *     <li>Creation of metric instances in given holder.</li>
-     *     <li>Other initialization if needed.</li>
-     * </ol>.
-     *
-     * @param bldr Metric registry builder.
-     * @param holder Metric instances' holder.
-     */
-    protected abstract void init(MetricSetBuilder bldr, T holder);
+        return null;
+    }
 
-    /**
-     * Method is responsible for cleanup and release of all resources 
initialized or created during {@link #init} method
-     * execution. Note that {@link MetricSet} and {@link Holder} instances 
will be released automatically.
-     *
-     * @param holder Metric instances holder.
-     */
-    protected void cleanup(T holder) {
-        // No-op.
+    @Override
+    public final void disable() {
+        HOLDER_FIELD_UPD.compareAndSet(this, holder, null);
     }
 
     /**
-     * Marker interface for metric instances holder.
+     * Metric instances holder.
      *
      * @param <T> Holder type subclass.
      */
     protected interface Holder<T extends Holder<T>> {
+        /** Returns the holder metrics. */
+        Iterable<Metric> metrics();
     }
 }
diff --git 
a/modules/metrics/src/main/java/org/apache/ignite/internal/metrics/MetricSource.java
 
b/modules/metrics/src/main/java/org/apache/ignite/internal/metrics/MetricSource.java
index 88fa8a5b73..c04ba5ef02 100644
--- 
a/modules/metrics/src/main/java/org/apache/ignite/internal/metrics/MetricSource.java
+++ 
b/modules/metrics/src/main/java/org/apache/ignite/internal/metrics/MetricSource.java
@@ -27,11 +27,7 @@ import org.jetbrains.annotations.Nullable;
  * metrics source.
  */
 public interface MetricSource {
-    /**
-     * Returns metric source name.
-     *
-     * @return Metric source name.
-     */
+    /** Returns metric source name. */
     String name();
 
     /**
@@ -42,9 +38,7 @@ public interface MetricSource {
      */
     @Nullable MetricSet enable();
 
-    /**
-     * Disables metrics for metric source. Nothing happens if the metrics are 
already disabled for this source.
-     */
+    /** Disables metrics for metric source. Nothing happens if the metrics are 
already disabled for this source. */
     void disable();
 
     /**
diff --git 
a/modules/metrics/src/main/java/org/apache/ignite/internal/metrics/sources/JvmMetricSource.java
 
b/modules/metrics/src/main/java/org/apache/ignite/internal/metrics/sources/JvmMetricSource.java
index 01e7abf8b9..d0cbb5f1e1 100644
--- 
a/modules/metrics/src/main/java/org/apache/ignite/internal/metrics/sources/JvmMetricSource.java
+++ 
b/modules/metrics/src/main/java/org/apache/ignite/internal/metrics/sources/JvmMetricSource.java
@@ -34,7 +34,6 @@ import org.jetbrains.annotations.Nullable;
  * Metric source, which provides JVM metrics like memory usage, gc stats etc.
  */
 public class JvmMetricSource implements MetricSource {
-
     /** Source name. */
     private static final String SOURCE_NAME = "jvm";
 
@@ -46,7 +45,7 @@ public class JvmMetricSource implements MetricSource {
 
     private final List<GarbageCollectorMXBean> gcMxBeans;
 
-    /** True, if source is enabled, false otherwise. */
+    /** Enablement status. Accessed from different threads under 
synchronization on this object. */
     private boolean enabled;
 
     /**
@@ -68,15 +67,17 @@ public class JvmMetricSource implements MetricSource {
         gcMxBeans = ManagementFactory.getGarbageCollectorMXBeans();
     }
 
-    /** {@inheritDoc} */
     @Override
     public String name() {
         return SOURCE_NAME;
     }
 
-    /** {@inheritDoc} */
     @Override
     public synchronized @Nullable MetricSet enable() {
+        if (enabled) {
+            return null;
+        }
+
         var metrics = new HashMap<String, Metric>();
 
         CachedMemoryUsage heapMemoryUsage = new 
CachedMemoryUsage(memoryMxBean::getHeapMemoryUsage, MEMORY_USAGE_CACHE_TIMEOUT);
@@ -129,7 +130,7 @@ public class JvmMetricSource implements MetricSource {
                 new LongGauge(
                         "gc.CollectionTime",
                         "Approximate total time spent on garbage collection in 
milliseconds, summed across all collectors.",
-                        () -> totalCollectionTime()
+                        this::totalCollectionTime
                 )
         );
 
@@ -152,13 +153,11 @@ public class JvmMetricSource implements MetricSource {
         return total;
     }
 
-    /** {@inheritDoc} */
     @Override
     public synchronized void disable() {
         enabled = false;
     }
 
-    /** {@inheritDoc} */
     @Override
     public synchronized boolean enabled() {
         return enabled;
diff --git 
a/modules/metrics/src/main/java/org/apache/ignite/internal/metrics/sources/OsMetricSource.java
 
b/modules/metrics/src/main/java/org/apache/ignite/internal/metrics/sources/OsMetricSource.java
index d8cd252141..e8b1aac7aa 100644
--- 
a/modules/metrics/src/main/java/org/apache/ignite/internal/metrics/sources/OsMetricSource.java
+++ 
b/modules/metrics/src/main/java/org/apache/ignite/internal/metrics/sources/OsMetricSource.java
@@ -60,6 +60,10 @@ public class OsMetricSource implements MetricSource {
 
     @Override
     public synchronized @Nullable MetricSet enable() {
+        if (enabled) {
+            return null;
+        }
+
         var metrics = new HashMap<String, Metric>();
 
         metrics.put(
diff --git 
a/modules/metrics/src/test/java/org/apache/ignite/internal/metrics/MetricEntitiesTest.java
 
b/modules/metrics/src/test/java/org/apache/ignite/internal/metrics/MetricEntitiesTest.java
index 864ce2d4af..14bc8d3a9a 100644
--- 
a/modules/metrics/src/test/java/org/apache/ignite/internal/metrics/MetricEntitiesTest.java
+++ 
b/modules/metrics/src/test/java/org/apache/ignite/internal/metrics/MetricEntitiesTest.java
@@ -39,7 +39,7 @@ public class MetricEntitiesTest {
     private static final String SOURCE_NAME = "testSource";
     private static final String SCALAR_METRIC_NAME = "TestScalarMetric";
     private static final String COMPOSITE_METRIC_NAME = "TestCompositeMetric";
-    private static final long[] DISTRIBUTION_BOUNDS = new long[] { 10, 100, 
1000 };
+    private static final long[] DISTRIBUTION_BOUNDS = { 10, 100, 1000 };
 
     @Test
     public void testMetricLifecycle() {
@@ -153,27 +153,27 @@ public class MetricEntitiesTest {
     }
 
     private static class TestMetricSource extends 
AbstractMetricSource<TestMetricSource.Holder> {
-        protected TestMetricSource() {
+        TestMetricSource() {
             super(SOURCE_NAME);
         }
 
-
-        protected TestMetricSource(String name) {
+        TestMetricSource(String name) {
             super(name);
         }
 
-        @Override protected Holder createHolder() {
+        @Override
+        protected Holder createHolder() {
             return new Holder();
         }
 
-        @Override protected void init(MetricSetBuilder bldr, Holder holder) {
-            bldr.register(holder.atomicIntMetric);
-            bldr.register(holder.distributionMetric);
-        }
-
         private static class Holder implements 
AbstractMetricSource.Holder<Holder> {
             final AtomicIntMetric atomicIntMetric = new 
AtomicIntMetric(SCALAR_METRIC_NAME, null);
             final DistributionMetric distributionMetric = new 
DistributionMetric(COMPOSITE_METRIC_NAME, null, DISTRIBUTION_BOUNDS);
+
+            @Override
+            public Iterable<Metric> metrics() {
+                return List.of(atomicIntMetric, distributionMetric);
+            }
         }
     }
 }
diff --git 
a/modules/metrics/src/test/java/org/apache/ignite/internal/metrics/ThreadPoolMetricSource.java
 
b/modules/metrics/src/test/java/org/apache/ignite/internal/metrics/ThreadPoolMetricSource.java
index f33484a786..8168e1f898 100644
--- 
a/modules/metrics/src/test/java/org/apache/ignite/internal/metrics/ThreadPoolMetricSource.java
+++ 
b/modules/metrics/src/test/java/org/apache/ignite/internal/metrics/ThreadPoolMetricSource.java
@@ -19,81 +19,100 @@ package org.apache.ignite.internal.metrics;
 
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
 
+import java.util.List;
 import java.util.concurrent.ThreadPoolExecutor;
 
-/**
- * Metric source for {@link ThreadPoolMetricTest}.
- */
+/** Metric source for {@link ThreadPoolMetricTest}. */
 public class ThreadPoolMetricSource extends 
AbstractMetricSource<ThreadPoolMetricSource.Holder> {
     private final ThreadPoolExecutor exec;
 
     /**
      * Constructor.
      *
-     * @param name Name.
+     * @param name Metric source name.
      * @param exec Executor.
      */
-    public ThreadPoolMetricSource(String name, ThreadPoolExecutor exec) {
+    ThreadPoolMetricSource(String name, ThreadPoolExecutor exec) {
         super(name);
 
         this.exec = exec;
     }
 
-    /** {@inheritDoc} */
-    @Override protected Holder createHolder() {
+    @Override
+    protected Holder createHolder() {
         return new Holder();
     }
 
-    /** {@inheritDoc} */
-    @Override protected void init(MetricSetBuilder bldr, Holder holder) {
-        bldr.intGauge(
+    /** Holder class. */
+    protected class Holder implements AbstractMetricSource.Holder<Holder> {
+        private final IntGauge activeCount = new IntGauge(
                 "ActiveCount",
                 "Approximate number of threads that are actively executing 
tasks.",
                 exec::getActiveCount
         );
 
-        bldr.longGauge(
+        private final LongGauge completedTaskCount = new LongGauge(
                 "CompletedTaskCount",
                 "Approximate total number of tasks that have completed 
execution.",
                 exec::getCompletedTaskCount
         );
 
-        bldr.intGauge("CorePoolSize", "The core number of threads.", 
exec::getCorePoolSize);
+        private final IntGauge corePoolSize = new IntGauge(
+                "CorePoolSize",
+                "The core number of threads.",
+                exec::getCorePoolSize
+        );
 
-        bldr.intGauge(
+        private final IntGauge largestPoolSize = new IntGauge(
                 "LargestPoolSize",
                 "Largest number of threads that have ever simultaneously been 
in the pool.",
                 exec::getLargestPoolSize
         );
 
-        bldr.intGauge(
+        private final IntGauge maximumPoolSize = new IntGauge(
                 "MaximumPoolSize",
                 "The maximum allowed number of threads.",
                 exec::getMaximumPoolSize
         );
 
-        bldr.intGauge("PoolSize", "Current number of threads in the pool.", 
exec::getPoolSize);
+        private final IntGauge poolSize = new IntGauge(
+                "PoolSize",
+                "Current number of threads in the pool.",
+                exec::getPoolSize
+        );
 
-        bldr.longGauge(
+        private final LongGauge taskCount = new LongGauge(
                 "TaskCount",
                 "Approximate total number of tasks that have been scheduled 
for execution.",
                 exec::getTaskCount
         );
 
-        bldr.intGauge("QueueSize", "Current size of the execution queue.", () 
-> exec.getQueue().size());
+        private final IntGauge queueSize = new IntGauge(
+                "QueueSize",
+                "Current size of the execution queue.",
+                () -> exec.getQueue().size()
+        );
 
-        bldr.longGauge(
+        private final LongGauge keepAliveTime = new LongGauge(
                 "KeepAliveTime",
                 "Thread keep-alive time, which is the amount of time which 
threads in excess of "
                         + "the core pool size may remain idle before being 
terminated.",
                 () -> exec.getKeepAliveTime(MILLISECONDS)
         );
-    }
 
-    /**
-     * Holder class.
-     */
-    protected static class Holder implements 
AbstractMetricSource.Holder<Holder> {
-        // No-op.
+        @Override
+        public Iterable<Metric> metrics() {
+            return List.of(
+                    activeCount,
+                    completedTaskCount,
+                    corePoolSize,
+                    largestPoolSize,
+                    maximumPoolSize,
+                    poolSize,
+                    taskCount,
+                    queueSize,
+                    keepAliveTime
+            );
+        }
     }
 }
diff --git 
a/modules/raft/src/main/java/org/apache/ignite/internal/metrics/sources/RaftMetricSource.java
 
b/modules/raft/src/main/java/org/apache/ignite/internal/metrics/sources/RaftMetricSource.java
index ae0deab8c7..da0874f9b5 100644
--- 
a/modules/raft/src/main/java/org/apache/ignite/internal/metrics/sources/RaftMetricSource.java
+++ 
b/modules/raft/src/main/java/org/apache/ignite/internal/metrics/sources/RaftMetricSource.java
@@ -17,7 +17,10 @@
 
 package org.apache.ignite.internal.metrics.sources;
 
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
 import java.util.HashMap;
+import java.util.Map;
 import java.util.stream.LongStream;
 import org.apache.ignite.internal.metrics.DistributionMetric;
 import org.apache.ignite.internal.metrics.Metric;
@@ -29,10 +32,19 @@ import org.jetbrains.annotations.Nullable;
  * Metrics of striped disruptor.
  */
 public class RaftMetricSource implements MetricSource {
-    public static final String SOURCE_NAME = "raft";
+    private static final String SOURCE_NAME = "raft";
 
-    /** True, if source is enabled, false otherwise. */
-    private boolean enabled;
+    private static final VarHandle ENABLED;
+
+    static {
+        try {
+            ENABLED = 
MethodHandles.lookup().findVarHandle(RaftMetricSource.class, "enabled", 
boolean.class);
+        } catch (ReflectiveOperationException e) {
+            throw new ExceptionInInitializerError(e);
+        }
+    }
+
+    private volatile boolean enabled;
 
     /** Disruptor stripe count. */
     private final int stripeCount;
@@ -41,7 +53,7 @@ public class RaftMetricSource implements MetricSource {
     private final int logStripeCount;
 
     /** Metric set. */
-    HashMap<String, Metric> metrics = new HashMap<>();
+    private final Map<String, Metric> metrics;
 
     /**
      * Constructor.
@@ -53,7 +65,7 @@ public class RaftMetricSource implements MetricSource {
         this.stripeCount = stripeCount;
         this.logStripeCount = logStripeCount;
 
-        initMetrics();
+        this.metrics = createMetrics();
     }
 
     @Override
@@ -63,13 +75,17 @@ public class RaftMetricSource implements MetricSource {
 
     @Override
     public @Nullable MetricSet enable() {
-        enabled = true;
+        if (ENABLED.compareAndSet(this, false, true)) {
+            return new MetricSet(SOURCE_NAME, metrics);
+        }
 
-        return new MetricSet(SOURCE_NAME, metrics);
+        return null;
     }
 
-    private void initMetrics() {
-        long[] bounds = new long[]{10L, 20L, 30L, 40L, 50L};
+    private Map<String, Metric> createMetrics() {
+        long[] bounds = {10L, 20L, 30L, 40L, 50L};
+
+        var metrics = new HashMap<String, Metric>();
 
         // jraft-fsmcaller-disruptor
         metrics.put("raft.fsmcaller.disruptor.Batch",
@@ -126,6 +142,8 @@ public class RaftMetricSource implements MetricSource {
                         "The histogram of distribution data by stripes in the 
log for partitions",
                         LongStream.range(0, logStripeCount).toArray()
                 ));
+
+        return metrics;
     }
 
     /**
@@ -143,7 +161,7 @@ public class RaftMetricSource implements MetricSource {
 
     @Override
     public void disable() {
-        enabled = false;
+        ENABLED.compareAndSet(this, false, true);
     }
 
     @Override
@@ -155,10 +173,10 @@ public class RaftMetricSource implements MetricSource {
      * Striped disruptor metrics.
      */
     public class DisruptorMetrics {
-        private DistributionMetric batchSizeHistogramMetric;
-        private DistributionMetric stripeHistogramMetric;
+        private final DistributionMetric batchSizeHistogramMetric;
+        private final DistributionMetric stripeHistogramMetric;
 
-        public DisruptorMetrics(DistributionMetric averageBatchSizeMetric, 
DistributionMetric stripeHistogramMetric) {
+        DisruptorMetrics(DistributionMetric averageBatchSizeMetric, 
DistributionMetric stripeHistogramMetric) {
             this.batchSizeHistogramMetric = averageBatchSizeMetric;
             this.stripeHistogramMetric = stripeHistogramMetric;
         }
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/metrics/SqlClientMetricSource.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/metrics/SqlClientMetricSource.java
index de8869abbf..506d048c89 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/metrics/SqlClientMetricSource.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/metrics/SqlClientMetricSource.java
@@ -17,46 +17,46 @@
 
 package org.apache.ignite.internal.sql.metrics;
 
+import java.util.List;
 import java.util.Objects;
 import java.util.function.IntSupplier;
 import org.apache.ignite.internal.metrics.AbstractMetricSource;
-import org.apache.ignite.internal.metrics.MetricSetBuilder;
+import org.apache.ignite.internal.metrics.IntGauge;
+import org.apache.ignite.internal.metrics.Metric;
 
-/**
- * Source of SQL client metrics.
- */
+/** Source of SQL client metrics. */
 public class SqlClientMetricSource extends 
AbstractMetricSource<SqlClientMetricSource.Holder> {
     public static final String NAME = "sql.client";
     public static final String METRIC_OPEN_CURSORS = "OpenCursors";
-    private final IntSupplier numberOfOpenCursors;
+    private final IntSupplier numberOfOpenCursorsSupplier;
 
     /**
      * Constructor.
      *
-     * @param numberOfOpenCursors Integer supplier provides current number of 
open cursors.
+     * @param numberOfOpenCursorsSupplier Integer supplier provides current 
number of open cursors.
      */
-    public SqlClientMetricSource(IntSupplier numberOfOpenCursors) {
+    public SqlClientMetricSource(IntSupplier numberOfOpenCursorsSupplier) {
         super(NAME);
 
-        assert Objects.nonNull(numberOfOpenCursors);
-        this.numberOfOpenCursors = numberOfOpenCursors;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    protected void init(MetricSetBuilder bldr, Holder holder) {
-        bldr.intGauge(METRIC_OPEN_CURSORS, "Number of current open cursors", 
numberOfOpenCursors);
+        this.numberOfOpenCursorsSupplier = 
Objects.requireNonNull(numberOfOpenCursorsSupplier);
     }
 
-    /** {@inheritDoc} */
     @Override
     protected Holder createHolder() {
         return new Holder();
     }
 
-    /**
-     * Holder.
-     */
-    protected static class Holder implements 
AbstractMetricSource.Holder<Holder> {
+    /** Holder. */
+    protected class Holder implements AbstractMetricSource.Holder<Holder> {
+        private final IntGauge numberOfOpenCursors = new IntGauge(
+                METRIC_OPEN_CURSORS,
+                "Number of current open cursors",
+                numberOfOpenCursorsSupplier
+        );
+
+        @Override
+        public Iterable<Metric> metrics() {
+            return List.of(numberOfOpenCursors);
+        }
     }
 }
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/metrics/SqlPlanCacheMetricSource.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/metrics/SqlPlanCacheMetricSource.java
index 05c53d88fe..9e63d6eaac 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/metrics/SqlPlanCacheMetricSource.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/metrics/SqlPlanCacheMetricSource.java
@@ -17,14 +17,13 @@
 
 package org.apache.ignite.internal.sql.metrics;
 
+import java.util.List;
 import org.apache.ignite.internal.metrics.AbstractMetricSource;
 import org.apache.ignite.internal.metrics.AtomicLongMetric;
-import org.apache.ignite.internal.metrics.MetricSetBuilder;
+import org.apache.ignite.internal.metrics.Metric;
 import org.apache.ignite.internal.sql.engine.util.cache.StatsCounter;
 
-/**
- * Metric source, which provides SQL plan cache metrics.
- */
+/** Metric source, which provides SQL plan cache metrics. */
 public class SqlPlanCacheMetricSource extends 
AbstractMetricSource<SqlPlanCacheMetricSource.Holder> implements StatsCounter {
     public static final String NAME = "sql.plan.cache";
 
@@ -51,24 +50,19 @@ public class SqlPlanCacheMetricSource extends 
AbstractMetricSource<SqlPlanCacheM
         }
     }
 
-    /** {@inheritDoc} */
-    @Override
-    protected void init(MetricSetBuilder bldr, Holder holder) {
-        bldr.register(holder.cachePlanHits);
-        bldr.register(holder.cachePlanMisses);
-    }
-
-    /** {@inheritDoc} */
     @Override
     protected Holder createHolder() {
         return new Holder();
     }
 
-    /**
-     * Holder.
-     */
+    /** Holder. */
     protected static class Holder implements 
AbstractMetricSource.Holder<Holder> {
         private final AtomicLongMetric cachePlanHits = new 
AtomicLongMetric("Hits", "Cache plan hits");
         private final AtomicLongMetric cachePlanMisses = new 
AtomicLongMetric("Misses", "Cache plan misses");
+
+        @Override
+        public Iterable<Metric> metrics() {
+            return List.of(cachePlanHits, cachePlanMisses);
+        }
     }
 }


Reply via email to