You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ni...@apache.org on 2020/11/17 15:19:08 UTC

[ignite] branch master updated: IGNITE-13699 Register ZookeeperDiscovery metrics to new metrics framework (#8458)

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 1b5d837  IGNITE-13699 Register ZookeeperDiscovery metrics to new metrics framework (#8458)
1b5d837 is described below

commit 1b5d837c9fb5ec4320aca3a7e15ea7b56e34fdfa
Author: Ivan Daschinskiy <iv...@gmail.com>
AuthorDate: Tue Nov 17 18:18:52 2020 +0300

    IGNITE-13699 Register ZookeeperDiscovery metrics to new metrics framework (#8458)
---
 .../managers/discovery/GridDiscoveryManager.java   |  4 +++
 .../ignite/spi/discovery/tcp/TcpDiscoverySpi.java  |  5 +--
 .../discovery/tcp/TcpDiscoverySpiMBeanTest.java    |  2 +-
 .../spi/discovery/zk/ZookeeperDiscoverySpi.java    | 14 ++++++++
 .../spi/discovery/zk/internal/ZkRuntimeState.java  |  2 +-
 .../zk/internal/ZookeeperDiscoveryImpl.java        | 32 +++++++++++++-----
 .../zk/internal/ZookeeperDiscoveryStatistics.java  | 39 +++++++++++++++++-----
 .../zk/internal/ZookeeperDiscoveryMiscTest.java    | 29 ++++++++++++++--
 8 files changed, 101 insertions(+), 26 deletions(-)

diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java
index 0a8c857..65a331f 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java
@@ -169,6 +169,7 @@ import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_SHUTDOWN_POLI
 import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_USER_NAME;
 import static org.apache.ignite.internal.IgniteVersionUtils.VER;
 import static org.apache.ignite.internal.events.DiscoveryCustomEvent.EVT_DISCOVERY_CUSTOM_EVT;
+import static org.apache.ignite.internal.processors.metric.impl.MetricUtils.metricName;
 import static org.apache.ignite.internal.processors.security.SecurityUtils.isSecurityCompatibilityMode;
 import static org.apache.ignite.plugin.segmentation.SegmentationPolicy.NOOP;
 
@@ -188,6 +189,9 @@ public class GridDiscoveryManager extends GridManagerAdapter<DiscoverySpi> {
     /** @see IgniteSystemProperties#IGNITE_DISCOVERY_HISTORY_SIZE */
     public static final int DFLT_DISCOVERY_HISTORY_SIZE = 500;
 
+    /** Name of the discovery metrics registry. */
+    public static final String DISCO_METRICS = metricName("io", "discovery");
+
     /** Predicate filtering out daemon nodes. */
     private static final IgnitePredicate<ClusterNode> FILTER_NOT_DAEMON = new P1<ClusterNode>() {
         @Override public boolean apply(ClusterNode n) {
diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySpi.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySpi.java
index c18715e..8a2b4c6 100644
--- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySpi.java
+++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySpi.java
@@ -120,7 +120,7 @@ import org.jetbrains.annotations.TestOnly;
 import static org.apache.ignite.IgniteSystemProperties.IGNITE_CONSISTENT_ID_BY_HOST_WITHOUT_PORT;
 import static org.apache.ignite.IgniteSystemProperties.getBoolean;
 import static org.apache.ignite.failure.FailureType.CRITICAL_ERROR;
-import static org.apache.ignite.internal.processors.metric.impl.MetricUtils.metricName;
+import static org.apache.ignite.internal.managers.discovery.GridDiscoveryManager.DISCO_METRICS;
 
 /**
  * Discovery SPI implementation that uses TCP/IP for node discovery.
@@ -307,9 +307,6 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter implements IgniteDiscovery
     /** @see IgniteSystemProperties#IGNITE_DISCOVERY_METRICS_QNT_WARN */
     public static final int DFLT_DISCOVERY_METRICS_QNT_WARN = 500;
 
-    /** Name of the discovery metrics registry. */
-    public static final String DISCO_METRICS = metricName("io", "discovery");
-
     /** Ssl message pattern for StreamCorruptedException. */
     private static Pattern sslMsgPattern = Pattern.compile("invalid stream header: 150\\d0\\d00");
 
diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySpiMBeanTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySpiMBeanTest.java
index dd935a9..be2f147 100644
--- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySpiMBeanTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySpiMBeanTest.java
@@ -39,7 +39,7 @@ import org.junit.Test;
 
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
 import static org.apache.ignite.events.EventType.EVT_NODE_SEGMENTED;
-import static org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi.DISCO_METRICS;
+import static org.apache.ignite.internal.managers.discovery.GridDiscoveryManager.DISCO_METRICS;
 import static org.apache.ignite.testframework.GridTestUtils.waitForCondition;
 
 /**
diff --git a/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/ZookeeperDiscoverySpi.java b/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/ZookeeperDiscoverySpi.java
index 3de8df6..ec2dc80 100644
--- a/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/ZookeeperDiscoverySpi.java
+++ b/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/ZookeeperDiscoverySpi.java
@@ -31,6 +31,7 @@ import org.apache.ignite.cluster.ClusterNode;
 import org.apache.ignite.internal.IgniteFeatures;
 import org.apache.ignite.internal.managers.discovery.IgniteDiscoverySpi;
 import org.apache.ignite.internal.managers.discovery.IgniteDiscoverySpiInternalListener;
+import org.apache.ignite.internal.processors.metric.MetricRegistry;
 import org.apache.ignite.internal.util.tostring.GridToStringExclude;
 import org.apache.ignite.internal.util.tostring.GridToStringInclude;
 import org.apache.ignite.internal.util.typedef.internal.A;
@@ -41,6 +42,7 @@ import org.apache.ignite.lang.IgniteProductVersion;
 import org.apache.ignite.resources.LoggerResource;
 import org.apache.ignite.spi.IgniteSpiAdapter;
 import org.apache.ignite.spi.IgniteSpiConfiguration;
+import org.apache.ignite.spi.IgniteSpiContext;
 import org.apache.ignite.spi.IgniteSpiException;
 import org.apache.ignite.spi.IgniteSpiMBeanAdapter;
 import org.apache.ignite.spi.IgniteSpiMultipleInstancesSupport;
@@ -62,6 +64,7 @@ import org.jetbrains.annotations.Nullable;
 
 import static org.apache.ignite.IgniteSystemProperties.IGNITE_CONSISTENT_ID_BY_HOST_WITHOUT_PORT;
 import static org.apache.ignite.IgniteSystemProperties.getBoolean;
+import static org.apache.ignite.internal.managers.discovery.GridDiscoveryManager.DISCO_METRICS;
 
 /**
  * Zookeeper Discovery Spi.
@@ -490,6 +493,17 @@ public class ZookeeperDiscoverySpi extends IgniteSpiAdapter implements IgniteDis
     }
 
     /** {@inheritDoc} */
+    @Override protected void onContextInitialized0(IgniteSpiContext spiCtx) throws IgniteSpiException {
+        super.onContextInitialized0(spiCtx);
+
+        MetricRegistry discoReg = (MetricRegistry)getSpiContext().getOrCreateMetricRegistry(DISCO_METRICS);
+
+        stats.registerMetrics(discoReg);
+
+        discoReg.register("Coordinator", () -> impl.getCoordinator(), UUID.class, "Coordinator ID");
+    }
+
+    /** {@inheritDoc} */
     @Override public void setInternalListener(IgniteDiscoverySpiInternalListener lsnr) {
         if (impl != null)
             impl.internalLsnr = lsnr;
diff --git a/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZkRuntimeState.java b/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZkRuntimeState.java
index 0aac6db..547c185 100644
--- a/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZkRuntimeState.java
+++ b/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZkRuntimeState.java
@@ -39,7 +39,7 @@ class ZkRuntimeState {
     final boolean reconnect;
 
     /** */
-    ZookeeperClient zkClient;
+    volatile ZookeeperClient zkClient;
 
     /** */
     long internalOrder;
diff --git a/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZookeeperDiscoveryImpl.java b/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZookeeperDiscoveryImpl.java
index d9d56ae..bdd37d1 100644
--- a/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZookeeperDiscoveryImpl.java
+++ b/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZookeeperDiscoveryImpl.java
@@ -192,7 +192,7 @@ public class ZookeeperDiscoveryImpl {
     private IgniteThreadPoolExecutor utilityPool;
 
     /** */
-    private ZkRuntimeState rtState;
+    private volatile ZkRuntimeState rtState;
 
     /** */
     private volatile ConnectionState connState = ConnectionState.STARTED;
@@ -297,7 +297,9 @@ public class ZookeeperDiscoveryImpl {
     @Nullable public ZookeeperClusterNode node(UUID nodeId) {
         assert nodeId != null;
 
-        return rtState.top.nodesById.get(nodeId);
+        ZkRuntimeState rtState0 = rtState;
+
+        return rtState0 != null ? rtState0.top.nodesById.get(nodeId) : null;
     }
 
     /**
@@ -307,7 +309,9 @@ public class ZookeeperDiscoveryImpl {
     @Nullable public ZookeeperClusterNode node(long nodeOrder) {
         assert nodeOrder > 0 : nodeOrder;
 
-        return rtState.top.nodesByOrder.get(nodeOrder);
+        ZkRuntimeState rtState0 = rtState;
+
+        return rtState0 != null ? rtState.top.nodesByOrder.get(nodeOrder) : null;
     }
 
     /**
@@ -2298,8 +2302,6 @@ public class ZookeeperDiscoveryImpl {
         joinCtx.addJoinedNode(nodeEvtData, commonData);
 
         rtState.evtsData.onNodeJoin(joinedNode);
-
-        stats.onNodeJoined();
     }
 
     /**
@@ -2817,9 +2819,12 @@ public class ZookeeperDiscoveryImpl {
             throw e;
         }
 
-        if (rtState.joined)
+        if (rtState.joined) {
             rtState.evtsData = evtsData;
 
+            stats.onTopologyChanged(rtState.evtsData.topVer);
+        }
+
         if (rtState.crd)
             handleProcessedEvents("procEvt");
         else
@@ -3552,6 +3557,8 @@ public class ZookeeperDiscoveryImpl {
                 null
             )
         ).get();
+
+        stats.onNodeJoined();
     }
 
     /**
@@ -4630,7 +4637,12 @@ public class ZookeeperDiscoveryImpl {
 
     /** */
     public UUID getCoordinator() {
-        return rtState.top.nodesByOrder.values().stream()
+        ZkRuntimeState rtState0 = rtState;
+
+        if (rtState0 == null)
+            return null;
+
+        return rtState0.top.nodesByOrder.values().stream()
                 .filter(n -> !n.isClient() && !n.isDaemon())
                 .map(ZookeeperClusterNode::id)
                 .findFirst()
@@ -4639,12 +4651,14 @@ public class ZookeeperDiscoveryImpl {
 
     /** */
     public String getSpiState() {
-        return rtState.zkClient.state();
+        return connState.toString();
     }
 
     /** */
     public String getZkSessionId() {
-        if (rtState.zkClient != null && rtState.zkClient.zk() != null)
+        ZkRuntimeState rtState0 = rtState;
+
+        if (rtState0 != null && rtState0.zkClient != null)
             return Long.toHexString(rtState.zkClient.zk().getSessionId());
         else
             return null;
diff --git a/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZookeeperDiscoveryStatistics.java b/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZookeeperDiscoveryStatistics.java
index 21b62c4..faf00d6 100644
--- a/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZookeeperDiscoveryStatistics.java
+++ b/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZookeeperDiscoveryStatistics.java
@@ -16,7 +16,9 @@
  */
 package org.apache.ignite.spi.discovery.zk.internal;
 
-import java.util.concurrent.atomic.LongAdder;
+import org.apache.ignite.internal.processors.metric.MetricRegistry;
+import org.apache.ignite.internal.processors.metric.impl.AtomicLongMetric;
+import org.apache.ignite.internal.processors.metric.impl.LongAdderMetric;
 import org.apache.ignite.internal.util.typedef.internal.S;
 
 /**
@@ -24,35 +26,49 @@ import org.apache.ignite.internal.util.typedef.internal.S;
  */
 public class ZookeeperDiscoveryStatistics {
     /** */
-    private final LongAdder joinedNodesCnt = new LongAdder();
+    private final LongAdderMetric joinedNodesCnt = new LongAdderMetric("JoinedNodes", "Joined nodes count");
 
     /** */
-    private final LongAdder failedNodesCnt = new LongAdder();
+    private final LongAdderMetric failedNodesCnt = new LongAdderMetric("FailedNodes", "Failed nodes count");
 
     /** */
-    private final LongAdder leftNodesCnt = new LongAdder();
+    private final LongAdderMetric leftNodesCnt = new LongAdderMetric("LeftNodes", "Left nodes count");
 
     /** Communication error count. */
-    private final LongAdder commErrCnt = new LongAdder();
+    private final LongAdderMetric commErrCnt = new LongAdderMetric("CommunicationErrors", "Communication errors count");
+
+    /** Current topology version */
+    private final AtomicLongMetric topVer = new AtomicLongMetric("CurrentTopologyVersion", "Current topology version");
+
+    /**
+     * @param discoReg Discovery metric registry.
+     */
+    public void registerMetrics(MetricRegistry discoReg) {
+        discoReg.register(joinedNodesCnt);
+        discoReg.register(failedNodesCnt);
+        discoReg.register(leftNodesCnt);
+        discoReg.register(commErrCnt);
+        discoReg.register(topVer);
+    }
 
     /** */
     public long joinedNodesCnt() {
-        return joinedNodesCnt.longValue();
+        return joinedNodesCnt.value();
     }
 
     /** */
     public long failedNodesCnt() {
-        return failedNodesCnt.longValue();
+        return failedNodesCnt.value();
     }
 
     /** */
     public long leftNodesCnt() {
-        return leftNodesCnt.longValue();
+        return leftNodesCnt.value();
     }
 
     /** */
     public long commErrorCount() {
-        return commErrCnt.longValue();
+        return commErrCnt.value();
     }
 
     /** */
@@ -75,6 +91,11 @@ public class ZookeeperDiscoveryStatistics {
         commErrCnt.increment();
     }
 
+    /** */
+    public void onTopologyChanged(long topVer) {
+        this.topVer.value(topVer);
+    }
+
     /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(ZookeeperDiscoveryStatistics.class, this);
diff --git a/modules/zookeeper/src/test/java/org/apache/ignite/spi/discovery/zk/internal/ZookeeperDiscoveryMiscTest.java b/modules/zookeeper/src/test/java/org/apache/ignite/spi/discovery/zk/internal/ZookeeperDiscoveryMiscTest.java
index f271bad..57aae67 100644
--- a/modules/zookeeper/src/test/java/org/apache/ignite/spi/discovery/zk/internal/ZookeeperDiscoveryMiscTest.java
+++ b/modules/zookeeper/src/test/java/org/apache/ignite/spi/discovery/zk/internal/ZookeeperDiscoveryMiscTest.java
@@ -33,6 +33,7 @@ import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.internal.IgniteEx;
 import org.apache.ignite.internal.SecurityCredentialsAttrFilterPredicate;
+import org.apache.ignite.internal.processors.metric.MetricRegistry;
 import org.apache.ignite.internal.processors.security.SecurityContext;
 import org.apache.ignite.internal.util.lang.gridfunc.PredicateMapView;
 import org.apache.ignite.internal.util.typedef.G;
@@ -47,11 +48,14 @@ import org.apache.ignite.spi.IgniteSpiException;
 import org.apache.ignite.spi.discovery.DiscoverySpiNodeAuthenticator;
 import org.apache.ignite.spi.discovery.zk.ZookeeperDiscoverySpi;
 import org.apache.ignite.spi.discovery.zk.ZookeeperDiscoverySpiMBean;
+import org.apache.ignite.spi.metric.LongMetric;
+import org.apache.ignite.spi.metric.ObjectMetric;
 import org.apache.ignite.testframework.GridTestUtils;
 import org.junit.Test;
 
 import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_IGNITE_INSTANCE_NAME;
 import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_SECURITY_SUBJECT_V2;
+import static org.apache.ignite.internal.managers.discovery.GridDiscoveryManager.DISCO_METRICS;
 
 /**
  * Tests for Zookeeper SPI discovery.
@@ -217,23 +221,44 @@ public class ZookeeperDiscoveryMiscTest extends ZookeeperDiscoverySpiTestBase {
      */
     @Test
     public void testMbean() throws Exception {
-        startGrids(3);
+        int cnt = 3;
+
+        startGrids(cnt);
 
         UUID crdNodeId = grid(0).localNode().id();
 
         try {
-            for (int i = 0; i < 3; i++) {
+            for (int i = 0; i < cnt; i++) {
                 IgniteEx grid = grid(i);
 
                 ZookeeperDiscoverySpiMBean bean = getMxBean(grid.context().igniteInstanceName(), "SPIs",
                     ZookeeperDiscoverySpi.class, ZookeeperDiscoverySpiMBean.class);
 
+                MetricRegistry discoReg = grid.context().metric().registry(DISCO_METRICS);
+
                 assertNotNull(bean);
 
                 assertEquals(String.valueOf(grid.cluster().node(crdNodeId)), bean.getCoordinatorNodeFormatted());
                 assertEquals(String.valueOf(grid.cluster().localNode()), bean.getLocalNodeFormatted());
                 assertEquals(zkCluster.getConnectString(), bean.getZkConnectionString());
                 assertEquals((long)grid.configuration().getFailureDetectionTimeout(), bean.getZkSessionTimeout());
+
+                assertEquals(grid.cluster().topologyVersion(),
+                    discoReg.<LongMetric>findMetric("CurrentTopologyVersion").value());
+
+                assertEquals(grid.cluster().node(crdNodeId).id(),
+                    discoReg.<ObjectMetric<UUID>>findMetric("Coordinator").value());
+
+                assertEquals(cnt - i - 1, bean.getNodesJoined());
+                assertEquals(cnt - i - 1, discoReg.<LongMetric>findMetric("JoinedNodes").value());
+
+                Arrays.asList("LeftNodes", "FailedNodes", "CommunicationErrors").forEach(name -> {
+                    assertEquals(0, discoReg.<LongMetric>findMetric(name).value());
+                });
+
+                assertEquals(0, bean.getNodesLeft());
+                assertEquals(0, bean.getNodesFailed());
+                assertEquals(0, bean.getCommErrorProcNum());
             }
         }
         finally {