You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by ke...@apache.org on 2021/02/05 04:14:10 UTC

[skywalking] 01/01: Add some defensive codes for NPE and bump up Kubernetes client version to expose exception stack trace

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

kezhenxu94 pushed a commit to branch defence/k8s-registry
in repository https://gitbox.apache.org/repos/asf/skywalking.git

commit 2b9fcf8d9acfaae041ad62f9d2dfc8d25854a2c6
Author: kezhenxu94 <ke...@apache.org>
AuthorDate: Fri Feb 5 12:13:42 2021 +0800

    Add some defensive codes for NPE and bump up Kubernetes client version to expose exception stack trace
---
 CHANGES.md                                         |  1 +
 oap-server/pom.xml                                 |  2 +-
 .../receiver/envoy/als/k8s/K8SServiceRegistry.java | 50 ++++++++++++++--------
 3 files changed, 34 insertions(+), 19 deletions(-)

diff --git a/CHANGES.md b/CHANGES.md
index c411a66..08902b5 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -15,6 +15,7 @@ Release Notes.
 #### OAP-Backend
 * Allow user-defined `JAVA_OPTS` in the startup script.
 * Metrics combination API supports abandoning results.
+* Add some defensive codes for NPE and bump up Kubernetes client version to expose exception stack trace.
 
 #### UI
 Update selector scroller to show in all pages.
diff --git a/oap-server/pom.xml b/oap-server/pom.xml
index 902d7b1..4683982 100755
--- a/oap-server/pom.xml
+++ b/oap-server/pom.xml
@@ -68,7 +68,7 @@
         <commons-io.version>2.6</commons-io.version>
         <elasticsearch.version>6.3.2</elasticsearch.version>
         <joda-time.version>2.10.5</joda-time.version>
-        <kubernetes.version>8.0.0</kubernetes.version>
+        <kubernetes.version>10.0.0</kubernetes.version>
         <hikaricp.version>3.1.0</hikaricp.version>
         <zipkin.version>2.9.1</zipkin.version>
         <caffeine.version>2.6.2</caffeine.version>
diff --git a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/k8s/K8SServiceRegistry.java b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/k8s/K8SServiceRegistry.java
index 5ecb379..104360e 100644
--- a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/k8s/K8SServiceRegistry.java
+++ b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/k8s/K8SServiceRegistry.java
@@ -37,7 +37,6 @@ import java.io.IOException;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
-import java.util.Optional;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -49,7 +48,7 @@ import org.apache.skywalking.oap.server.receiver.envoy.als.ServiceMetaInfo;
 
 import static com.google.common.base.Strings.isNullOrEmpty;
 import static java.util.Objects.isNull;
-import static java.util.Objects.requireNonNull;
+import static java.util.Optional.ofNullable;
 
 @Slf4j
 public class K8SServiceRegistry {
@@ -201,7 +200,7 @@ public class K8SServiceRegistry {
     }
 
     protected void addService(final V1Service service) {
-        Optional.ofNullable(service.getMetadata()).ifPresent(
+        ofNullable(service.getMetadata()).ifPresent(
             metadata -> idServiceMap.put(metadata.getNamespace() + ":" + metadata.getName(), service)
         );
 
@@ -209,13 +208,13 @@ public class K8SServiceRegistry {
     }
 
     protected void removeService(final V1Service service) {
-        Optional.ofNullable(service.getMetadata()).ifPresent(
+        ofNullable(service.getMetadata()).ifPresent(
             metadata -> idServiceMap.remove(metadata.getUid())
         );
     }
 
     protected void addPod(final V1Pod pod) {
-        Optional.ofNullable(pod.getStatus()).ifPresent(
+        ofNullable(pod.getStatus()).ifPresent(
             status -> ipPodMap.put(status.getPodIP(), pod)
         );
 
@@ -223,30 +222,36 @@ public class K8SServiceRegistry {
     }
 
     protected void removePod(final V1Pod pod) {
-        Optional.ofNullable(pod.getStatus()).ifPresent(
+        ofNullable(pod.getStatus()).ifPresent(
             status -> ipPodMap.remove(status.getPodIP())
         );
     }
 
     protected void addEndpoints(final V1Endpoints endpoints) {
-        final String namespace = requireNonNull(endpoints.getMetadata()).getNamespace();
-        final String name = requireNonNull(endpoints.getMetadata()).getName();
+        V1ObjectMeta endpointsMetadata = endpoints.getMetadata();
+        if (isNull(endpointsMetadata)) {
+            log.error("Endpoints metadata is null: {}", endpoints);
+            return;
+        }
+
+        final String namespace = endpointsMetadata.getNamespace();
+        final String name = endpointsMetadata.getName();
 
-        requireNonNull(endpoints.getSubsets()).forEach(
-            subset -> requireNonNull(subset.getAddresses()).forEach(
+        ofNullable(endpoints.getSubsets()).ifPresent(subsets -> subsets.forEach(
+            subset -> ofNullable(subset.getAddresses()).ifPresent(addresses -> addresses.forEach(
                 address -> ipServiceMap.put(address.getIp(), namespace + ":" + name)
-            )
-        );
+            ))
+        ));
 
         recompose();
     }
 
     protected void removeEndpoints(final V1Endpoints endpoints) {
-        requireNonNull(endpoints.getSubsets()).forEach(
-            subset -> requireNonNull(subset.getAddresses()).forEach(
+        ofNullable(endpoints.getSubsets()).ifPresent(subsets -> subsets.forEach(
+            subset -> ofNullable(subset.getAddresses()).ifPresent(addresses -> addresses.forEach(
                 address -> ipServiceMap.remove(address.getIp())
-            )
-        );
+            ))
+        ));
     }
 
     protected List<ServiceMetaInfo.KeyValue> transformLabelsToTags(final Map<String, String> labels) {
@@ -277,7 +282,11 @@ public class K8SServiceRegistry {
             }
 
             final Map<String, Object> context = ImmutableMap.of("service", service, "pod", pod);
-            final V1ObjectMeta podMetadata = requireNonNull(pod.getMetadata());
+            final V1ObjectMeta podMetadata = pod.getMetadata();
+            if (isNull(podMetadata)) {
+                log.warn("Pod metadata is null, {}", pod);
+                return;
+            }
 
             ipServiceMetaInfoMap.computeIfAbsent(ip, unused -> {
                 final ServiceMetaInfo serviceMetaInfo = new ServiceMetaInfo();
@@ -286,7 +295,12 @@ public class K8SServiceRegistry {
                     serviceMetaInfo.setServiceName(serviceNameFormatter.format(context));
                 } catch (Exception e) {
                     log.error("Failed to evaluate service name.", e);
-                    serviceMetaInfo.setServiceName(requireNonNull(service.getMetadata()).getName());
+                    final V1ObjectMeta serviceMetadata = service.getMetadata();
+                    if (isNull(serviceMetadata)) {
+                        log.warn("Service metadata is null, {}", service);
+                        return ServiceMetaInfo.UNKNOWN;
+                    }
+                    serviceMetaInfo.setServiceName(serviceMetadata.getName());
                 }
                 serviceMetaInfo.setServiceInstanceName(
                     String.format("%s.%s", podMetadata.getName(), podMetadata.getNamespace()));