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/05/25 06:52:25 UTC
[skywalking] 01/01: Allow multiple definitions as fallback in
`k8sServiceNameRule`.
This is an automated email from the ASF dual-hosted git repository.
kezhenxu94 pushed a commit to branch fix/k8s-mesh-multiple
in repository https://gitbox.apache.org/repos/asf/skywalking.git
commit 068534468c59a9f92ab97104754953834bc03d68
Author: kezhenxu94 <ke...@apache.org>
AuthorDate: Tue May 25 14:51:55 2021 +0800
Allow multiple definitions as fallback in `k8sServiceNameRule`.
This patch also unifies the usage of `UNKNOWN` service
---
CHANGES.md | 2 +-
.../receiver/envoy/ServiceMetaInfoFactoryImpl.java | 4 +++-
.../oap/server/receiver/envoy/als/ServiceMetaInfo.java | 2 --
.../receiver/envoy/als/k8s/K8SServiceRegistry.java | 8 ++++++--
.../envoy/als/k8s/K8sALSServiceMeshHTTPAnalysis.java | 8 ++++++--
.../receiver/envoy/als/k8s/ServiceNameFormatter.java | 17 +++++++++++++++--
.../envoy/als/mx/MetaExchangeALSHTTPAnalyzer.java | 3 +--
.../envoy/als/tcp/k8s/K8sALSServiceMeshTCPAnalysis.java | 8 ++++++--
.../als/tcp/mx/MetaExchangeTCPAccessLogAnalyzer.java | 3 +--
.../als/k8s/K8SALSServiceMeshHTTPAnalysisTest.java | 12 ++++++++++--
.../envoy/als/k8s/ServiceNameFormatterTest.java | 10 ++++++++++
11 files changed, 59 insertions(+), 18 deletions(-)
diff --git a/CHANGES.md b/CHANGES.md
index feff860..9aa678e 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -45,7 +45,7 @@ Release Notes.
* Support analyzing Envoy TCP access logs and persist error TCP logs.
* Fix: Envoy error logs are not persisted when no metrics are generated
* Fix: Memory leakage of low version etcd client. [fix-issue](https://github.com/jurmous/etcd4j/pull/185)
-* Allow multiple definitions as fallback in metadata-service-mapping.yaml file.
+* Allow multiple definitions as fallback in metadata-service-mapping.yaml file and `k8sServiceNameRule`.
* Fix: NPE when configmap has no data.
* Fix: Dynamic Configuration key `slowTraceSegmentThreshold` not work
* Fix: `!=` is not supported in oal when parameters are numbers.
diff --git a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/ServiceMetaInfoFactoryImpl.java b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/ServiceMetaInfoFactoryImpl.java
index a89a55b..516989c 100644
--- a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/ServiceMetaInfoFactoryImpl.java
+++ b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/ServiceMetaInfoFactoryImpl.java
@@ -23,6 +23,8 @@ import org.apache.skywalking.oap.server.receiver.envoy.als.ServiceMetaInfo;
import org.apache.skywalking.oap.server.receiver.envoy.als.mx.ServiceMetaInfoAdapter;
public class ServiceMetaInfoFactoryImpl implements ServiceMetaInfoFactory {
+ private static final ServiceMetaInfo UNKNOWN = new ServiceMetaInfo("UNKNOWN", "UNKNOWN");
+
@Override
public Class<? extends ServiceMetaInfo> clazz() {
return ServiceMetaInfo.class;
@@ -30,7 +32,7 @@ public class ServiceMetaInfoFactoryImpl implements ServiceMetaInfoFactory {
@Override
public ServiceMetaInfo unknown() {
- return new ServiceMetaInfo("UNKNOWN", "UNKNOWN");
+ return UNKNOWN;
}
@Override
diff --git a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/ServiceMetaInfo.java b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/ServiceMetaInfo.java
index 75a9c3c..feeb4c5 100644
--- a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/ServiceMetaInfo.java
+++ b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/ServiceMetaInfo.java
@@ -54,6 +54,4 @@ public class ServiceMetaInfo {
private final String value;
}
-
- public static final ServiceMetaInfo UNKNOWN = new ServiceMetaInfo("UNKNOWN", "UNKNOWN");
}
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 410c382..abd3f35 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
@@ -64,7 +64,11 @@ public class K8SServiceRegistry {
protected final ServiceNameFormatter serviceNameFormatter;
+ private final EnvoyMetricReceiverConfig config;
+
public K8SServiceRegistry(final EnvoyMetricReceiverConfig config) {
+ this.config = config;
+
serviceNameFormatter = new ServiceNameFormatter(config.getK8sServiceNameRule());
ipServiceMetaInfoMap = new ConcurrentHashMap<>();
idServiceMap = new ConcurrentHashMap<>();
@@ -267,7 +271,7 @@ public class K8SServiceRegistry {
final ServiceMetaInfo service = ipServiceMetaInfoMap.get(ip);
if (isNull(service)) {
log.debug("Unknown ip {}, ip -> service is null", ip);
- return ServiceMetaInfo.UNKNOWN;
+ return config.serviceMetaInfoFactory().unknown();
}
return service;
}
@@ -297,7 +301,7 @@ public class K8SServiceRegistry {
final V1ObjectMeta serviceMetadata = service.getMetadata();
if (isNull(serviceMetadata)) {
log.warn("Service metadata is null, {}", service);
- return ServiceMetaInfo.UNKNOWN;
+ return config.serviceMetaInfoFactory().unknown();
}
serviceMetaInfo.setServiceName(serviceMetadata.getName());
}
diff --git a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/k8s/K8sALSServiceMeshHTTPAnalysis.java b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/k8s/K8sALSServiceMeshHTTPAnalysis.java
index f521a3e..b0e53c1 100644
--- a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/k8s/K8sALSServiceMeshHTTPAnalysis.java
+++ b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/k8s/K8sALSServiceMeshHTTPAnalysis.java
@@ -30,6 +30,7 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.skywalking.apm.network.servicemesh.v3.ServiceMeshMetric;
import org.apache.skywalking.oap.server.library.module.ModuleManager;
import org.apache.skywalking.oap.server.receiver.envoy.EnvoyMetricReceiverConfig;
+import org.apache.skywalking.oap.server.receiver.envoy.ServiceMetaInfoFactory;
import org.apache.skywalking.oap.server.receiver.envoy.als.AbstractALSAnalyzer;
import org.apache.skywalking.oap.server.receiver.envoy.als.Role;
import org.apache.skywalking.oap.server.receiver.envoy.als.ServiceMetaInfo;
@@ -46,6 +47,8 @@ import static org.apache.skywalking.oap.server.receiver.envoy.als.k8s.Addresses.
public class K8sALSServiceMeshHTTPAnalysis extends AbstractALSAnalyzer {
protected K8SServiceRegistry serviceRegistry;
+ protected EnvoyMetricReceiverConfig config;
+
@Override
public String name() {
return "k8s-mesh";
@@ -54,6 +57,7 @@ public class K8sALSServiceMeshHTTPAnalysis extends AbstractALSAnalyzer {
@Override
@SneakyThrows
public void init(ModuleManager manager, EnvoyMetricReceiverConfig config) {
+ this.config = config;
serviceRegistry = new K8SServiceRegistry(config);
serviceRegistry.start();
}
@@ -107,7 +111,7 @@ public class K8sALSServiceMeshHTTPAnalysis extends AbstractALSAnalyzer {
if (cluster.startsWith("inbound|")) {
// Server side
final ServiceMeshMetric.Builder metrics;
- if (downstreamService.equals(ServiceMetaInfo.UNKNOWN)) {
+ if (downstreamService.equals(config.serviceMetaInfoFactory().unknown())) {
// Ingress -> sidecar(server side)
// Mesh telemetry without source, the relation would be generated.
metrics = newAdapter(entry, null, localService).adaptToDownstreamMetrics();
@@ -178,7 +182,7 @@ public class K8sALSServiceMeshHTTPAnalysis extends AbstractALSAnalyzer {
}
/**
- * @return found service info, or {@link ServiceMetaInfo#UNKNOWN} to represent not found.
+ * @return found service info, or {@link ServiceMetaInfoFactory#unknown()} to represent not found.
*/
protected ServiceMetaInfo find(String ip) {
return serviceRegistry.findService(ip);
diff --git a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/k8s/ServiceNameFormatter.java b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/k8s/ServiceNameFormatter.java
index 64d34ae..3709061 100644
--- a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/k8s/ServiceNameFormatter.java
+++ b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/k8s/ServiceNameFormatter.java
@@ -22,8 +22,10 @@ import com.google.common.base.Strings;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import java.util.stream.Stream;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.lang3.StringUtils;
@@ -34,7 +36,7 @@ public class ServiceNameFormatter {
private final StringBuffer serviceNamePattern;
public ServiceNameFormatter(String rule) {
- rule = StringUtils.defaultIfBlank(rule, "${pod.metadata.labels.(service.istio.io/canonical-name)}");
+ rule = StringUtils.defaultIfBlank(rule, "${pod.metadata.labels.(service.istio.io/canonical-name),pod.metadata.labels.(app.kubernetes.io/name),pod.metadata.labels.app)}");
this.properties = new ArrayList<>();
this.serviceNamePattern = new StringBuffer();
@@ -52,7 +54,18 @@ public class ServiceNameFormatter {
final Object[] values = new Object[properties.size()];
for (int i = 0; i < properties.size(); i++) {
- final Object value = PropertyUtils.getProperty(context, properties.get(i));
+ final String property = properties.get(i);
+ final Object value = Stream.of(property.split(","))
+ .map(it -> {
+ try {
+ return PropertyUtils.getProperty(context, it);
+ } catch (Exception e) {
+ return null;
+ }
+ })
+ .filter(it -> Objects.nonNull(it) && !Strings.isNullOrEmpty(it.toString()))
+ .findFirst()
+ .orElse("-");
values[i] = value;
}
diff --git a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/mx/MetaExchangeALSHTTPAnalyzer.java b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/mx/MetaExchangeALSHTTPAnalyzer.java
index 81a3d10..047b89b 100644
--- a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/mx/MetaExchangeALSHTTPAnalyzer.java
+++ b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/mx/MetaExchangeALSHTTPAnalyzer.java
@@ -39,7 +39,6 @@ import org.apache.skywalking.oap.server.receiver.envoy.als.ServiceMetaInfo;
import static org.apache.skywalking.oap.server.library.util.CollectionUtils.isNotEmpty;
import static org.apache.skywalking.oap.server.receiver.envoy.als.LogEntry2MetricsAdapter.NON_TLS;
-import static org.apache.skywalking.oap.server.receiver.envoy.als.ServiceMetaInfo.UNKNOWN;
@Slf4j
public class MetaExchangeALSHTTPAnalyzer extends AbstractALSAnalyzer {
@@ -126,7 +125,7 @@ public class MetaExchangeALSHTTPAnalyzer extends AbstractALSAnalyzer {
}
});
if (role.equals(Role.PROXY) && !downstreamExists.get()) {
- final ServiceMeshMetric.Builder metric = newAdapter(entry, UNKNOWN, currSvc).adaptToDownstreamMetrics();
+ final ServiceMeshMetric.Builder metric = newAdapter(entry, config.serviceMetaInfoFactory().unknown(), currSvc).adaptToDownstreamMetrics();
if (log.isDebugEnabled()) {
log.debug("Transformed a {} inbound mesh metric {}", role, TextFormat.shortDebugString(metric));
}
diff --git a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/tcp/k8s/K8sALSServiceMeshTCPAnalysis.java b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/tcp/k8s/K8sALSServiceMeshTCPAnalysis.java
index fffbd83..d40ce02 100644
--- a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/tcp/k8s/K8sALSServiceMeshTCPAnalysis.java
+++ b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/tcp/k8s/K8sALSServiceMeshTCPAnalysis.java
@@ -30,6 +30,7 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.skywalking.apm.network.servicemesh.v3.ServiceMeshMetric;
import org.apache.skywalking.oap.server.library.module.ModuleManager;
import org.apache.skywalking.oap.server.receiver.envoy.EnvoyMetricReceiverConfig;
+import org.apache.skywalking.oap.server.receiver.envoy.ServiceMetaInfoFactory;
import org.apache.skywalking.oap.server.receiver.envoy.als.Role;
import org.apache.skywalking.oap.server.receiver.envoy.als.ServiceMetaInfo;
import org.apache.skywalking.oap.server.receiver.envoy.als.k8s.K8SServiceRegistry;
@@ -45,6 +46,8 @@ import static org.apache.skywalking.oap.server.receiver.envoy.als.LogEntry2Metri
public class K8sALSServiceMeshTCPAnalysis extends AbstractTCPAccessLogAnalyzer {
protected K8SServiceRegistry serviceRegistry;
+ private EnvoyMetricReceiverConfig config;
+
@Override
public String name() {
return "k8s-mesh";
@@ -53,6 +56,7 @@ public class K8sALSServiceMeshTCPAnalysis extends AbstractTCPAccessLogAnalyzer {
@Override
@SneakyThrows
public void init(ModuleManager manager, EnvoyMetricReceiverConfig config) {
+ this.config = config;
serviceRegistry = new K8SServiceRegistry(config);
serviceRegistry.start();
}
@@ -103,7 +107,7 @@ public class K8sALSServiceMeshTCPAnalysis extends AbstractTCPAccessLogAnalyzer {
if (cluster.startsWith("inbound|")) {
// Server side
final ServiceMeshMetric.Builder metrics;
- if (downstreamService.equals(ServiceMetaInfo.UNKNOWN)) {
+ if (downstreamService.equals(config.serviceMetaInfoFactory().unknown())) {
// Ingress -> sidecar(server side)
// Mesh telemetry without source, the relation would be generated.
metrics = newAdapter(entry, null, localService).adaptToDownstreamMetrics();
@@ -171,7 +175,7 @@ public class K8sALSServiceMeshTCPAnalysis extends AbstractTCPAccessLogAnalyzer {
}
/**
- * @return found service info, or {@link ServiceMetaInfo#UNKNOWN} to represent not found.
+ * @return found service info, or {@link ServiceMetaInfoFactory#unknown()} to represent not found.
*/
protected ServiceMetaInfo find(String ip) {
return serviceRegistry.findService(ip);
diff --git a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/tcp/mx/MetaExchangeTCPAccessLogAnalyzer.java b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/tcp/mx/MetaExchangeTCPAccessLogAnalyzer.java
index 0ac1db6..20772be 100644
--- a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/tcp/mx/MetaExchangeTCPAccessLogAnalyzer.java
+++ b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/tcp/mx/MetaExchangeTCPAccessLogAnalyzer.java
@@ -41,7 +41,6 @@ import org.apache.skywalking.oap.server.receiver.envoy.als.tcp.AbstractTCPAccess
import static org.apache.skywalking.oap.server.library.util.CollectionUtils.isNotEmpty;
import static org.apache.skywalking.oap.server.receiver.envoy.als.LogEntry2MetricsAdapter.NON_TLS;
-import static org.apache.skywalking.oap.server.receiver.envoy.als.ServiceMetaInfo.UNKNOWN;
import static org.apache.skywalking.oap.server.receiver.envoy.als.mx.MetaExchangeALSHTTPAnalyzer.DOWNSTREAM_KEY;
import static org.apache.skywalking.oap.server.receiver.envoy.als.mx.MetaExchangeALSHTTPAnalyzer.UPSTREAM_KEY;
@@ -125,7 +124,7 @@ public class MetaExchangeTCPAccessLogAnalyzer extends AbstractTCPAccessLogAnalyz
}
});
if (role.equals(Role.PROXY) && !downstreamExists.get()) {
- final ServiceMeshMetric.Builder metric = newAdapter(entry, UNKNOWN, currSvc).adaptToDownstreamMetrics();
+ final ServiceMeshMetric.Builder metric = newAdapter(entry, config.serviceMetaInfoFactory().unknown(), currSvc).adaptToDownstreamMetrics();
if (log.isDebugEnabled()) {
log.debug("Transformed a {} inbound mesh metric {}", role, TextFormat.shortDebugString(metric));
}
diff --git a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/envoy/als/k8s/K8SALSServiceMeshHTTPAnalysisTest.java b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/envoy/als/k8s/K8SALSServiceMeshHTTPAnalysisTest.java
index abe7073..4c524c0 100644
--- a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/envoy/als/k8s/K8SALSServiceMeshHTTPAnalysisTest.java
+++ b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/envoy/als/k8s/K8SALSServiceMeshHTTPAnalysisTest.java
@@ -28,6 +28,8 @@ import org.apache.skywalking.apm.network.servicemesh.v3.ServiceMeshMetric;
import org.apache.skywalking.oap.server.library.module.ModuleManager;
import org.apache.skywalking.oap.server.receiver.envoy.EnvoyMetricReceiverConfig;
import org.apache.skywalking.oap.server.receiver.envoy.MetricServiceGRPCHandlerTestMain;
+import org.apache.skywalking.oap.server.receiver.envoy.ServiceMetaInfoFactory;
+import org.apache.skywalking.oap.server.receiver.envoy.ServiceMetaInfoFactoryImpl;
import org.apache.skywalking.oap.server.receiver.envoy.als.AccessLogAnalyzer;
import org.apache.skywalking.oap.server.receiver.envoy.als.Role;
import org.apache.skywalking.oap.server.receiver.envoy.als.ServiceMetaInfo;
@@ -46,7 +48,12 @@ public class K8SALSServiceMeshHTTPAnalysisTest {
@Before
public void setUp() {
analysis = new MockK8SAnalysis();
- analysis.init(null, null);
+ analysis.init(null, new EnvoyMetricReceiverConfig() {
+ @Override
+ public ServiceMetaInfoFactory serviceMetaInfoFactory() {
+ return new ServiceMetaInfoFactoryImpl();
+ }
+ });
}
@Test
@@ -148,8 +155,9 @@ public class K8SALSServiceMeshHTTPAnalysisTest {
@Override
public void init(ModuleManager manager, EnvoyMetricReceiverConfig config) {
+ super.init(manager, config);
serviceRegistry = mock(K8SServiceRegistry.class);
- when(serviceRegistry.findService(anyString())).thenReturn(ServiceMetaInfo.UNKNOWN);
+ when(serviceRegistry.findService(anyString())).thenReturn(config.serviceMetaInfoFactory().unknown());
when(serviceRegistry.findService("10.44.2.56")).thenReturn(new ServiceMetaInfo("ingress", "ingress-Inst"));
when(serviceRegistry.findService("10.44.2.54")).thenReturn(new ServiceMetaInfo("productpage", "productpage-Inst"));
when(serviceRegistry.findService("10.44.6.66")).thenReturn(new ServiceMetaInfo("detail", "detail-Inst"));
diff --git a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/envoy/als/k8s/ServiceNameFormatterTest.java b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/envoy/als/k8s/ServiceNameFormatterTest.java
index 7dd1981..687f7cb 100644
--- a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/envoy/als/k8s/ServiceNameFormatterTest.java
+++ b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/envoy/als/k8s/ServiceNameFormatterTest.java
@@ -58,6 +58,16 @@ public class ServiceNameFormatterTest {
"${pod.metadata.labels.(service.istio.io/canonical-name)}",
ImmutableMap.of("service", service("Clash"), "pod", pod(of("service.istio.io/canonical-name", "ClashX-alpha"))),
"ClashX-alpha"
+ ),
+ new Case(
+ "${pod.metadata.labels.NOT_EXISTS}",
+ ImmutableMap.of("service", service("Clash"), "pod", pod(of("service.istio.io/canonical-name", "ClashX-alpha"))),
+ "-"
+ ),
+ new Case(
+ "${pod.metadata.labels.NOT_EXISTS,pod.metadata.labels.(service.istio.io/canonical-name),pod.metadata.labels.app}",
+ ImmutableMap.of("service", service("Clash"), "pod", pod(of("app", "ClashX-alpha"))),
+ "ClashX-alpha"
)
};
}