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()));