You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by wu...@apache.org on 2022/03/22 15:48:27 UTC

[skywalking] branch master updated: Insure span analyze isNormal and Layer consistent. (#8724)

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

wusheng pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/skywalking.git


The following commit(s) were added to refs/heads/master by this push:
     new 0dfb93a  Insure span analyze isNormal and Layer consistent. (#8724)
0dfb93a is described below

commit 0dfb93a2d1637aa7514914858a2e082cd3327d30
Author: Kai <wa...@foxmail.com>
AuthorDate: Tue Mar 22 23:48:00 2022 +0800

    Insure span analyze isNormal and Layer consistent. (#8724)
---
 .../listener/MultiScopesAnalysisListener.java      | 22 +++++----
 .../trace/parser/listener/SourceBuilder.java       | 22 ++-------
 .../log/listener/TrafficAnalysisListener.java      |  3 +-
 .../skywalking/oap/meter/analyzer/Analyzer.java    |  1 -
 .../skywalking/oap/server/core/analysis/Layer.java | 53 ++++++++++++++--------
 .../manual/service/ServiceMetaDispatcher.java      |  1 -
 .../analysis/manual/service/ServiceTraffic.java    | 19 ++------
 .../manual/service/ServiceTrafficDispatcher.java   |  1 -
 .../oap/server/core/source/Endpoint.java           |  8 ++--
 .../oap/server/core/source/EndpointRelation.java   | 15 +++---
 .../skywalking/oap/server/core/source/Service.java |  5 +-
 .../oap/server/core/source/ServiceInstance.java    |  4 +-
 .../core/source/ServiceInstanceRelation.java       |  8 +---
 .../oap/server/core/source/ServiceMeta.java        |  4 +-
 .../oap/server/core/source/ServiceRelation.java    |  8 +---
 .../provider/handler/ServiceManagementHandler.java |  1 -
 .../handler/EBPFProcessServiceHandler.java         |  1 -
 .../handler/v8/ManagementServiceHandler.java       |  1 -
 .../receiver/mesh/TelemetryDataDispatcher.java     |  8 +---
 skywalking-ui                                      |  2 +-
 20 files changed, 82 insertions(+), 105 deletions(-)

diff --git a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/MultiScopesAnalysisListener.java b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/MultiScopesAnalysisListener.java
index f34c125..4e3d4d2 100644
--- a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/MultiScopesAnalysisListener.java
+++ b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/MultiScopesAnalysisListener.java
@@ -103,14 +103,17 @@ public class MultiScopesAnalysisListener implements EntryAnalysisListener, ExitA
                 }
 
                 final String networkAddressUsedAtPeer = reference.getNetworkAddressUsedAtPeer();
-
-                if (span.getSpanLayer().equals(SpanLayer.MQ) ||
-                    config.getUninstrumentedGatewaysConfig().isAddressConfiguredAsGateway(networkAddressUsedAtPeer)) {
+                boolean isMQ = span.getSpanLayer().equals(SpanLayer.MQ);
+                if (isMQ || config.getUninstrumentedGatewaysConfig()
+                                  .isAddressConfiguredAsGateway(networkAddressUsedAtPeer)) {
                     sourceBuilder.setSourceServiceName(networkAddressUsedAtPeer);
                     sourceBuilder.setSourceEndpointOwnerServiceName(reference.getParentService());
                     sourceBuilder.setSourceServiceInstanceName(networkAddressUsedAtPeer);
-                    sourceBuilder.setSourceLayer(Layer.VIRTUAL_MQ);
-                    sourceBuilder.setSourceNormal(false);
+                    if (isMQ) {
+                        sourceBuilder.setSourceLayer(Layer.VIRTUAL_MQ);
+                    } else {
+                        sourceBuilder.setSourceLayer(Layer.VIRTUAL_GATEWAY);
+                    }
                 } else {
                     sourceBuilder.setSourceServiceName(reference.getParentService());
                     sourceBuilder.setSourceServiceInstanceName(reference.getParentServiceInstance());
@@ -131,7 +134,6 @@ public class MultiScopesAnalysisListener implements EntryAnalysisListener, ExitA
             sourceBuilder.setSourceServiceInstanceName(Const.USER_INSTANCE_NAME);
             sourceBuilder.setSourceEndpointName(Const.USER_ENDPOINT_NAME);
             sourceBuilder.setSourceLayer(Layer.UNDEFINED);
-            sourceBuilder.setSourceNormal(false);
             sourceBuilder.setDestServiceInstanceName(segmentObject.getServiceInstance());
             sourceBuilder.setDestServiceName(segmentObject.getService());
             sourceBuilder.setDestLayer(identifyServiceLayer(span.getSpanLayer()));
@@ -171,8 +173,7 @@ public class MultiScopesAnalysisListener implements EntryAnalysisListener, ExitA
         if (networkAddressAlias == null) {
             sourceBuilder.setDestServiceName(networkAddress);
             sourceBuilder.setDestServiceInstanceName(networkAddress);
-            sourceBuilder.setDestLayer(identifyRemoteServiceLayer(span.getSpanLayer()));
-            sourceBuilder.setDestNormal(false);
+            sourceBuilder.setDestLayer(identifyRemoteServiceLayer(span.getSpanLayer(), span.getPeer()));
         } else {
             /*
              * If alias exists, mean this network address is representing a real service.
@@ -378,7 +379,7 @@ public class MultiScopesAnalysisListener implements EntryAnalysisListener, ExitA
     /**
      * Identify the layer of remote service. Such as  ${@link Layer#DATABASE} and ${@link Layer#CACHE}.
      */
-    private Layer identifyRemoteServiceLayer(SpanLayer spanLayer) {
+    private Layer identifyRemoteServiceLayer(SpanLayer spanLayer, String peer) {
         switch (spanLayer) {
             case Unknown:
                 return Layer.UNDEFINED;
@@ -387,6 +388,9 @@ public class MultiScopesAnalysisListener implements EntryAnalysisListener, ExitA
             case RPCFramework:
                 return Layer.GENERAL;
             case Http:
+                if (config.getUninstrumentedGatewaysConfig().isAddressConfiguredAsGateway(peer)) {
+                    return Layer.VIRTUAL_GATEWAY;
+                }
                 return Layer.GENERAL;
             case MQ:
                 return Layer.MQ;
diff --git a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/SourceBuilder.java b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/SourceBuilder.java
index b45745b..67386d4 100644
--- a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/SourceBuilder.java
+++ b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/SourceBuilder.java
@@ -52,9 +52,6 @@ class SourceBuilder {
     private Layer sourceLayer;
     @Getter
     @Setter
-    private boolean isSourceNormal = true;
-    @Getter
-    @Setter
     private String sourceServiceInstanceName;
     /**
      * Source endpoint could be not owned by {@link #sourceServiceName}, such as in the MQ or un-instrumented proxy
@@ -74,9 +71,6 @@ class SourceBuilder {
     private Layer destLayer;
     @Getter
     @Setter
-    private boolean isDestNormal = true;
-    @Getter
-    @Setter
     private String destServiceInstanceName;
     @Getter
     @Setter
@@ -133,7 +127,6 @@ class SourceBuilder {
         service.setServiceInstanceName(destServiceInstanceName);
         service.setEndpointName(destEndpointName);
         service.setLayer(destLayer);
-        service.setNormal(isDestNormal);
         service.setLatency(latency);
         service.setStatus(status);
         service.setResponseCode(responseCode);
@@ -152,11 +145,9 @@ class SourceBuilder {
     ServiceRelation toServiceRelation() {
         ServiceRelation serviceRelation = new ServiceRelation();
         serviceRelation.setSourceServiceName(sourceServiceName);
-        serviceRelation.setSourceNormal(isSourceNormal);
         serviceRelation.setSourceServiceInstanceName(sourceServiceInstanceName);
         serviceRelation.setSourceLayer(sourceLayer);
         serviceRelation.setDestServiceName(destServiceName);
-        serviceRelation.setDestNormal(isDestNormal);
         serviceRelation.setDestServiceInstanceName(destServiceInstanceName);
         serviceRelation.setDestLayer(destLayer);
         serviceRelation.setEndpoint(destEndpointName);
@@ -180,7 +171,6 @@ class SourceBuilder {
         ServiceInstance serviceInstance = new ServiceInstance();
         serviceInstance.setName(destServiceInstanceName);
         serviceInstance.setServiceName(destServiceName);
-        serviceInstance.setServiceNormal(isDestNormal);
         serviceInstance.setLayer(destLayer);
         serviceInstance.setEndpointName(destEndpointName);
         serviceInstance.setLatency(latency);
@@ -204,11 +194,9 @@ class SourceBuilder {
         }
         ServiceInstanceRelation serviceInstanceRelation = new ServiceInstanceRelation();
         serviceInstanceRelation.setSourceServiceName(sourceServiceName);
-        serviceInstanceRelation.setSourceServiceNormal(isSourceNormal);
         serviceInstanceRelation.setSourceServiceInstanceName(sourceServiceInstanceName);
         serviceInstanceRelation.setSourceServiceLayer(sourceLayer);
         serviceInstanceRelation.setDestServiceName(destServiceName);
-        serviceInstanceRelation.setDestServiceNormal(isDestNormal);
         serviceInstanceRelation.setDestServiceInstanceName(destServiceInstanceName);
         serviceInstanceRelation.setDestServiceLayer(destLayer);
         serviceInstanceRelation.setEndpoint(destEndpointName);
@@ -231,7 +219,7 @@ class SourceBuilder {
         Endpoint endpoint = new Endpoint();
         endpoint.setName(destEndpointName);
         endpoint.setServiceName(destServiceName);
-        endpoint.setServiceNormal(isDestNormal);
+        endpoint.setServiceLayer(destLayer);
         endpoint.setServiceInstanceName(destServiceInstanceName);
         endpoint.setLatency(latency);
         endpoint.setStatus(status);
@@ -256,15 +244,15 @@ class SourceBuilder {
         endpointRelation.setEndpoint(sourceEndpointName);
         if (sourceEndpointOwnerServiceName == null) {
             endpointRelation.setServiceName(sourceServiceName);
-            endpointRelation.setServiceNormal(isSourceNormal);
+            endpointRelation.setServiceLayer(sourceLayer);
         } else {
             endpointRelation.setServiceName(sourceEndpointOwnerServiceName);
-            endpointRelation.setServiceNormal(true);
+            endpointRelation.setServiceLayer(Layer.GENERAL);
         }
         endpointRelation.setServiceInstanceName(sourceServiceInstanceName);
         endpointRelation.setChildEndpoint(destEndpointName);
         endpointRelation.setChildServiceName(destServiceName);
-        endpointRelation.setChildServiceNormal(isDestNormal);
+        endpointRelation.setChildServiceLayer(destLayer);
         endpointRelation.setChildServiceInstanceName(destServiceInstanceName);
         endpointRelation.setComponentId(componentId);
         endpointRelation.setRpcLatency(latency);
@@ -286,7 +274,7 @@ class SourceBuilder {
         ServiceMeta service = new ServiceMeta();
         service.setName(destServiceName);
         service.setLayer(destLayer);
-        service.setNormal(isDestNormal);
+        service.setLayer(destLayer);
         service.setTimeBucket(timeBucket);
         return service;
     }
diff --git a/oap-server/analyzer/log-analyzer/src/main/java/org/apache/skywalking/oap/log/analyzer/provider/log/listener/TrafficAnalysisListener.java b/oap-server/analyzer/log-analyzer/src/main/java/org/apache/skywalking/oap/log/analyzer/provider/log/listener/TrafficAnalysisListener.java
index 5ac1d41..2c21eed 100644
--- a/oap-server/analyzer/log-analyzer/src/main/java/org/apache/skywalking/oap/log/analyzer/provider/log/listener/TrafficAnalysisListener.java
+++ b/oap-server/analyzer/log-analyzer/src/main/java/org/apache/skywalking/oap/log/analyzer/provider/log/listener/TrafficAnalysisListener.java
@@ -73,10 +73,9 @@ public class TrafficAnalysisListener implements LogAnalysisListener {
         final long timeBucket = TimeBucket.getTimeBucket(System.currentTimeMillis(), DownSampling.Minute);
         // to service traffic
         String serviceName = namingControl.formatServiceName(logData.getService());
-        String serviceId = IDManager.ServiceID.buildId(serviceName, true);
+        String serviceId = IDManager.ServiceID.buildId(serviceName, layer.isNormal());
         serviceMeta = new ServiceMeta();
         serviceMeta.setName(namingControl.formatServiceName(logData.getService()));
-        serviceMeta.setNormal(true);
         serviceMeta.setLayer(layer);
         serviceMeta.setTimeBucket(timeBucket);
         // to service instance traffic
diff --git a/oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/Analyzer.java b/oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/Analyzer.java
index f66eedc..f4c1ef3 100644
--- a/oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/Analyzer.java
+++ b/oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/Analyzer.java
@@ -298,7 +298,6 @@ public class Analyzer {
     private void toService(String serviceName, Layer layer) {
         ServiceTraffic s = new ServiceTraffic();
         s.setName(requireNonNull(serviceName));
-        s.setNormal(true);
         s.setTimeBucket(TimeBucket.getMinuteTimeBucket(System.currentTimeMillis()));
         s.setLayer(layer);
         MetricsStreamProcessor.getInstance().in(s);
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/Layer.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/Layer.java
index 112f924..c3acfa9 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/Layer.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/Layer.java
@@ -25,99 +25,110 @@ import java.util.stream.Collectors;
 import org.apache.skywalking.oap.server.core.UnexpectedException;
 
 /**
- * Layer represents an abstract framework in computer science, such as Operating System(OS_LINUX layer),
- * Kubernetes(k8s layer). This kind of layer would be owners of different services/instances detected from different technology.
+ * Layer represents an abstract framework in computer science, such as Operating System(OS_LINUX layer), Kubernetes(k8s
+ * layer). This kind of layer would be owners of different services/instances detected from different technology.
  */
 public enum Layer {
     /**
      * Default Layer if the layer is not defined
      */
-    UNDEFINED(0),
+    UNDEFINED(0, false),
 
     /**
      * Envoy Access Log Service
      */
-    MESH(1),
+    MESH(1, true),
 
     /**
      * Agent-installed Service
      */
-    GENERAL(2),
+    GENERAL(2, true),
 
     /**
      * Operation System Linux
      */
-    OS_LINUX(3),
+    OS_LINUX(3, true),
 
     /**
      * Kubernetes, include pods, services, contains etc.
      */
-    K8S(4),
+    K8S(4, true),
 
     /**
      * Function as a Service
      */
-    FAAS(5),
+    FAAS(5, true),
 
     /**
      * Mesh control plane, eg. Istio control plane
      */
-    MESH_CP(6),
+    MESH_CP(6, true),
 
     /**
      * Mesh data plane, eg. Envoy
      */
-    MESH_DP(7),
+    MESH_DP(7, true),
 
     /**
      * Telemetry from real database
      */
-    DATABASE(8),
+    DATABASE(8, true),
 
     /**
      * Cache service eg. ehcache, guava-cache, memcache
      */
-    CACHE(9),
+    CACHE(9, true),
 
     /**
      * Telemetry from the Browser eg. Apache SkyWalking Client JS
      */
-    BROWSER(10),
+    BROWSER(10, true),
 
     /**
      * Self Observability of OAP
      */
-    SO11Y_OAP(11),
+    SO11Y_OAP(11, true),
 
     /**
      * Self Observability of Satellite
      */
-    SO11Y_SATELLITE(12),
+    SO11Y_SATELLITE(12, true),
 
     /**
      * Telemetry from the real MQ
      */
-    MQ(13),
+    MQ(13, true),
 
     /**
      * Database conjectured by client side plugin
      */
-    VIRTUAL_DATABASE(14),
+    VIRTUAL_DATABASE(14, false),
 
     /**
      * MQ conjectured by client side plugin
      */
-    VIRTUAL_MQ(15);
+    VIRTUAL_MQ(15, false),
+
+    /**
+     * The uninstrumented gateways configured in OAP
+     */
+    VIRTUAL_GATEWAY(16, false);
 
     private final int value;
+    /**
+     * The `normal` status represents this service is detected by an agent. The `un-normal` service is conjectured by
+     * telemetry data collected from agents on/in the `normal` service.
+     */
+    private final boolean isNormal;
     private static final Map<Integer, Layer> DICTIONARY = new HashMap<>();
 
     static {
         Arrays.stream(Layer.values()).collect(Collectors.toMap(Layer::value, layer -> layer)).forEach(DICTIONARY::put);
     }
 
-    Layer(int value) {
+    Layer(int value, boolean isNormal) {
         this.value = value;
+        this.isNormal = isNormal;
     }
 
     public int value() {
@@ -131,4 +142,8 @@ public enum Layer {
         }
         return layer;
     }
+
+    public boolean isNormal() {
+        return isNormal;
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/service/ServiceMetaDispatcher.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/service/ServiceMetaDispatcher.java
index f05622d..a8107cb 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/service/ServiceMetaDispatcher.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/service/ServiceMetaDispatcher.java
@@ -29,7 +29,6 @@ public class ServiceMetaDispatcher implements SourceDispatcher<ServiceMeta> {
         traffic.setTimeBucket(source.getTimeBucket());
         traffic.setName(source.getName());
         traffic.setLayer(source.getLayer());
-        traffic.setNormal(source.isNormal());
         MetricsStreamProcessor.getInstance().in(traffic);
     }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/service/ServiceTraffic.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/service/ServiceTraffic.java
index 8a537ac..0d56840 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/service/ServiceTraffic.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/service/ServiceTraffic.java
@@ -86,13 +86,6 @@ public class ServiceTraffic extends Metrics {
     private Layer layer = Layer.UNDEFINED;
 
     /**
-     * The `normal` status represents this service is detected by an agent. The `un-normal` service is conjectured by
-     * telemetry data collected from agents on/in the `normal` service.
-     */
-    @Setter
-    private boolean isNormal = true;
-
-    /**
      * Primary key(id), to identify a service with different layers, a service could have more than one layer and be
      * saved as different records.
      *
@@ -151,12 +144,10 @@ public class ServiceTraffic extends Metrics {
         public void entity2Storage(final ServiceTraffic storageData, final Convert2Storage converter) {
             final String serviceName = storageData.getName();
             storageData.setShortName(serviceName);
-            if (storageData.isNormal) {
-                int groupIdx = serviceName.indexOf(DOUBLE_COLONS_SPLIT);
-                if (groupIdx > 0) {
-                    storageData.setGroup(serviceName.substring(0, groupIdx));
-                    storageData.setShortName(serviceName.substring(groupIdx + 2));
-                }
+            int groupIdx = serviceName.indexOf(DOUBLE_COLONS_SPLIT);
+            if (groupIdx > 0) {
+                storageData.setGroup(serviceName.substring(0, groupIdx));
+                storageData.setShortName(serviceName.substring(groupIdx + 2));
             }
             converter.accept(NAME, serviceName);
             converter.accept(SHORT_NAME, storageData.getShortName());
@@ -190,7 +181,7 @@ public class ServiceTraffic extends Metrics {
 
     public String getServiceId() {
         if (serviceId == null) {
-            serviceId = IDManager.ServiceID.buildId(name, isNormal);
+            serviceId = IDManager.ServiceID.buildId(name, layer.isNormal());
         }
         return serviceId;
     }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/service/ServiceTrafficDispatcher.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/service/ServiceTrafficDispatcher.java
index 76c002b..a83ba0c 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/service/ServiceTrafficDispatcher.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/service/ServiceTrafficDispatcher.java
@@ -29,7 +29,6 @@ public class ServiceTrafficDispatcher implements SourceDispatcher<Service> {
         traffic.setTimeBucket(source.getTimeBucket());
         traffic.setName(source.getName());
         traffic.setLayer(source.getLayer());
-        traffic.setNormal(source.isNormal());
         MetricsStreamProcessor.getInstance().in(traffic);
     }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Endpoint.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Endpoint.java
index e89e8f1..e2ca33b 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Endpoint.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Endpoint.java
@@ -23,6 +23,7 @@ import java.util.Map;
 import lombok.Getter;
 import lombok.Setter;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.skywalking.oap.server.core.analysis.Layer;
 import org.apache.skywalking.oap.server.library.util.StringUtil;
 import org.apache.skywalking.oap.server.core.analysis.IDManager;
 
@@ -59,8 +60,6 @@ public class Endpoint extends Source {
     @Setter
     @ScopeDefaultColumn.DefinedByField(columnName = "service_name", requireDynamicActive = true)
     private String serviceName;
-    @Setter
-    private boolean isServiceNormal;
     @Getter
     @Setter
     private String serviceInstanceName;
@@ -91,10 +90,13 @@ public class Endpoint extends Source {
     @Getter
     @Setter
     private SideCar sideCar = new SideCar();
+    @Getter
+    @Setter
+    private Layer serviceLayer;
 
     @Override
     public void prepare() {
-        serviceId = IDManager.ServiceID.buildId(serviceName, isServiceNormal);
+        serviceId = IDManager.ServiceID.buildId(serviceName, serviceLayer.isNormal());
     }
 
     public String getTag(String key) {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/EndpointRelation.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/EndpointRelation.java
index 4e5c13f..3b10368 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/EndpointRelation.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/EndpointRelation.java
@@ -21,6 +21,7 @@ package org.apache.skywalking.oap.server.core.source;
 import lombok.Getter;
 import lombok.Setter;
 import org.apache.skywalking.oap.server.core.analysis.IDManager;
+import org.apache.skywalking.oap.server.core.analysis.Layer;
 
 import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.ENDPOINT_RELATION;
 import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.ENDPOINT_RELATION_CATALOG_NAME;
@@ -51,8 +52,6 @@ public class EndpointRelation extends Source {
     @Setter
     @ScopeDefaultColumn.DefinedByField(columnName = "source_service_name", requireDynamicActive = true)
     private String serviceName;
-    @Setter
-    private boolean isServiceNormal;
     @Getter
     @Setter
     private String serviceInstanceName;
@@ -66,8 +65,6 @@ public class EndpointRelation extends Source {
     @Getter
     @ScopeDefaultColumn.DefinedByField(columnName = "child_service_name", requireDynamicActive = true)
     private String childServiceName;
-    @Setter
-    private boolean isChildServiceNormal;
     @Getter
     @Setter
     private String childServiceInstanceName;
@@ -96,11 +93,17 @@ public class EndpointRelation extends Source {
     @Getter
     @Setter
     private DetectPoint detectPoint;
+    @Getter
+    @Setter
+    private Layer serviceLayer;
+    @Getter
+    @Setter
+    private Layer childServiceLayer;
 
     @Override
     public void prepare() {
-        serviceId = IDManager.ServiceID.buildId(serviceName, isServiceNormal);
-        childServiceId = IDManager.ServiceID.buildId(childServiceName, isChildServiceNormal);
+        serviceId = IDManager.ServiceID.buildId(serviceName, serviceLayer.isNormal());
+        childServiceId = IDManager.ServiceID.buildId(childServiceName, childServiceLayer.isNormal());
     }
 }
 
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Service.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Service.java
index ac4d029..bb37874 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Service.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Service.java
@@ -41,7 +41,7 @@ public class Service extends Source {
     @Override
     public String getEntityId() {
         if (entityId == null) {
-            entityId = IDManager.ServiceID.buildId(name, isNormal);
+            entityId = IDManager.ServiceID.buildId(name, layer.isNormal());
         }
         return entityId;
     }
@@ -53,9 +53,6 @@ public class Service extends Source {
     @Setter
     @Getter
     private Layer layer;
-    @Setter
-    @Getter
-    private boolean isNormal;
     @Getter
     @Setter
     private String serviceInstanceName;
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstance.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstance.java
index 849fa42..5099fbf 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstance.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstance.java
@@ -60,8 +60,6 @@ public class ServiceInstance extends Source {
     @Getter
     @Setter
     private Layer layer;
-    @Setter
-    private boolean isServiceNormal;
     @Getter
     @Setter
     private String endpointName;
@@ -99,7 +97,7 @@ public class ServiceInstance extends Source {
 
     @Override
     public void prepare() {
-        serviceId = IDManager.ServiceID.buildId(serviceName, isServiceNormal);
+        serviceId = IDManager.ServiceID.buildId(serviceName, layer.isNormal());
     }
 
     public String getTag(String key) {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceRelation.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceRelation.java
index fccf360..5928ad4 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceRelation.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceRelation.java
@@ -61,8 +61,6 @@ public class ServiceInstanceRelation extends Source {
     @Getter
     @Setter
     private Layer sourceServiceLayer;
-    @Setter
-    private boolean isSourceServiceNormal;
     @Getter
     @Setter
     @ScopeDefaultColumn.DefinedByField(columnName = "source_service_instance_name", requireDynamicActive = true)
@@ -74,8 +72,6 @@ public class ServiceInstanceRelation extends Source {
     @Getter
     @Setter
     private Layer destServiceLayer;
-    @Setter
-    private boolean isDestServiceNormal;
     @Getter
     @Setter
     @ScopeDefaultColumn.DefinedByField(columnName = "dest_service_name", requireDynamicActive = true)
@@ -124,8 +120,8 @@ public class ServiceInstanceRelation extends Source {
 
     @Override
     public void prepare() {
-        sourceServiceId = IDManager.ServiceID.buildId(sourceServiceName, isSourceServiceNormal);
-        destServiceId = IDManager.ServiceID.buildId(destServiceName, isDestServiceNormal);
+        sourceServiceId = IDManager.ServiceID.buildId(sourceServiceName, sourceServiceLayer.isNormal());
+        destServiceId = IDManager.ServiceID.buildId(destServiceName, destServiceLayer.isNormal());
         sourceServiceInstanceId = IDManager.ServiceInstanceID.buildId(sourceServiceId, sourceServiceInstanceName);
         destServiceInstanceId = IDManager.ServiceInstanceID.buildId(destServiceId, destServiceInstanceName);
     }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceMeta.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceMeta.java
index 712e26e..54d3572 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceMeta.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceMeta.java
@@ -37,10 +37,10 @@ public class ServiceMeta extends Source {
 
     @Override
     public String getEntityId() {
-        return IDManager.ServiceID.buildId(name, isNormal);
+        return IDManager.ServiceID.buildId(name, layer.isNormal());
     }
 
     private String name;
     private Layer layer;
-    private boolean isNormal;
+
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceRelation.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceRelation.java
index 4cf78e3..9f12000 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceRelation.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceRelation.java
@@ -56,8 +56,6 @@ public class ServiceRelation extends Source {
     @Setter
     @ScopeDefaultColumn.DefinedByField(columnName = "source_name", requireDynamicActive = true)
     private String sourceServiceName;
-    @Setter
-    private boolean isSourceNormal;
     @Getter
     @Setter
     private String sourceServiceInstanceName;
@@ -73,8 +71,6 @@ public class ServiceRelation extends Source {
     @Getter
     @Setter
     private Layer destLayer;
-    @Setter
-    private boolean isDestNormal;
     @Getter
     @Setter
     private String destServiceInstanceName;
@@ -118,7 +114,7 @@ public class ServiceRelation extends Source {
 
     @Override
     public void prepare() {
-        sourceServiceId = IDManager.ServiceID.buildId(sourceServiceName, isSourceNormal);
-        destServiceId = IDManager.ServiceID.buildId(destServiceName, isDestNormal);
+        sourceServiceId = IDManager.ServiceID.buildId(sourceServiceName, sourceLayer.isNormal());
+        destServiceId = IDManager.ServiceID.buildId(destServiceName, destLayer.isNormal());
     }
 }
diff --git a/oap-server/server-fetcher-plugin/kafka-fetcher-plugin/src/main/java/org/apache/skywalking/oap/server/analyzer/agent/kafka/provider/handler/ServiceManagementHandler.java b/oap-server/server-fetcher-plugin/kafka-fetcher-plugin/src/main/java/org/apache/skywalking/oap/server/analyzer/agent/kafka/provider/handler/ServiceManagementHandler.java
index 00d9757..7e8e4f2 100644
--- a/oap-server/server-fetcher-plugin/kafka-fetcher-plugin/src/main/java/org/apache/skywalking/oap/server/analyzer/agent/kafka/provider/handler/ServiceManagementHandler.java
+++ b/oap-server/server-fetcher-plugin/kafka-fetcher-plugin/src/main/java/org/apache/skywalking/oap/server/analyzer/agent/kafka/provider/handler/ServiceManagementHandler.java
@@ -117,7 +117,6 @@ public class ServiceManagementHandler extends AbstractKafkaHandler {
 
         ServiceMeta serviceMeta = new ServiceMeta();
         serviceMeta.setName(serviceName);
-        serviceMeta.setNormal(true);
         serviceMeta.setTimeBucket(timeBucket);
         serviceMeta.setLayer(Layer.GENERAL);
         sourceReceiver.receive(serviceMeta);
diff --git a/oap-server/server-receiver-plugin/skywalking-ebpf-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/ebpf/provider/handler/EBPFProcessServiceHandler.java b/oap-server/server-receiver-plugin/skywalking-ebpf-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/ebpf/provider/handler/EBPFProcessServiceHandler.java
index 3fb8d9c..7007cb3 100644
--- a/oap-server/server-receiver-plugin/skywalking-ebpf-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/ebpf/provider/handler/EBPFProcessServiceHandler.java
+++ b/oap-server/server-receiver-plugin/skywalking-ebpf-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/ebpf/provider/handler/EBPFProcessServiceHandler.java
@@ -120,7 +120,6 @@ public class EBPFProcessServiceHandler extends EBPFProcessServiceGrpc.EBPFProces
             // service
             final ServiceMeta serviceMeta = new ServiceMeta();
             serviceMeta.setName(serviceName);
-            serviceMeta.setNormal(true);
             serviceMeta.setTimeBucket(timeBucket);
             serviceMeta.setLayer(layer);
             sourceReceiver.receive(serviceMeta);
diff --git a/oap-server/server-receiver-plugin/skywalking-management-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v8/ManagementServiceHandler.java b/oap-server/server-receiver-plugin/skywalking-management-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v8/ManagementServiceHandler.java
index 176b00f..1372d5d 100644
--- a/oap-server/server-receiver-plugin/skywalking-management-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v8/ManagementServiceHandler.java
+++ b/oap-server/server-receiver-plugin/skywalking-management-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v8/ManagementServiceHandler.java
@@ -87,7 +87,6 @@ public final class ManagementServiceHandler {
 
         ServiceMeta serviceMeta = new ServiceMeta();
         serviceMeta.setName(serviceName);
-        serviceMeta.setNormal(true);
         serviceMeta.setTimeBucket(timeBucket);
         serviceMeta.setLayer(Layer.GENERAL);
         sourceReceiver.receive(serviceMeta);
diff --git a/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/TelemetryDataDispatcher.java b/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/TelemetryDataDispatcher.java
index 60a5c38..d4fa9b0 100644
--- a/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/TelemetryDataDispatcher.java
+++ b/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/TelemetryDataDispatcher.java
@@ -126,7 +126,6 @@ public class TelemetryDataDispatcher {
         service.setTimeBucket(minuteTimeBucket);
         service.setName(metrics.getDestServiceName());
         service.setLayer(Layer.MESH);
-        service.setNormal(true);
         service.setServiceInstanceName(metrics.getDestServiceInstance());
         service.setEndpointName(metrics.getEndpoint());
         service.setLatency(metrics.getLatency());
@@ -146,11 +145,9 @@ public class TelemetryDataDispatcher {
         serviceRelation.setTimeBucket(minuteTimeBucket);
         serviceRelation.setSourceServiceName(metrics.getSourceServiceName());
         serviceRelation.setSourceLayer(Layer.MESH);
-        serviceRelation.setSourceNormal(true);
         serviceRelation.setSourceServiceInstanceName(metrics.getSourceServiceInstance());
         serviceRelation.setDestServiceName(metrics.getDestServiceName());
         serviceRelation.setDestLayer(Layer.MESH);
-        serviceRelation.setDestNormal(true);
         serviceRelation.setDestServiceInstanceName(metrics.getDestServiceInstance());
         serviceRelation.setEndpoint(metrics.getEndpoint());
         serviceRelation.setLatency(metrics.getLatency());
@@ -174,7 +171,6 @@ public class TelemetryDataDispatcher {
         serviceInstance.setName(metrics.getDestServiceInstance());
         serviceInstance.setServiceName(metrics.getDestServiceName());
         serviceInstance.setLayer(Layer.MESH);
-        serviceInstance.setServiceNormal(true);
         serviceInstance.setEndpointName(metrics.getEndpoint());
         serviceInstance.setLatency(metrics.getLatency());
         serviceInstance.setStatus(metrics.getStatus());
@@ -194,10 +190,8 @@ public class TelemetryDataDispatcher {
         serviceRelation.setSourceServiceInstanceName(metrics.getSourceServiceInstance());
         serviceRelation.setSourceServiceName(metrics.getSourceServiceName());
         serviceRelation.setSourceServiceLayer(Layer.MESH);
-        serviceRelation.setSourceServiceNormal(true);
         serviceRelation.setDestServiceInstanceName(metrics.getDestServiceInstance());
         serviceRelation.setDestServiceLayer(Layer.MESH);
-        serviceRelation.setDestServiceNormal(true);
         serviceRelation.setDestServiceName(metrics.getDestServiceName());
         serviceRelation.setEndpoint(metrics.getEndpoint());
         serviceRelation.setLatency(metrics.getLatency());
@@ -223,7 +217,7 @@ public class TelemetryDataDispatcher {
         endpoint.setTimeBucket(minuteTimeBucket);
         endpoint.setName(metrics.getEndpoint());
         endpoint.setServiceName(metrics.getDestServiceName());
-        endpoint.setServiceNormal(true);
+        endpoint.setServiceLayer(Layer.MESH);
         endpoint.setServiceInstanceName(metrics.getDestServiceInstance());
         endpoint.setLatency(metrics.getLatency());
         endpoint.setStatus(metrics.getStatus());
diff --git a/skywalking-ui b/skywalking-ui
index f1e405f..049f46a 160000
--- a/skywalking-ui
+++ b/skywalking-ui
@@ -1 +1 @@
-Subproject commit f1e405fbb4fccef12b8157585da290c8818d7f03
+Subproject commit 049f46a4cfe6ac68ae4d2fabd8257938f1cd3493