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

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


The following commit(s) were added to refs/heads/master by this push:
     new 0af17321c89 IGNITE-28819 [3/N] Thin client implementation extraction 
(#13338)
0af17321c89 is described below

commit 0af17321c89fc58a01320f9fe3201cd67ecbb1aa
Author: Nikolay <[email protected]>
AuthorDate: Wed Jul 8 17:56:02 2026 +0300

    IGNITE-28819 [3/N] Thin client implementation extraction (#13338)
---
 .../ignite/internal/processors/tracing/MTC.java    |   0
 .../internal/processors/tracing/NoopSpan.java      |   0
 .../processors/tracing/NoopSpanManager.java}       |  30 +---
 .../ignite/internal/processors/tracing/Span.java   |   0
 .../internal/processors/tracing/SpanManager.java   |   7 +
 .../internal/processors/tracing/SpanTags.java      |   0
 .../internal/processors/tracing/SpanType.java      |   0
 .../processors/tracing/messages/SpanTransport.java |   0
 .../java/org/apache/ignite/spi/tracing/Scope.java  |   0
 .../org/apache/ignite/spi/tracing/SpanStatus.java  |   0
 .../GridNioClientConnectionMultiplexer.java        |   3 +-
 .../managers/tracing/GridTracingManager.java       |   7 +
 .../processors/odbc/ClientListenerProcessor.java   |  12 +-
 .../rest/protocols/tcp/GridTcpRestProtocol.java    |  17 ++-
 .../internal/processors/tracing/NoopTracing.java   |  29 +---
 .../apache/ignite/internal/util/IgniteUtils.java   |  70 +++++++++
 .../ignite/internal/util/nio/GridNioServer.java    | 164 ++++++++++++---------
 .../internal/util/nio/GridNioTracerFilter.java     |  10 +-
 .../util/nio/GridSelectorNioSessionImpl.java       |  60 ++++----
 .../internal/util/nio/ssl/GridNioSslFilter.java    |  31 ++--
 .../tcp/TcpCommunicationMetricsListener.java       |  19 +++
 .../spi/communication/tcp/TcpCommunicationSpi.java |   5 +-
 .../tcp/internal/GridNioServerWrapper.java         |  20 ++-
 .../internal/util/nio/GridNioSslSelfTest.java      |   2 +-
 24 files changed, 288 insertions(+), 198 deletions(-)

diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/MTC.java
 
b/modules/commons/src/main/java/org/apache/ignite/internal/processors/tracing/MTC.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/MTC.java
rename to 
modules/commons/src/main/java/org/apache/ignite/internal/processors/tracing/MTC.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/NoopSpan.java
 
b/modules/commons/src/main/java/org/apache/ignite/internal/processors/tracing/NoopSpan.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/NoopSpan.java
rename to 
modules/commons/src/main/java/org/apache/ignite/internal/processors/tracing/NoopSpan.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/NoopTracing.java
 
b/modules/commons/src/main/java/org/apache/ignite/internal/processors/tracing/NoopSpanManager.java
similarity index 65%
copy from 
modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/NoopTracing.java
copy to 
modules/commons/src/main/java/org/apache/ignite/internal/processors/tracing/NoopSpanManager.java
index 77563757c57..0d948b5d41f 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/NoopTracing.java
+++ 
b/modules/commons/src/main/java/org/apache/ignite/internal/processors/tracing/NoopSpanManager.java
@@ -17,35 +17,17 @@
 
 package org.apache.ignite.internal.processors.tracing;
 
-import 
org.apache.ignite.internal.processors.tracing.configuration.NoopTracingConfigurationManager;
-import 
org.apache.ignite.internal.processors.tracing.messages.TraceableMessagesHandler;
-import org.apache.ignite.logger.NullLogger;
-import org.apache.ignite.spi.tracing.TracingConfigurationManager;
+import org.apache.ignite.plugin.extensions.communication.Message;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
 /**
- * Noop implementation of {@link Tracing}.
+ * Noop implementation of {@link SpanManager}.
  */
-public class NoopTracing implements Tracing {
+public class NoopSpanManager implements SpanManager {
     /** Noop serialized span. */
     public static final byte[] NOOP_SERIALIZED_SPAN = new byte[0];
 
-    /** Traceable messages handler. */
-    private final TraceableMessagesHandler msgHnd;
-
-    /**
-     * Constructor.
-     */
-    public NoopTracing() {
-        msgHnd = new TraceableMessagesHandler(this, new NullLogger());
-    }
-
-    /** {@inheritDoc} */
-    @Override public TraceableMessagesHandler messages() {
-        return msgHnd;
-    }
-
     /** {@inheritDoc} */
     @Override public Span create(@NotNull SpanType spanType, @Nullable Span 
parentSpan) {
         return NoopSpan.INSTANCE;
@@ -60,7 +42,7 @@ public class NoopTracing implements Tracing {
     @Override public @NotNull Span create(
         @NotNull SpanType spanType,
         @Nullable Span parentSpan,
-        @Nullable String label) {
+        @Nullable String lb) {
         return NoopSpan.INSTANCE;
     }
 
@@ -70,7 +52,7 @@ public class NoopTracing implements Tracing {
     }
 
     /** {@inheritDoc} */
-    @Override public @NotNull TracingConfigurationManager configuration() {
-        return NoopTracingConfigurationManager.INSTANCE;
+    @Override public String traceName(Message msg) {
+        return null;
     }
 }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/Span.java
 
b/modules/commons/src/main/java/org/apache/ignite/internal/processors/tracing/Span.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/Span.java
rename to 
modules/commons/src/main/java/org/apache/ignite/internal/processors/tracing/Span.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/SpanManager.java
 
b/modules/commons/src/main/java/org/apache/ignite/internal/processors/tracing/SpanManager.java
similarity index 89%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/SpanManager.java
rename to 
modules/commons/src/main/java/org/apache/ignite/internal/processors/tracing/SpanManager.java
index 010506dca39..be43ec4cabb 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/SpanManager.java
+++ 
b/modules/commons/src/main/java/org/apache/ignite/internal/processors/tracing/SpanManager.java
@@ -17,6 +17,7 @@
 
 package org.apache.ignite.internal.processors.tracing;
 
+import org.apache.ignite.plugin.extensions.communication.Message;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
@@ -70,4 +71,10 @@ public interface SpanManager {
      * @param span Span.
      */
     byte[] serialize(@NotNull Span span);
+
+    /**
+     * @param msg Message to resolve a trace name for.
+     * @return Trace name of the message, or {@code null} if tracing is 
disabled.
+     */
+    @Nullable String traceName(Message msg);
 }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/SpanTags.java
 
b/modules/commons/src/main/java/org/apache/ignite/internal/processors/tracing/SpanTags.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/SpanTags.java
rename to 
modules/commons/src/main/java/org/apache/ignite/internal/processors/tracing/SpanTags.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/SpanType.java
 
b/modules/commons/src/main/java/org/apache/ignite/internal/processors/tracing/SpanType.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/SpanType.java
rename to 
modules/commons/src/main/java/org/apache/ignite/internal/processors/tracing/SpanType.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/messages/SpanTransport.java
 
b/modules/commons/src/main/java/org/apache/ignite/internal/processors/tracing/messages/SpanTransport.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/messages/SpanTransport.java
rename to 
modules/commons/src/main/java/org/apache/ignite/internal/processors/tracing/messages/SpanTransport.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/spi/tracing/Scope.java 
b/modules/commons/src/main/java/org/apache/ignite/spi/tracing/Scope.java
similarity index 100%
rename from modules/core/src/main/java/org/apache/ignite/spi/tracing/Scope.java
rename to modules/commons/src/main/java/org/apache/ignite/spi/tracing/Scope.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/spi/tracing/SpanStatus.java 
b/modules/commons/src/main/java/org/apache/ignite/spi/tracing/SpanStatus.java
similarity index 100%
rename from 
modules/core/src/main/java/org/apache/ignite/spi/tracing/SpanStatus.java
rename to 
modules/commons/src/main/java/org/apache/ignite/spi/tracing/SpanStatus.java
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/io/gridnioserver/GridNioClientConnectionMultiplexer.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/io/gridnioserver/GridNioClientConnectionMultiplexer.java
index a26a6f2dac7..a1505e9c7f1 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/io/gridnioserver/GridNioClientConnectionMultiplexer.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/io/gridnioserver/GridNioClientConnectionMultiplexer.java
@@ -43,6 +43,7 @@ import org.apache.ignite.internal.util.nio.GridNioFilter;
 import org.apache.ignite.internal.util.nio.GridNioServer;
 import org.apache.ignite.internal.util.nio.GridNioSession;
 import org.apache.ignite.internal.util.nio.ssl.GridNioSslFilter;
+import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.logger.NullLogger;
 
 /**
@@ -82,7 +83,7 @@ public class GridNioClientConnectionMultiplexer implements 
ClientConnectionMulti
         sslCtx = ClientSslUtils.getSslContext(cfg);
 
         if (sslCtx != null) {
-            GridNioSslFilter sslFilter = new GridNioSslFilter(sslCtx, true, 
ByteOrder.nativeOrder(), gridLog, null);
+            GridNioSslFilter sslFilter = U.sslFilter(sslCtx, true, 
ByteOrder.nativeOrder(), gridLog, null);
             sslFilter.directMode(false);
             filters = new GridNioFilter[] {codecFilter, sslFilter};
         }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/managers/tracing/GridTracingManager.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/managers/tracing/GridTracingManager.java
index 4e5e66e6924..4e087102488 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/managers/tracing/GridTracingManager.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/managers/tracing/GridTracingManager.java
@@ -34,8 +34,10 @@ import 
org.apache.ignite.internal.processors.tracing.SpanType;
 import org.apache.ignite.internal.processors.tracing.Tracing;
 import 
org.apache.ignite.internal.processors.tracing.configuration.GridTracingConfigurationManager;
 import 
org.apache.ignite.internal.processors.tracing.messages.TraceableMessagesHandler;
+import 
org.apache.ignite.internal.processors.tracing.messages.TraceableMessagesTable;
 import org.apache.ignite.internal.util.typedef.internal.LT;
 import org.apache.ignite.logger.NullLogger;
+import org.apache.ignite.plugin.extensions.communication.Message;
 import org.apache.ignite.spi.IgniteSpiException;
 import org.apache.ignite.spi.tracing.NoopTracingSpi;
 import org.apache.ignite.spi.tracing.Scope;
@@ -507,6 +509,11 @@ public class GridTracingManager extends 
GridManagerAdapter<TracingSpi> implement
         }
     }
 
+    /** {@inheritDoc} */
+    @Override public String traceName(Message msg) {
+        return TraceableMessagesTable.traceName(msg);
+    }
+
     /** {@inheritDoc} */
     @Override public TraceableMessagesHandler messages() {
         // Optimization for noop spi.
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/ClientListenerProcessor.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/ClientListenerProcessor.java
index 68af9dfe14a..808437eb171 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/ClientListenerProcessor.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/ClientListenerProcessor.java
@@ -194,7 +194,7 @@ public class ClientListenerProcessor extends 
GridProcessorAdapter {
 
                 for (int port = cliConnCfg.getPort(); port <= portTo && port 
<= 65535; port++) {
                     try {
-                        srv = GridNioServer.<ClientMessage>builder()
+                        GridNioServer.Builder<ClientMessage> builder = 
GridNioServer.<ClientMessage>builder()
                             .address(hostAddr)
                             .port(port)
                             .listener(new ClientListenerNioListener(ctx, 
busyLock, cliConnCfg, metrics, newConnEnabled))
@@ -210,9 +210,11 @@ public class ClientListenerProcessor extends 
GridProcessorAdapter {
                             .filters(filters)
                             .directMode(true)
                             .idleTimeout(idleTimeout > 0 ? idleTimeout : 
Long.MAX_VALUE)
-                            .metricRegistry(mreg)
-                            .messageQueueSizeListener(msgQueueSizeLsnr)
-                            .build();
+                            .messageQueueSizeListener(msgQueueSizeLsnr);
+
+                        srv = U.setNioServerMetrics(builder, mreg).build();
+
+                        U.registerNioServerMetrics(srv, filters, mreg);
 
                         ctx.ports().registerPort(port, IgnitePortProtocol.TCP, 
getClass());
 
@@ -492,7 +494,7 @@ public class ClientListenerProcessor extends 
GridProcessorAdapter {
                 throw new IgniteCheckedException("Failed to create client 
listener " +
                     "(SSL is enabled but factory is null). Check the 
ClientConnectorConfiguration");
 
-            GridNioSslFilter sslFilter = new 
GridNioSslFilter(sslCtxFactory.create(),
+            GridNioSslFilter sslFilter = U.sslFilter(sslCtxFactory.create(),
                 true, ByteOrder.nativeOrder(), log, 
ctx.metric().registry(CLIENT_CONNECTOR_METRICS));
 
             sslFilter.directMode(true);
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/protocols/tcp/GridTcpRestProtocol.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/protocols/tcp/GridTcpRestProtocol.java
index a1aaa0910dd..d8825397806 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/protocols/tcp/GridTcpRestProtocol.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/protocols/tcp/GridTcpRestProtocol.java
@@ -36,6 +36,7 @@ import 
org.apache.ignite.internal.client.marshaller.GridClientMarshaller;
 import 
org.apache.ignite.internal.client.marshaller.jdk.GridClientJdkMarshaller;
 import 
org.apache.ignite.internal.client.marshaller.optimized.GridClientOptimizedMarshaller;
 import 
org.apache.ignite.internal.client.marshaller.optimized.GridClientZipOptimizedMarshaller;
+import org.apache.ignite.internal.processors.metric.MetricRegistryImpl;
 import org.apache.ignite.internal.processors.rest.GridRestProtocolHandler;
 import 
org.apache.ignite.internal.processors.rest.client.message.GridClientMessage;
 import 
org.apache.ignite.internal.processors.rest.protocols.GridRestProtocolAdapter;
@@ -208,13 +209,15 @@ public class GridTcpRestProtocol extends 
GridRestProtocolAdapter {
 
             GridNioFilter[] filters;
 
+            MetricRegistryImpl mreg = 
ctx.metric().registry(REST_CONNECTOR_METRIC_REGISTRY_NAME);
+
             if (sslCtx != null) {
-                GridNioSslFilter sslFilter = new GridNioSslFilter(
+                GridNioSslFilter sslFilter = U.sslFilter(
                     sslCtx,
                     cfg.isDirectBuffer(),
                     ByteOrder.nativeOrder(),
                     log,
-                    
ctx.metric().registry(REST_CONNECTOR_METRIC_REGISTRY_NAME));
+                    mreg);
 
                 sslFilter.directMode(false);
 
@@ -232,7 +235,7 @@ public class GridTcpRestProtocol extends 
GridRestProtocolAdapter {
             else
                 filters = new GridNioFilter[] { codec };
 
-            srv = GridNioServer.<GridClientMessage>builder()
+            GridNioServer.Builder<GridClientMessage> builder = 
GridNioServer.<GridClientMessage>builder()
                 .address(hostAddr)
                 .port(port)
                 .listener(lsnr)
@@ -247,9 +250,11 @@ public class GridTcpRestProtocol extends 
GridRestProtocolAdapter {
                 .socketReceiveBufferSize(cfg.getReceiveBufferSize())
                 .sendQueueLimit(cfg.getSendQueueLimit())
                 .filters(filters)
-                .directMode(false)
-                
.metricRegistry(ctx.metric().registry(REST_CONNECTOR_METRIC_REGISTRY_NAME))
-                .build();
+                .directMode(false);
+
+            srv = U.setNioServerMetrics(builder, mreg).build();
+
+            U.registerNioServerMetrics(srv, filters, mreg);
 
             srv.idleTimeout(cfg.getIdleTimeout());
 
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/NoopTracing.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/NoopTracing.java
index 77563757c57..c7cd10f5626 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/NoopTracing.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/NoopTracing.java
@@ -22,15 +22,11 @@ import 
org.apache.ignite.internal.processors.tracing.messages.TraceableMessagesH
 import org.apache.ignite.logger.NullLogger;
 import org.apache.ignite.spi.tracing.TracingConfigurationManager;
 import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
 
 /**
  * Noop implementation of {@link Tracing}.
  */
-public class NoopTracing implements Tracing {
-    /** Noop serialized span. */
-    public static final byte[] NOOP_SERIALIZED_SPAN = new byte[0];
-
+public class NoopTracing extends NoopSpanManager implements Tracing {
     /** Traceable messages handler. */
     private final TraceableMessagesHandler msgHnd;
 
@@ -46,29 +42,6 @@ public class NoopTracing implements Tracing {
         return msgHnd;
     }
 
-    /** {@inheritDoc} */
-    @Override public Span create(@NotNull SpanType spanType, @Nullable Span 
parentSpan) {
-        return NoopSpan.INSTANCE;
-    }
-
-    /** {@inheritDoc} */
-    @Override public Span create(@NotNull SpanType spanType, @Nullable byte[] 
serializedParentSpan) {
-        return NoopSpan.INSTANCE;
-    }
-
-    /** {@inheritDoc} */
-    @Override public @NotNull Span create(
-        @NotNull SpanType spanType,
-        @Nullable Span parentSpan,
-        @Nullable String label) {
-        return NoopSpan.INSTANCE;
-    }
-
-    /** {@inheritDoc} */
-    @Override public byte[] serialize(@NotNull Span span) {
-        return NOOP_SERIALIZED_SPAN;
-    }
-
     /** {@inheritDoc} */
     @Override public @NotNull TracingConfigurationManager configuration() {
         return NoopTracingConfigurationManager.INSTANCE;
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java 
b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
index 8c2f934aa4f..2223082eca0 100755
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
@@ -114,6 +114,7 @@ import java.util.concurrent.atomic.AtomicReference;
 import java.util.concurrent.locks.Condition;
 import java.util.concurrent.locks.ReadWriteLock;
 import java.util.function.Consumer;
+import java.util.function.LongConsumer;
 import java.util.jar.JarFile;
 import java.util.logging.ConsoleHandler;
 import java.util.logging.Handler;
@@ -134,6 +135,7 @@ import javax.management.MalformedObjectNameException;
 import javax.management.ObjectName;
 import javax.net.ssl.HostnameVerifier;
 import javax.net.ssl.HttpsURLConnection;
+import javax.net.ssl.SSLContext;
 import javax.net.ssl.SSLSession;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCheckedException;
@@ -186,6 +188,7 @@ import 
org.apache.ignite.internal.processors.cache.CacheDefaultBinaryAffinityKey
 import org.apache.ignite.internal.processors.cache.CacheObjectContext;
 import org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
 import 
org.apache.ignite.internal.processors.cache.IgnitePeerToPeerClassLoadingException;
+import org.apache.ignite.internal.processors.metric.MetricRegistryImpl;
 import 
org.apache.ignite.internal.transactions.IgniteTxHeuristicCheckedException;
 import 
org.apache.ignite.internal.transactions.IgniteTxOptimisticCheckedException;
 import 
org.apache.ignite.internal.transactions.IgniteTxRollbackCheckedException;
@@ -194,6 +197,9 @@ import 
org.apache.ignite.internal.util.future.GridFutureAdapter;
 import org.apache.ignite.internal.util.future.IgniteFutureImpl;
 import org.apache.ignite.internal.util.lang.GridPeerDeployAware;
 import org.apache.ignite.internal.util.lang.IgniteThrowableFunction;
+import org.apache.ignite.internal.util.nio.GridNioFilter;
+import org.apache.ignite.internal.util.nio.GridNioServer;
+import org.apache.ignite.internal.util.nio.ssl.GridNioSslFilter;
 import org.apache.ignite.internal.util.typedef.C1;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.G;
@@ -7880,4 +7886,68 @@ public abstract class IgniteUtils extends CommonUtils {
         return msg instanceof SecurityAwareCustomMessageWrapper ?
             ((SecurityAwareCustomMessageWrapper)msg).delegate() : 
(DiscoveryCustomMessage)msg;
     }
+
+    /**
+     * Sets the received/sent bytes and per-session queue-size metric 
consumers on the given NIO server builder,
+     * creating the underlying metrics in the provided registry.
+     *
+     * @param builder NIO server builder.
+     * @param mreg Metric registry.
+     * @return The given builder for chaining.
+     */
+    public static <T> GridNioServer.Builder<T> 
setNioServerMetrics(GridNioServer.Builder<T> builder, MetricRegistryImpl mreg) {
+        return builder
+            .receivedBytesMetric(mreg.longAdderMetric(
+                GridNioServer.RECEIVED_BYTES_METRIC_NAME, 
GridNioServer.RECEIVED_BYTES_METRIC_DESC)::add)
+            .sentBytesMetric(mreg.longAdderMetric(
+                GridNioServer.SENT_BYTES_METRIC_NAME, 
GridNioServer.SENT_BYTES_METRIC_DESC)::add)
+            .outboundMessagesQueueSizeMetric(mreg.longAdderMetric(
+                GridNioServer.OUTBOUND_MESSAGES_QUEUE_SIZE_METRIC_NAME,
+                GridNioServer.OUTBOUND_MESSAGES_QUEUE_SIZE_METRIC_DESC)::add)
+            .maxMessagesQueueSizeMetric(mreg.maxValueMetric(
+                GridNioServer.MAX_MESSAGES_QUEUE_SIZE_METRIC_NAME,
+                GridNioServer.MAX_MESSAGES_QUEUE_SIZE_METRIC_DESC, 60_000, 
5)::update);
+    }
+
+    /**
+     * Registers the active TCP sessions count metric in the given registry, 
backed by the NIO server.
+     *
+     * @param srv NIO server.
+     * @param mreg Metric registry.
+     */
+    public static void registerNioServerMetrics(GridNioServer<?> srv, 
GridNioFilter[] filters, MetricRegistryImpl mreg) {
+        boolean sslEnabled = Arrays.stream(filters).anyMatch(filter -> filter 
instanceof GridNioSslFilter);
+
+        mreg.register(GridNioServer.SSL_ENABLED_METRIC_NAME, () -> sslEnabled, 
"Whether SSL is enabled");
+        mreg.register(GridNioServer.SESSIONS_CNT_METRIC_NAME, 
srv::activeTcpSessionsCount, "Active TCP sessions count.");
+    }
+
+    /**
+     * Creates an SSL NIO filter, wiring its metrics from the given registry.
+     *
+     * @param sslCtx SSL context.
+     * @param directBuf Direct buffer flag.
+     * @param order Byte order.
+     * @param log Logger to use.
+     * @param mreg Optional metric registry; if {@code null}, the filter is 
created without metrics.
+     * @return SSL NIO filter.
+     */
+    public static GridNioSslFilter sslFilter(
+        SSLContext sslCtx,
+        boolean directBuf,
+        ByteOrder order,
+        IgniteLogger log,
+        @Nullable MetricRegistryImpl mreg
+    ) {
+        LongConsumer handshakeDuration = mreg == null ? null : mreg.histogram(
+            GridNioSslFilter.SSL_HANDSHAKE_DURATION_HISTOGRAM_METRIC_NAME,
+            new long[] {250, 500, 1000},
+            "SSL handshake duration in milliseconds.")::value;
+
+        Runnable rejectedSesCnt = mreg == null ? null : mreg.intMetric(
+            GridNioSslFilter.SSL_REJECTED_SESSIONS_CNT_METRIC_NAME,
+            "TCP sessions count that were rejected due to SSL 
errors.")::increment;
+
+        return new GridNioSslFilter(sslCtx, directBuf, order, log, 
handshakeDuration, rejectedSesCnt);
+    }
 }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioServer.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioServer.java
index 797290677db..2668427f424 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioServer.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioServer.java
@@ -47,6 +47,7 @@ import java.util.Set;
 import java.util.concurrent.ConcurrentLinkedQueue;
 import java.util.concurrent.ThreadLocalRandom;
 import java.util.concurrent.atomic.AtomicLong;
+import java.util.function.LongConsumer;
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.IgniteException;
 import org.apache.ignite.IgniteLogger;
@@ -55,17 +56,15 @@ import 
org.apache.ignite.configuration.ConnectorConfiguration;
 import org.apache.ignite.internal.IgniteInternalFuture;
 import org.apache.ignite.internal.IgniteInterruptedCheckedException;
 import org.apache.ignite.internal.managers.communication.GridIoMessage;
-import org.apache.ignite.internal.processors.metric.MetricRegistryImpl;
-import org.apache.ignite.internal.processors.metric.impl.LongAdderMetric;
 import org.apache.ignite.internal.processors.odbc.ClientMessage;
 import org.apache.ignite.internal.processors.tracing.MTC;
 import org.apache.ignite.internal.processors.tracing.MTC.TraceSurroundings;
 import org.apache.ignite.internal.processors.tracing.NoopSpan;
-import org.apache.ignite.internal.processors.tracing.NoopTracing;
+import org.apache.ignite.internal.processors.tracing.NoopSpanManager;
 import org.apache.ignite.internal.processors.tracing.Span;
+import org.apache.ignite.internal.processors.tracing.SpanManager;
 import org.apache.ignite.internal.processors.tracing.SpanTags;
 import org.apache.ignite.internal.processors.tracing.SpanType;
-import org.apache.ignite.internal.processors.tracing.Tracing;
 import org.apache.ignite.internal.util.GridConcurrentHashSet;
 import org.apache.ignite.internal.util.GridUnsafe;
 import org.apache.ignite.internal.util.future.GridCompoundFuture;
@@ -97,7 +96,6 @@ import static 
org.apache.ignite.failure.FailureType.CRITICAL_ERROR;
 import static org.apache.ignite.failure.FailureType.SYSTEM_WORKER_TERMINATION;
 import static 
org.apache.ignite.internal.processors.tracing.SpanTags.SOCKET_WRITE_BYTES;
 import static 
org.apache.ignite.internal.processors.tracing.SpanType.COMMUNICATION_SOCKET_WRITE;
-import static 
org.apache.ignite.internal.processors.tracing.messages.TraceableMessagesTable.traceName;
 import static 
org.apache.ignite.internal.util.nio.GridNioSessionMetaKey.MSG_WRITER;
 import static 
org.apache.ignite.internal.util.nio.GridNioSessionMetaKey.NIO_OPERATION;
 
@@ -251,17 +249,17 @@ public class GridNioServer<T> {
     /** Whether direct mode is used. */
     private final boolean directMode;
 
-    /** */
-    @Nullable private final MetricRegistryImpl mreg;
-
     /** Received bytes count metric. */
-    @Nullable private final LongAdderMetric rcvdBytesCntMetric;
+    @Nullable private final LongConsumer rcvdBytesCntMetric;
 
     /** Sent bytes count metric. */
-    @Nullable private final LongAdderMetric sentBytesCntMetric;
+    @Nullable private final LongConsumer sentBytesCntMetric;
 
     /** Outbound messages queue size. */
-    @Nullable private final LongAdderMetric outboundMessagesQueueSizeMetric;
+    @Nullable private final LongConsumer outboundMessagesQueueSizeMetric;
+
+    /** Per-session maximum outbound messages queue size metric. */
+    @Nullable private final LongConsumer maxMessagesQueueSizeMetric;
 
     /** Sessions. */
     private final GridConcurrentHashSet<GridSelectorNioSessionImpl> sessions = 
new GridConcurrentHashSet<>();
@@ -295,8 +293,8 @@ public class GridNioServer<T> {
      */
     private final boolean readWriteSelectorsAssign;
 
-    /** Tracing processor. */
-    private Tracing tracing;
+    /** Span manager. */
+    private SpanManager tracing;
 
     /** Message factory. */
     private final MessageFactory msgFactory;
@@ -325,7 +323,10 @@ public class GridNioServer<T> {
      * @param msgQueueLsnr Message queue size listener.
      * @param readWriteSelectorsAssign If {@code true} then in/out connections 
are assigned to even/odd workers.
      * @param workerLsnr Worker lifecycle listener.
-     * @param mreg Metrics registry.
+     * @param rcvdBytesCntMetric Received bytes count metric, or {@code null} 
if metrics disabled.
+     * @param sentBytesCntMetric Sent bytes count metric, or {@code null} if 
metrics disabled.
+     * @param outboundMessagesQueueSizeMetric Per-session outbound messages 
queue size metric, or {@code null} if metrics disabled.
+     * @param maxMessagesQueueSizeMetric Per-session maximum outbound messages 
queue size metric, or {@code null} if metrics disabled.
      * @param filters Filters for this server.
      * @throws IgniteCheckedException If failed.
      */
@@ -351,8 +352,11 @@ public class GridNioServer<T> {
         IgniteBiInClosure<GridNioSession, Integer> msgQueueLsnr,
         boolean readWriteSelectorsAssign,
         @Nullable GridWorkerListener workerLsnr,
-        @Nullable MetricRegistryImpl mreg,
-        Tracing tracing,
+        @Nullable LongConsumer rcvdBytesCntMetric,
+        @Nullable LongConsumer sentBytesCntMetric,
+        @Nullable LongConsumer outboundMessagesQueueSizeMetric,
+        @Nullable LongConsumer maxMessagesQueueSizeMetric,
+        SpanManager tracing,
         MessageFactory msgFactory,
         GridNioFilter... filters
     ) throws IgniteCheckedException {
@@ -380,7 +384,11 @@ public class GridNioServer<T> {
         this.selectorSpins = selectorSpins;
         this.readWriteSelectorsAssign = readWriteSelectorsAssign;
         this.lsnr = lsnr;
-        this.tracing = tracing == null ? new NoopTracing() : tracing;
+        this.rcvdBytesCntMetric = rcvdBytesCntMetric;
+        this.sentBytesCntMetric = sentBytesCntMetric;
+        this.outboundMessagesQueueSizeMetric = outboundMessagesQueueSizeMetric;
+        this.maxMessagesQueueSizeMetric = maxMessagesQueueSizeMetric;
+        this.tracing = tracing == null ? new NoopSpanManager() : tracing;
         this.msgFactory = msgFactory;
 
         filterChain = new GridNioFilterChain<>(log, lsnr, new HeadFilter(), 
filters);
@@ -461,27 +469,13 @@ public class GridNioServer<T> {
         }
 
         this.balancer = balancer0;
+    }
 
-        this.mreg = mreg;
-
-        rcvdBytesCntMetric = mreg == null ?
-            null : mreg.longAdderMetric(RECEIVED_BYTES_METRIC_NAME, 
RECEIVED_BYTES_METRIC_DESC);
-
-        sentBytesCntMetric = mreg == null ?
-            null : mreg.longAdderMetric(SENT_BYTES_METRIC_NAME, 
SENT_BYTES_METRIC_DESC);
-
-        outboundMessagesQueueSizeMetric = mreg == null ? null : 
mreg.longAdderMetric(
-            OUTBOUND_MESSAGES_QUEUE_SIZE_METRIC_NAME,
-            OUTBOUND_MESSAGES_QUEUE_SIZE_METRIC_DESC
-        );
-
-        if (mreg != null) {
-            mreg.register(SESSIONS_CNT_METRIC_NAME, sessions::size, "Active 
TCP sessions count.");
-
-            boolean sslEnabled = Arrays.stream(filters).anyMatch(filter -> 
filter instanceof GridNioSslFilter);
-
-            mreg.register(SSL_ENABLED_METRIC_NAME, () -> sslEnabled, "Whether 
SSL is enabled");
-        }
+    /**
+     * @return Number of active TCP sessions.
+     */
+    public int activeTcpSessionsCount() {
+        return sessions.size();
     }
 
     /**
@@ -1249,7 +1243,7 @@ public class GridNioServer<T> {
                 log.trace("Bytes received [sockCh=" + sockCh + ", cnt=" + cnt 
+ ']');
 
             if (rcvdBytesCntMetric != null)
-                rcvdBytesCntMetric.add(cnt);
+                rcvdBytesCntMetric.accept(cnt);
 
             ses.bytesReceived(cnt);
 
@@ -1316,7 +1310,7 @@ public class GridNioServer<T> {
                         span.addTag(SOCKET_WRITE_BYTES, () -> 
Integer.toString(cnt));
 
                         if (sentBytesCntMetric != null)
-                            sentBytesCntMetric.add(cnt);
+                            sentBytesCntMetric.accept(cnt);
 
                         ses.bytesSent(cnt);
                     }
@@ -1418,7 +1412,7 @@ public class GridNioServer<T> {
                 return;
 
             if (rcvdBytesCntMetric != null)
-                rcvdBytesCntMetric.add(cnt);
+                rcvdBytesCntMetric.accept(cnt);
 
             ses.bytesReceived(cnt);
             onRead(cnt);
@@ -1491,7 +1485,7 @@ public class GridNioServer<T> {
                     int cnt = sockCh.write(sslNetBuf);
 
                     if (sentBytesCntMetric != null)
-                        sentBytesCntMetric.add(cnt);
+                        sentBytesCntMetric.accept(cnt);
 
                     ses.bytesSent(cnt);
 
@@ -1578,7 +1572,7 @@ public class GridNioServer<T> {
                             log.trace("Bytes sent [sockCh=" + sockCh + ", 
cnt=" + cnt + ']');
 
                         if (sentBytesCntMetric != null)
-                            sentBytesCntMetric.add(cnt);
+                            sentBytesCntMetric.accept(cnt);
 
                         ses.bytesSent(cnt);
                     }
@@ -1636,7 +1630,7 @@ public class GridNioServer<T> {
             Span span = tracing.create(SpanType.COMMUNICATION_SOCKET_WRITE, 
req.span());
 
             try (TraceSurroundings ignore = span.equals(NoopSpan.INSTANCE) ? 
null : MTC.support(span)) {
-                span.addTag(SpanTags.MESSAGE, () -> traceName(msg));
+                span.addTag(SpanTags.MESSAGE, () -> tracing.traceName(msg));
 
                 assert msg != null;
 
@@ -1687,7 +1681,7 @@ public class GridNioServer<T> {
                 int cnt = sockCh.write(buf);
 
                 if (sentBytesCntMetric != null)
-                    sentBytesCntMetric.add(cnt);
+                    sentBytesCntMetric.accept(cnt);
 
                 ses.bytesSent(cnt);
 
@@ -1778,7 +1772,7 @@ public class GridNioServer<T> {
                     log.trace("Bytes sent [sockCh=" + sockCh + ", cnt=" + cnt 
+ ']');
 
                 if (sentBytesCntMetric != null)
-                    sentBytesCntMetric.add(cnt);
+                    sentBytesCntMetric.accept(cnt);
 
                 ses.bytesSent(cnt);
                 onWrite(cnt);
@@ -1839,7 +1833,7 @@ public class GridNioServer<T> {
             Span span = tracing.create(SpanType.COMMUNICATION_SOCKET_WRITE, 
req.span());
 
             try (TraceSurroundings ignore = span.equals(NoopSpan.INSTANCE) ? 
null : MTC.support(span)) {
-                span.addTag(SpanTags.MESSAGE, () -> traceName(msg));
+                span.addTag(SpanTags.MESSAGE, () -> tracing.traceName(msg));
 
                 int startPos = buf.position();
 
@@ -2782,7 +2776,9 @@ public class GridNioServer<T> {
                     (InetSocketAddress)sockCh.getRemoteAddress(),
                     fut.accepted(),
                     sndQueueLimit,
-                    mreg,
+                    outboundMessagesQueueSizeMetric,
+                    maxMessagesQueueSizeMetric,
+                    tracing,
                     writeBuf,
                     readBuf);
 
@@ -3057,18 +3053,6 @@ public class GridNioServer<T> {
         }
     }
 
-    /**
-     * Gets outbound messages queue size.
-     *
-     * @return Write queue size.
-     */
-    public int outboundMessagesQueueSize() {
-        if (outboundMessagesQueueSizeMetric == null)
-            return -1;
-
-        return (int)outboundMessagesQueueSizeMetric.value();
-    }
-
     /**
      * A separate thread that will accept incoming connections and schedule 
read to some worker.
      */
@@ -3946,11 +3930,20 @@ public class GridNioServer<T> {
         /** Worker lifecycle listener to be used by server's worker threads. */
         private GridWorkerListener workerLsnr;
 
-        /** Metrics registry. */
-        private MetricRegistryImpl mreg;
+        /** Received bytes count metric. */
+        private LongConsumer rcvdBytesCntMetric;
+
+        /** Sent bytes count metric. */
+        private LongConsumer sentBytesCntMetric;
+
+        /** Per-session outbound messages queue size metric. */
+        private LongConsumer outboundMessagesQueueSizeMetric;
+
+        /** Per-session maximum outbound messages queue size metric. */
+        private LongConsumer maxMessagesQueueSizeMetric;
 
-        /** Tracing processor */
-        private Tracing tracing;
+        /** Span manager */
+        private SpanManager tracing;
 
         /** Message factory. */
         private MessageFactory msgFactory;
@@ -3984,7 +3977,10 @@ public class GridNioServer<T> {
                 msgQueueLsnr,
                 readWriteSelectorsAssign,
                 workerLsnr,
-                mreg,
+                rcvdBytesCntMetric,
+                sentBytesCntMetric,
+                outboundMessagesQueueSizeMetric,
+                maxMessagesQueueSizeMetric,
                 tracing,
                 msgFactory,
                 filters != null ? Arrays.copyOf(filters, filters.length) : 
EMPTY_FILTERS
@@ -4010,10 +4006,10 @@ public class GridNioServer<T> {
         }
 
         /**
-         * @param tracing Tracing processor.
+         * @param tracing Span manager.
          * @return This for chaining.
          */
-        public Builder<T> tracing(Tracing tracing) {
+        public Builder<T> tracing(SpanManager tracing) {
             this.tracing = tracing;
 
             return this;
@@ -4253,11 +4249,41 @@ public class GridNioServer<T> {
         }
 
         /**
-         * @param mreg Metrics registry.
+         * @param rcvdBytesCntMetric Received bytes count metric.
+         * @return This for chaining.
+         */
+        public Builder<T> receivedBytesMetric(LongConsumer rcvdBytesCntMetric) 
{
+            this.rcvdBytesCntMetric = rcvdBytesCntMetric;
+
+            return this;
+        }
+
+        /**
+         * @param sentBytesCntMetric Sent bytes count metric.
+         * @return This for chaining.
+         */
+        public Builder<T> sentBytesMetric(LongConsumer sentBytesCntMetric) {
+            this.sentBytesCntMetric = sentBytesCntMetric;
+
+            return this;
+        }
+
+        /**
+         * @param outboundMessagesQueueSizeMetric Per-session outbound 
messages queue size metric.
+         * @return This for chaining.
+         */
+        public Builder<T> outboundMessagesQueueSizeMetric(LongConsumer 
outboundMessagesQueueSizeMetric) {
+            this.outboundMessagesQueueSizeMetric = 
outboundMessagesQueueSizeMetric;
+
+            return this;
+        }
+
+        /**
+         * @param maxMessagesQueueSizeMetric Per-session maximum outbound 
messages queue size metric.
          * @return This for chaining.
          */
-        public Builder<T> metricRegistry(MetricRegistryImpl mreg) {
-            this.mreg = mreg;
+        public Builder<T> maxMessagesQueueSizeMetric(LongConsumer 
maxMessagesQueueSizeMetric) {
+            this.maxMessagesQueueSizeMetric = maxMessagesQueueSizeMetric;
 
             return this;
         }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioTracerFilter.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioTracerFilter.java
index 650aeb2cc7c..47644636def 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioTracerFilter.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioTracerFilter.java
@@ -23,9 +23,9 @@ import org.apache.ignite.IgniteLogger;
 import org.apache.ignite.internal.IgniteInternalFuture;
 import org.apache.ignite.internal.processors.tracing.MTC;
 import org.apache.ignite.internal.processors.tracing.NoopSpan;
-import org.apache.ignite.internal.processors.tracing.NoopTracing;
+import org.apache.ignite.internal.processors.tracing.NoopSpanManager;
 import org.apache.ignite.internal.processors.tracing.Span;
-import org.apache.ignite.internal.processors.tracing.Tracing;
+import org.apache.ignite.internal.processors.tracing.SpanManager;
 import org.apache.ignite.internal.processors.tracing.messages.SpanTransport;
 import org.apache.ignite.internal.util.tostring.GridToStringExclude;
 import org.apache.ignite.internal.util.typedef.internal.S;
@@ -42,7 +42,7 @@ public class GridNioTracerFilter extends GridNioFilterAdapter 
{
     private IgniteLogger log;
 
     /** Tracing processor. */
-    private final Tracing tracer;
+    private final SpanManager tracer;
 
     /**
      * Creates a tracer filter.
@@ -50,11 +50,11 @@ public class GridNioTracerFilter extends 
GridNioFilterAdapter {
      * @param log Log instance to use.
      * @param tracer Tracing processor.
      */
-    public GridNioTracerFilter(IgniteLogger log, Tracing tracer) {
+    public GridNioTracerFilter(IgniteLogger log, SpanManager tracer) {
         super("GridNioTracerFilter");
 
         this.log = log;
-        this.tracer = tracer == null ? new NoopTracing() : tracer;
+        this.tracer = tracer == null ? new NoopSpanManager() : tracer;
     }
 
     /** {@inheritDoc} */
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridSelectorNioSessionImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridSelectorNioSessionImpl.java
index 561941903b6..267851bac0f 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridSelectorNioSessionImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridSelectorNioSessionImpl.java
@@ -26,25 +26,19 @@ import java.util.List;
 import java.util.concurrent.ConcurrentLinkedDeque;
 import java.util.concurrent.Semaphore;
 import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.function.LongConsumer;
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.IgniteLogger;
 import org.apache.ignite.internal.IgniteInternalFuture;
-import org.apache.ignite.internal.processors.metric.MetricRegistryImpl;
-import org.apache.ignite.internal.processors.metric.impl.LongAdderMetric;
-import org.apache.ignite.internal.processors.metric.impl.MaxValueMetric;
 import org.apache.ignite.internal.processors.tracing.MTC;
+import org.apache.ignite.internal.processors.tracing.SpanManager;
 import org.apache.ignite.internal.util.tostring.GridToStringExclude;
 import org.apache.ignite.internal.util.typedef.internal.LT;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.plugin.extensions.communication.Message;
 import org.apache.ignite.util.deque.FastSizeDeque;
 import org.jetbrains.annotations.Nullable;
 
-import static 
org.apache.ignite.internal.processors.tracing.messages.TraceableMessagesTable.traceName;
-import static 
org.apache.ignite.internal.util.nio.GridNioServer.MAX_MESSAGES_QUEUE_SIZE_METRIC_DESC;
-import static 
org.apache.ignite.internal.util.nio.GridNioServer.MAX_MESSAGES_QUEUE_SIZE_METRIC_NAME;
-import static 
org.apache.ignite.internal.util.nio.GridNioServer.OUTBOUND_MESSAGES_QUEUE_SIZE_METRIC_DESC;
-import static 
org.apache.ignite.internal.util.nio.GridNioServer.OUTBOUND_MESSAGES_QUEUE_SIZE_METRIC_NAME;
-
 /**
  * Session implementation bound to selector API and socket API.
  * Note that this implementation requires non-null values for local and remote
@@ -93,10 +87,13 @@ public class GridSelectorNioSessionImpl extends 
GridNioSessionImpl implements Gr
     private volatile boolean closeSocket = true;
 
     /** Outbound messages queue size metric. */
-    @Nullable private final LongAdderMetric outboundMessagesQueueSizeMetric;
+    @Nullable private final LongConsumer outboundMessagesQueueSizeMetric;
 
     /** Maximum outbound messages queue size metric. */
-    @Nullable private final MaxValueMetric maxMessagesQueueSizeMetric;
+    @Nullable private final LongConsumer maxMessagesQueueSizeMetric;
+
+    /** Span manager used to resolve trace names for logging. */
+    private final SpanManager tracing;
 
     /**
      * Creates session instance.
@@ -108,6 +105,9 @@ public class GridSelectorNioSessionImpl extends 
GridNioSessionImpl implements Gr
      * @param rmtAddr Remote address.
      * @param accepted Accepted flag.
      * @param sndQueueLimit Send queue limit.
+     * @param outboundMessagesQueueSizeMetric Outbound messages queue size 
metric, or {@code null} if metrics disabled.
+     * @param maxMessagesQueueSizeMetric Maximum outbound messages queue size 
metric, or {@code null} if metrics disabled.
+     * @param tracing Span manager used to resolve trace names for logging.
      * @param writeBuf Write buffer.
      * @param readBuf Read buffer.
      */
@@ -119,7 +119,9 @@ public class GridSelectorNioSessionImpl extends 
GridNioSessionImpl implements Gr
         InetSocketAddress rmtAddr,
         boolean accepted,
         int sndQueueLimit,
-        @Nullable MetricRegistryImpl mreg,
+        @Nullable LongConsumer outboundMessagesQueueSizeMetric,
+        @Nullable LongConsumer maxMessagesQueueSizeMetric,
+        SpanManager tracing,
         @Nullable ByteBuffer writeBuf,
         @Nullable ByteBuffer readBuf
     ) {
@@ -151,17 +153,11 @@ public class GridSelectorNioSessionImpl extends 
GridNioSessionImpl implements Gr
             this.readBuf = readBuf;
         }
 
-        outboundMessagesQueueSizeMetric = mreg == null ? null : 
mreg.longAdderMetric(
-            OUTBOUND_MESSAGES_QUEUE_SIZE_METRIC_NAME,
-            OUTBOUND_MESSAGES_QUEUE_SIZE_METRIC_DESC
-        );
+        this.outboundMessagesQueueSizeMetric = outboundMessagesQueueSizeMetric;
+
+        this.maxMessagesQueueSizeMetric = maxMessagesQueueSizeMetric;
 
-        maxMessagesQueueSizeMetric = mreg == null ? null : mreg.maxValueMetric(
-            MAX_MESSAGES_QUEUE_SIZE_METRIC_NAME,
-            MAX_MESSAGES_QUEUE_SIZE_METRIC_DESC,
-            60_000,
-            5
-        );
+        this.tracing = tracing;
     }
 
     /** {@inheritDoc} */
@@ -323,17 +319,17 @@ public class GridSelectorNioSessionImpl extends 
GridNioSessionImpl implements Gr
 
         boolean res = queue.offerFirst(writeFut);
 
-        MTC.span().addLog(() -> "Added to system queue - " + 
traceName(writeFut.message()));
+        MTC.span().addLog(() -> "Added to system queue - " + 
tracing.traceName((Message)writeFut.message()));
 
         assert res : "Future was not added to queue";
 
         if (outboundMessagesQueueSizeMetric != null)
-            outboundMessagesQueueSizeMetric.increment();
+            outboundMessagesQueueSizeMetric.accept(1);
 
         if (maxMessagesQueueSizeMetric != null) {
             int queueSize = queue.sizex();
 
-            maxMessagesQueueSizeMetric.update(queueSize);
+            maxMessagesQueueSizeMetric.accept(queueSize);
 
             return queueSize;
         }
@@ -361,17 +357,17 @@ public class GridSelectorNioSessionImpl extends 
GridNioSessionImpl implements Gr
 
         boolean res = queue.offer(writeFut);
 
-        MTC.span().addLog(() -> "Added to queue - " + 
traceName(writeFut.message()));
+        MTC.span().addLog(() -> "Added to queue - " + 
tracing.traceName((Message)writeFut.message()));
 
         assert res : "Future was not added to queue";
 
         if (outboundMessagesQueueSizeMetric != null)
-            outboundMessagesQueueSizeMetric.increment();
+            outboundMessagesQueueSizeMetric.accept(1);
 
         if (maxMessagesQueueSizeMetric != null) {
             int queueSize = queue.sizex();
 
-            maxMessagesQueueSizeMetric.update(queueSize);
+            maxMessagesQueueSizeMetric.accept(queueSize);
 
             return queueSize;
         }
@@ -390,10 +386,10 @@ public class GridSelectorNioSessionImpl extends 
GridNioSessionImpl implements Gr
         assert add;
 
         if (outboundMessagesQueueSizeMetric != null)
-            outboundMessagesQueueSizeMetric.add(futs.size());
+            outboundMessagesQueueSizeMetric.accept(futs.size());
 
         if (maxMessagesQueueSizeMetric != null)
-            maxMessagesQueueSizeMetric.update(futs.size());
+            maxMessagesQueueSizeMetric.accept(futs.size());
     }
 
     /**
@@ -404,7 +400,7 @@ public class GridSelectorNioSessionImpl extends 
GridNioSessionImpl implements Gr
 
         if (last != null) {
             if (outboundMessagesQueueSizeMetric != null)
-                outboundMessagesQueueSizeMetric.decrement();
+                outboundMessagesQueueSizeMetric.accept(-1);
 
             if (sem != null && !last.messageThread())
                 sem.release();
@@ -439,7 +435,7 @@ public class GridSelectorNioSessionImpl extends 
GridNioSessionImpl implements Gr
         boolean rmv = queue.removeLastOccurrence(fut);
 
         if (rmv && outboundMessagesQueueSizeMetric != null)
-            outboundMessagesQueueSizeMetric.decrement();
+            outboundMessagesQueueSizeMetric.accept(-1);
 
         return rmv;
     }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/ssl/GridNioSslFilter.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/util/nio/ssl/GridNioSslFilter.java
index ab9f2994699..c6b5981471d 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/ssl/GridNioSslFilter.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/util/nio/ssl/GridNioSslFilter.java
@@ -20,6 +20,7 @@ package org.apache.ignite.internal.util.nio.ssl;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
+import java.util.function.LongConsumer;
 import javax.net.ssl.SSLContext;
 import javax.net.ssl.SSLEngine;
 import javax.net.ssl.SSLException;
@@ -27,9 +28,6 @@ import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.IgniteException;
 import org.apache.ignite.IgniteLogger;
 import org.apache.ignite.internal.IgniteInternalFuture;
-import org.apache.ignite.internal.processors.metric.MetricRegistryImpl;
-import org.apache.ignite.internal.processors.metric.impl.HistogramMetricImpl;
-import org.apache.ignite.internal.processors.metric.impl.IntMetricImpl;
 import org.apache.ignite.internal.util.future.GridFinishedFuture;
 import org.apache.ignite.internal.util.future.GridFutureAdapter;
 import org.apache.ignite.internal.util.nio.GridNioException;
@@ -86,10 +84,10 @@ public class GridNioSslFilter extends GridNioFilterAdapter {
     @Nullable private Exception onSessionOpenedException;
 
     /** Metric that indicates sessions count that were rejected due to SSL 
errors. */
-    @Nullable private final IntMetricImpl rejectedSesCnt;
+    @Nullable private final Runnable rejectedSesCnt;
 
     /** Histogram that provides distribution of SSL handshake duration. */
-    @Nullable private final HistogramMetricImpl handshakeDuration;
+    @Nullable private final LongConsumer handshakeDuration;
 
     /**
      * Creates SSL filter.
@@ -98,14 +96,16 @@ public class GridNioSslFilter extends GridNioFilterAdapter {
      * @param directBuf Direct buffer flag.
      * @param order Byte order.
      * @param log Logger to use.
-     * @param mreg Optional metric registry.
+     * @param handshakeDuration Records SSL handshake duration (ms), or {@code 
null} if metrics disabled.
+     * @param rejectedSesCnt Increments the rejected-sessions counter, or 
{@code null} if metrics disabled.
      */
     public GridNioSslFilter(
         SSLContext sslCtx,
         boolean directBuf,
         ByteOrder order,
         IgniteLogger log,
-        @Nullable MetricRegistryImpl mreg
+        @Nullable LongConsumer handshakeDuration,
+        @Nullable Runnable rejectedSesCnt
     ) {
         super("SSL filter");
 
@@ -113,17 +113,8 @@ public class GridNioSslFilter extends GridNioFilterAdapter 
{
         this.sslCtx = sslCtx;
         this.directBuf = directBuf;
         this.order = order;
-
-        handshakeDuration = mreg == null ? null : mreg.histogram(
-            SSL_HANDSHAKE_DURATION_HISTOGRAM_METRIC_NAME,
-            new long[] {250, 500, 1000},
-            "SSL handshake duration in milliseconds."
-        );
-
-        rejectedSesCnt = mreg == null ? null : mreg.intMetric(
-            SSL_REJECTED_SESSIONS_CNT_METRIC_NAME,
-            "TCP sessions count that were rejected due to SSL errors."
-        );
+        this.handshakeDuration = handshakeDuration;
+        this.rejectedSesCnt = rejectedSesCnt;
     }
 
     /**
@@ -253,7 +244,7 @@ public class GridNioSslFilter extends GridNioFilterAdapter {
 
                 long startTime = System.nanoTime();
 
-                fut.listen(() -> 
handshakeDuration.value(U.nanosToMillis(System.nanoTime() - startTime)));
+                fut.listen(() -> 
handshakeDuration.accept(U.nanosToMillis(System.nanoTime() - startTime)));
             }
 
             hnd.handshake();
@@ -275,7 +266,7 @@ public class GridNioSslFilter extends GridNioFilterAdapter {
 
             if (fut != null) {
                 if (rejectedSesCnt != null)
-                    rejectedSesCnt.increment();
+                    rejectedSesCnt.run();
 
                 fut.onDone(new IgniteCheckedException("SSL handshake failed 
(connection closed).", onSessionOpenedException));
             }
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 2fb542ceb8b..4bf17f1a969 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
@@ -44,6 +44,8 @@ import org.apache.ignite.spi.metric.ReadOnlyMetricRegistry;
 import static java.util.stream.Collectors.toMap;
 import static 
org.apache.ignite.internal.processors.metric.impl.MetricUtils.SEPARATOR;
 import static 
org.apache.ignite.internal.processors.metric.impl.MetricUtils.metricName;
+import static 
org.apache.ignite.internal.util.nio.GridNioServer.OUTBOUND_MESSAGES_QUEUE_SIZE_METRIC_DESC;
+import static 
org.apache.ignite.internal.util.nio.GridNioServer.OUTBOUND_MESSAGES_QUEUE_SIZE_METRIC_NAME;
 import static 
org.apache.ignite.internal.util.nio.GridNioServer.RECEIVED_BYTES_METRIC_DESC;
 import static 
org.apache.ignite.internal.util.nio.GridNioServer.RECEIVED_BYTES_METRIC_NAME;
 import static 
org.apache.ignite.internal.util.nio.GridNioServer.SENT_BYTES_METRIC_DESC;
@@ -105,6 +107,9 @@ public class TcpCommunicationMetricsListener {
     /** Received messages count metric. */
     private final LongAdderMetric rcvdMsgsMetric;
 
+    /** Outbound messages queue size metric. */
+    private final LongAdderMetric outboundMessagesQueueSizeMetric;
+
     /** Counters of sent and received messages by direct type. */
     private final IntMap<IgniteBiTuple<LongAdderMetric, LongAdderMetric>> 
msgCntrsByType;
 
@@ -146,6 +151,11 @@ public class TcpCommunicationMetricsListener {
         sentMsgsMetric = mreg.longAdderMetric(SENT_MESSAGES_METRIC_NAME, 
SENT_MESSAGES_METRIC_DESC);
         rcvdMsgsMetric = mreg.longAdderMetric(RECEIVED_MESSAGES_METRIC_NAME, 
RECEIVED_MESSAGES_METRIC_DESC);
 
+        outboundMessagesQueueSizeMetric = mreg.longAdderMetric(
+            OUTBOUND_MESSAGES_QUEUE_SIZE_METRIC_NAME,
+            OUTBOUND_MESSAGES_QUEUE_SIZE_METRIC_DESC
+        );
+
         spiCtx.addMetricRegistryCreationListener(mreg -> {
             // Metrics for the specific nodes or other communication metrics.
             if (!TcpCommunicationSpi.isCommunicationMetrics(mreg.name()))
@@ -276,6 +286,15 @@ public class TcpCommunicationMetricsListener {
         return rcvdBytesMetric.value();
     }
 
+    /**
+     * Gets outbound messages queue size.
+     *
+     * @return Outbound messages queue size.
+     */
+    public int outboundMessagesQueueSize() {
+        return (int)outboundMessagesQueueSizeMetric.value();
+    }
+
     /**
      * Gets received messages counts (grouped by type).
      *
diff --git 
a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java
 
b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java
index f9ab18727ea..4bcae5a26a2 100755
--- 
a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java
@@ -411,9 +411,10 @@ public class TcpCommunicationSpi extends 
TcpCommunicationConfigInitializer {
 
     /** {@inheritDoc} */
     @Override public int getOutboundMessagesQueueSize() {
-        GridNioServer<Message> srv = nioSrvWrapper.nio();
+        if (metricsLsnr == null)
+            return 0;
 
-        return srv != null ? srv.outboundMessagesQueueSize() : 0;
+        return metricsLsnr.outboundMessagesQueueSize();
     }
 
     /** {@inheritDoc} */
diff --git 
a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/internal/GridNioServerWrapper.java
 
b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/internal/GridNioServerWrapper.java
index df7935c6c2f..eb90f002a24 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/internal/GridNioServerWrapper.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/internal/GridNioServerWrapper.java
@@ -56,6 +56,7 @@ import org.apache.ignite.internal.direct.DirectMessageWriter;
 import org.apache.ignite.internal.managers.GridManager;
 import org.apache.ignite.internal.managers.tracing.GridTracingManager;
 import org.apache.ignite.internal.processors.metric.GridMetricManager;
+import org.apache.ignite.internal.processors.metric.MetricRegistryImpl;
 import org.apache.ignite.internal.processors.tracing.Tracing;
 import org.apache.ignite.internal.util.GridConcurrentFactory;
 import org.apache.ignite.internal.util.IgniteExceptionRegistry;
@@ -909,7 +910,7 @@ public class GridNioServerWrapper {
                 filters.add(new GridConnectionBytesVerifyFilter(log));
 
                 if (stateProvider.isSslEnabled()) {
-                    GridNioSslFilter sslFilter = new GridNioSslFilter(
+                    GridNioSslFilter sslFilter = U.sslFilter(
                         igniteCfg.getSslContextFactory().create(),
                         true,
                         ByteOrder.LITTLE_ENDIAN,
@@ -924,6 +925,11 @@ public class GridNioServerWrapper {
                     filters.add(sslFilter);
                 }
 
+                GridNioFilter[] filtersArr = filters.toArray(new 
GridNioFilter[filters.size()]);
+
+                MetricRegistryImpl mreg = metricMgr != null ?
+                    metricMgr.registry(COMMUNICATION_METRICS_GROUP_NAME) : 
null;
+
                 GridNioServer.Builder<Message> builder = 
GridNioServer.<Message>builder()
                     .address(cfg.localHost())
                     .port(port)
@@ -941,7 +947,7 @@ public class GridNioServerWrapper {
                     .directMode(true)
                     .writeTimeout(cfg.socketWriteTimeout())
                     .selectorSpins(cfg.selectorSpins())
-                    .filters(filters.toArray(new 
GridNioFilter[filters.size()]))
+                    .filters(filtersArr)
                     .writerFactory(writerFactory)
                     .skipRecoveryPredicate(skipRecoveryPred)
                     .messageQueueSizeListener(queueSizeMonitor)
@@ -949,13 +955,17 @@ public class GridNioServerWrapper {
                     .readWriteSelectorsAssign(cfg.usePairedConnections())
                     .messageFactory(msgFactory);
 
-                if (metricMgr != null) {
-                    builder.workerListener(workersRegistry)
-                        
.metricRegistry(metricMgr.registry(COMMUNICATION_METRICS_GROUP_NAME));
+                if (mreg != null) {
+                    builder.workerListener(workersRegistry);
+
+                    U.setNioServerMetrics(builder, mreg);
                 }
 
                 GridNioServer<Message> srvr = builder.build();
 
+                if (mreg != null)
+                    U.registerNioServerMetrics(srvr, filtersArr, mreg);
+
                 cfg.boundTcpPort(port);
 
                 // Ack Port the TCP server was bound to.
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/util/nio/GridNioSslSelfTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/util/nio/GridNioSslSelfTest.java
index 79bc9f0ef82..9b2199f213e 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/util/nio/GridNioSslSelfTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/util/nio/GridNioSslSelfTest.java
@@ -71,7 +71,7 @@ public class GridNioSslSelfTest extends GridNioSelfTest {
             .sendQueueLimit(0)
             .filters(
                 new GridNioCodecFilter(parser, log, false),
-                new GridNioSslFilter(sslCtx, true, ByteOrder.nativeOrder(), 
log, null));
+                new GridNioSslFilter(sslCtx, true, ByteOrder.nativeOrder(), 
log, null, null));
     }
 
     /** {@inheritDoc} */

Reply via email to