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);
+ }
}
}