You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by wu...@apache.org on 2021/03/12 12:46:26 UTC

[skywalking] branch master updated: resolve "receiver don't need to get itself when healthCheck #6515 " (#6538)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new cc60f15  resolve "receiver don't need to get itself when healthCheck #6515 " (#6538)
cc60f15 is described below

commit cc60f1529fa3cbfba8a7618829bc75bbf3eedc6d
Author: 史精文 <90...@qq.com>
AuthorDate: Fri Mar 12 20:45:38 2021 +0800

    resolve "receiver don't need to get itself when healthCheck #6515 " (#6538)
---
 CHANGES.md                                         |  1 +
 .../oap/server/core/CoreModuleConfig.java          | 11 +++++-
 .../oap/server/core/CoreModuleProvider.java        |  3 ++
 .../oap/server/core/cluster/OAPNodeChecker.java    | 15 ++++++--
 .../oap/server/core/CoreModuleConfigTest.java      | 44 ++++++++++++++++++++++
 .../server/core/cluster/OAPNodeCheckerTest.java    | 10 +++++
 6 files changed, 79 insertions(+), 5 deletions(-)

diff --git a/CHANGES.md b/CHANGES.md
index a3fbdc5..e826119 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -49,6 +49,7 @@ Release Notes.
 * Add telemetry data about metrics in, metrics scraping and trace in metrics to zipkin receiver.
 * Fix tags store of log and trace on h2/mysql/pg storage.
 * Merge indices by Metrics Function and Meter Function in Elasticsearch Storage. 
+* Fix receiver don't need to get itself when healthCheck
 
 #### UI
 * Update selector scroller to show in all pages.
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleConfig.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleConfig.java
index 93721ea..22f5467 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleConfig.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleConfig.java
@@ -157,7 +157,16 @@ public class CoreModuleConfig extends ModuleConfig {
          * Aggregator mode OAP receives data from {@link #Mixed} and {@link #Aggregator} OAP nodes, and do 2nd round
          * aggregation. Then save the final result to the storage.
          */
-        Aggregator
+        Aggregator;
+
+        public static Role fromName(String name) {
+            for (Role role : Role.values()) {
+                if (role.name().equalsIgnoreCase(name)) {
+                    return role;
+                }
+            }
+            return Mixed;
+        }
     }
 
     /**
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleProvider.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleProvider.java
index cbdd38d..18d5ec4 100755
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleProvider.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleProvider.java
@@ -38,6 +38,7 @@ import org.apache.skywalking.oap.server.core.cache.NetworkAddressAliasCache;
 import org.apache.skywalking.oap.server.core.cache.ProfileTaskCache;
 import org.apache.skywalking.oap.server.core.cluster.ClusterModule;
 import org.apache.skywalking.oap.server.core.cluster.ClusterRegister;
+import org.apache.skywalking.oap.server.core.cluster.OAPNodeChecker;
 import org.apache.skywalking.oap.server.core.cluster.RemoteInstance;
 import org.apache.skywalking.oap.server.core.command.CommandService;
 import org.apache.skywalking.oap.server.core.config.ComponentLibraryCatalogService;
@@ -315,6 +316,8 @@ public class CoreModuleProvider extends ModuleProvider {
                 .registerRemote(gRPCServerInstance);
         }
 
+        OAPNodeChecker.setROLE(CoreModuleConfig.Role.fromName(moduleConfig.getRole()));
+
         DynamicConfigurationService dynamicConfigurationService = getManager().find(ConfigurationModule.NAME)
                                                                               .provider()
                                                                               .getService(
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cluster/OAPNodeChecker.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cluster/OAPNodeChecker.java
index 815dd26..2fec8d9 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cluster/OAPNodeChecker.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/cluster/OAPNodeChecker.java
@@ -19,6 +19,8 @@
 package org.apache.skywalking.oap.server.core.cluster;
 
 import com.google.common.collect.Sets;
+import lombok.Setter;
+import org.apache.skywalking.oap.server.core.CoreModuleConfig;
 import org.apache.skywalking.oap.server.library.util.CollectionUtils;
 
 import java.util.List;
@@ -28,6 +30,9 @@ import java.util.stream.Collectors;
 public class OAPNodeChecker {
     private static final Set<String> ILLEGAL_NODE_ADDRESS_IN_CLUSTER_MODE = Sets.newHashSet("127.0.0.1", "localhost");
 
+    @Setter
+    private static CoreModuleConfig.Role ROLE = CoreModuleConfig.Role.Mixed;
+
     public static boolean hasIllegalNodeAddress(List<RemoteInstance> remoteInstances) {
         if (CollectionUtils.isEmpty(remoteInstances)) {
             return false;
@@ -50,10 +55,12 @@ public class OAPNodeChecker {
         if (CollectionUtils.isEmpty(remoteInstances)) {
             return ClusterHealthStatus.unHealth("can't get the instance list");
         }
-        List<RemoteInstance> selfInstances = remoteInstances.stream().
-                filter(remoteInstance -> remoteInstance.getAddress().isSelf()).collect(Collectors.toList());
-        if (CollectionUtils.isEmpty(selfInstances)) {
-            return ClusterHealthStatus.unHealth("can't get itself");
+        if (!CoreModuleConfig.Role.Receiver.equals(ROLE)) {
+            List<RemoteInstance> selfInstances = remoteInstances.stream().
+                    filter(remoteInstance -> remoteInstance.getAddress().isSelf()).collect(Collectors.toList());
+            if (CollectionUtils.isEmpty(selfInstances)) {
+                return ClusterHealthStatus.unHealth("can't get itself");
+            }
         }
         if (remoteInstances.size() > 1 && hasIllegalNodeAddress(remoteInstances)) {
             return ClusterHealthStatus.unHealth("find illegal node in cluster mode such as 127.0.0.1, localhost");
diff --git a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/CoreModuleConfigTest.java b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/CoreModuleConfigTest.java
new file mode 100644
index 0000000..afdb5bb
--- /dev/null
+++ b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/CoreModuleConfigTest.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.oap.server.core;
+
+import org.apache.commons.lang3.StringUtils;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class CoreModuleConfigTest {
+
+    @Test
+    public void testRoleFromNameNormalSituation() {
+        Assert.assertEquals(CoreModuleConfig.Role.Mixed, CoreModuleConfig.Role.fromName("Mixed"));
+        Assert.assertEquals(CoreModuleConfig.Role.Receiver, CoreModuleConfig.Role.fromName("Receiver"));
+        Assert.assertEquals(CoreModuleConfig.Role.Aggregator, CoreModuleConfig.Role.fromName("Aggregator"));
+    }
+
+    @Test
+    public void testRoleFromNameBlockParameter() {
+        Assert.assertEquals(CoreModuleConfig.Role.Mixed, CoreModuleConfig.Role.fromName(StringUtils.EMPTY));
+        Assert.assertEquals(CoreModuleConfig.Role.Mixed, CoreModuleConfig.Role.fromName(null));
+    }
+
+    @Test
+    public void testRoleFromNameNotIncludeRole() {
+        Assert.assertEquals(CoreModuleConfig.Role.Mixed, CoreModuleConfig.Role.fromName("a"));
+    }
+}
diff --git a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/cluster/OAPNodeCheckerTest.java b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/cluster/OAPNodeCheckerTest.java
index c4f2d35..0e7192c 100644
--- a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/cluster/OAPNodeCheckerTest.java
+++ b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/cluster/OAPNodeCheckerTest.java
@@ -19,6 +19,7 @@
 package org.apache.skywalking.oap.server.core.cluster;
 
 import com.google.common.collect.Lists;
+import org.apache.skywalking.oap.server.core.CoreModuleConfig;
 import org.apache.skywalking.oap.server.core.remote.client.Address;
 import org.junit.Assert;
 import org.junit.Test;
@@ -102,4 +103,13 @@ public class OAPNodeCheckerTest {
         ClusterHealthStatus clusterHealthStatus = OAPNodeChecker.isHealth(remoteInstances);
         Assert.assertTrue(clusterHealthStatus.isHealth());
     }
+
+    @Test
+    public void healthWhenReceiverRoleWithEmptySelfInstance() {
+        List<RemoteInstance> remoteInstances = new ArrayList<>();
+        remoteInstances.add(new RemoteInstance(new Address("192.168.0.1", 8892, false)));
+        OAPNodeChecker.setROLE(CoreModuleConfig.Role.Receiver);
+        ClusterHealthStatus clusterHealthStatus = OAPNodeChecker.isHealth(remoteInstances);
+        Assert.assertTrue(clusterHealthStatus.isHealth());
+    }
 }
\ No newline at end of file