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:09 UTC

[skywalking] branch defence/k8s-registry created (now 2b9fcf8)

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

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


      at 2b9fcf8  Add some defensive codes for NPE and bump up Kubernetes client version to expose exception stack trace

This branch includes the following new commits:

     new 2b9fcf8  Add some defensive codes for NPE and bump up Kubernetes client version to expose exception stack trace

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



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

Posted by ke...@apache.org.
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()));