From cc60f1529fa3cbfba8a7618829bc75bbf3eedc6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=B2=E7=B2=BE=E6=96=87?= <909098131@qq.com> Date: Fri, 12 Mar 2021 20:45:38 +0800 Subject: [PATCH] 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 ++ .../server/core/cluster/OAPNodeChecker.java | 15 +++++-- .../oap/server/core/CoreModuleConfigTest.java | 44 +++++++++++++++++++ .../core/cluster/OAPNodeCheckerTest.java | 10 +++++ 6 files changed, 79 insertions(+), 5 deletions(-) create mode 100644 oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/CoreModuleConfigTest.java diff --git a/CHANGES.md b/CHANGES.md index a3fbdc53db..e82611982a 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 93721ea547..22f5467118 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 cbdd38d5d0..18d5ec421f 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 815dd262c8..2fec8d9704 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 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 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 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 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 0000000000..afdb5bb260 --- /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 c4f2d35d04..0e7192c853 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 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 -- GitLab