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 <[email protected]> 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" ) }; }
