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 2020/03/25 07:51:40 UTC

[skywalking] branch remove-endpoint-register updated: Step 2, finish the basic and core DAO changes.

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

wusheng pushed a commit to branch remove-endpoint-register
in repository https://gitbox.apache.org/repos/asf/skywalking.git


The following commit(s) were added to refs/heads/remove-endpoint-register by this push:
     new f933cdd  Step 2, finish the basic and core DAO changes.
f933cdd is described below

commit f933cdd0541c11424d683d9343583b1e6d833665
Author: Wu Sheng <wu...@foxmail.com>
AuthorDate: Wed Mar 25 15:50:36 2020 +0800

    Step 2, finish the basic and core DAO changes.
---
 .../core/analysis/manual/RelationDefineUtil.java   |  46 +++-----
 .../analysis/manual/endpoint/EndpointTraffic.java  |  52 +++++++--
 .../manual/endpoint/EndpointTrafficDispatcher.java |   2 +-
 .../EndpointRelationServerSideMetrics.java         |   2 -
 .../manual/log/HTTPAccessLogDispatcher.java        |   2 +-
 .../analysis/manual/segment/SegmentRecord.java     |   4 +-
 .../server/core/query/AggregationQueryService.java |   4 +-
 .../server/core/query/MetadataQueryService.java    |   6 +-
 .../core/query/ServiceInstanceTopologyBuilder.java |  19 +---
 .../oap/server/core/query/TopologyBuilder.java     |  25 ++---
 .../server/core/query/TopologyQueryService.java    |   4 +-
 .../oap/server/core/query/TraceQueryService.java   |   2 +-
 .../oap/server/core/query/entity/Endpoint.java     |   2 +-
 .../oap/server/core/source/AbstractLog.java        |   2 +-
 .../oap/server/core/source/DetectPoint.java        |  23 +++-
 .../skywalking/oap/server/core/source/Segment.java |   2 +-
 .../oap/server/core/storage/StorageModule.java     |   2 -
 .../storage/cache/IEndpointInventoryCacheDAO.java  |  29 -----
 .../server/core/storage/query/ITraceQueryDAO.java  |   2 +-
 .../oap/query/graphql/resolver/TraceQuery.java     |   2 +-
 .../sharing/server/CoreRegisterLinker.java         |  22 ----
 .../listener/segment/SegmentSpanListener.java      |  43 +++----
 .../standardization/ReferenceIdExchanger.java      |  76 +------------
 .../parser/standardization/SpanExchanger.java      |  33 ------
 .../server/receiver/zipkin/trace/SpanForward.java  |   2 +-
 .../StorageModuleElasticsearchProvider.java        |   4 -
 .../cache/EndpointInventoryCacheEsDAO.java         |  80 -------------
 .../elasticsearch/query/MetadataQueryEsDAO.java    |  32 ++++--
 .../elasticsearch/query/TopologyQueryEsDAO.java    | 125 +++++++++++++++------
 .../elasticsearch/query/TraceQueryEsDAO.java       |  21 +++-
 .../StorageModuleElasticsearch7Provider.java       |   4 -
 .../elasticsearch7/query/MetadataQueryEs7DAO.java  |   5 +-
 .../elasticsearch7/query/TraceQueryEs7DAO.java     |   4 +-
 .../plugin/influxdb/query/TopologyQuery.java       |  33 +++++-
 .../storage/plugin/influxdb/query/TraceQuery.java  |   4 +-
 .../elasticsearch/JaegerTraceQueryEsDAO.java       |  18 ++-
 .../jdbc/h2/dao/H2EndpointInventoryCacheDAO.java   |  51 ---------
 .../plugin/jdbc/h2/dao/H2MetadataQueryDAO.java     |  60 ++++++----
 .../plugin/jdbc/h2/dao/H2TopologyQueryDAO.java     |  29 ++++-
 .../plugin/jdbc/h2/dao/H2TraceQueryDAO.java        |   4 +-
 .../elasticsearch/ZipkinTraceQueryEsDAO.java       |  18 ++-
 41 files changed, 395 insertions(+), 505 deletions(-)

diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/RelationDefineUtil.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/RelationDefineUtil.java
index 7c9c6ef..281635f 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/RelationDefineUtil.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/RelationDefineUtil.java
@@ -21,13 +21,16 @@ package org.apache.skywalking.oap.server.core.analysis.manual;
 import java.nio.charset.StandardCharsets;
 import java.util.Base64;
 import lombok.Getter;
+import lombok.RequiredArgsConstructor;
 import org.apache.skywalking.oap.server.core.Const;
 import org.apache.skywalking.oap.server.core.UnexpectedException;
 
 public class RelationDefineUtil {
+    /**
+     * @return the service or instance relationship string id.
+     */
     public static String buildEntityId(RelationDefine define) {
-        return String.valueOf(define.source) + Const.ID_SPLIT + String.valueOf(
-            define.dest) + Const.ID_SPLIT + String.valueOf(define.componentId);
+        return define.source + Const.ID_SPLIT + define.dest + Const.ID_SPLIT + define.componentId;
     }
 
     /**
@@ -41,6 +44,9 @@ public class RelationDefineUtil {
         return new RelationDefine(Integer.parseInt(parts[0]), Integer.parseInt(parts[1]), Integer.parseInt(parts[2]));
     }
 
+    /**
+     * @return the endpoint relationship string id.
+     */
     public static String buildEndpointEntityId(EndpointRelationDefine define) {
         return define.sourceServiceId
             + Const.ID_SPLIT
@@ -67,37 +73,21 @@ public class RelationDefineUtil {
         );
     }
 
+    @RequiredArgsConstructor
     @Getter
     public static class RelationDefine {
-        private int source;
-        private int dest;
-        private int componentId;
-
-        public RelationDefine(int source, int dest, int componentId) {
-            this.source = source;
-            this.dest = dest;
-            this.componentId = componentId;
-        }
+        private final int source;
+        private final int dest;
+        private final int componentId;
     }
 
+    @RequiredArgsConstructor
     @Getter
     public static class EndpointRelationDefine {
-        private int sourceServiceId;
-        private String source;
-        private int destServiceId;
-        private String dest;
-        private int componentId;
-
-        public EndpointRelationDefine(final int sourceServiceId,
-                                      final String source,
-                                      final int destServiceId,
-                                      final String dest,
-                                      final int componentId) {
-            this.sourceServiceId = sourceServiceId;
-            this.source = source;
-            this.destServiceId = destServiceId;
-            this.dest = dest;
-            this.componentId = componentId;
-        }
+        private final int sourceServiceId;
+        private final String source;
+        private final int destServiceId;
+        private final String dest;
+        private final int componentId;
     }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/endpoint/EndpointTraffic.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/endpoint/EndpointTraffic.java
index 3286e41..3007f4c 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/endpoint/EndpointTraffic.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/endpoint/EndpointTraffic.java
@@ -22,14 +22,17 @@ import com.google.common.base.Strings;
 import java.util.HashMap;
 import java.util.Map;
 import lombok.Getter;
+import lombok.RequiredArgsConstructor;
 import lombok.Setter;
 import org.apache.skywalking.oap.server.core.Const;
 import org.apache.skywalking.oap.server.core.UnexpectedException;
 import org.apache.skywalking.oap.server.core.analysis.Stream;
+import org.apache.skywalking.oap.server.core.analysis.TimeBucket;
 import org.apache.skywalking.oap.server.core.analysis.metrics.Metrics;
 import org.apache.skywalking.oap.server.core.analysis.worker.MetricsStreamProcessor;
 import org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData;
 import org.apache.skywalking.oap.server.core.source.DefaultScopeDefine;
+import org.apache.skywalking.oap.server.core.source.DetectPoint;
 import org.apache.skywalking.oap.server.core.source.ScopeDeclaration;
 import org.apache.skywalking.oap.server.core.storage.StorageBuilder;
 import org.apache.skywalking.oap.server.core.storage.annotation.Column;
@@ -37,7 +40,9 @@ import org.apache.skywalking.oap.server.core.storage.annotation.Column;
 import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.ENDPOINT_TRAFFIC;
 
 @ScopeDeclaration(id = ENDPOINT_TRAFFIC, name = "EndpointTraffic")
-@Stream(name = EndpointTraffic.INDEX_NAME, scopeId = DefaultScopeDefine.ENDPOINT_TRAFFIC, builder = EndpointTraffic.Builder.class, processor = MetricsStreamProcessor.class)
+@Stream(name = EndpointTraffic.INDEX_NAME, scopeId = DefaultScopeDefine.ENDPOINT_TRAFFIC,
+    builder = EndpointTraffic.Builder.class, processor = MetricsStreamProcessor.class,
+    supportDownSampling = false)
 public class EndpointTraffic extends Metrics {
 
     public static final String INDEX_NAME = "endpoint_traffic";
@@ -62,7 +67,15 @@ public class EndpointTraffic extends Metrics {
     @Column(columnName = DETECT_POINT)
     private int detectPoint;
 
-    public static String buildId(int serviceId, String endpointName, int detectPoint) {
+    public static String buildId(int serviceId, String endpointName, DetectPoint detectPoint) {
+        return buildId(serviceId, endpointName, detectPoint.value());
+    }
+
+    public static String buildId(EndpointTraffic endpointTraffic) {
+        return buildId(endpointTraffic.serviceId, endpointTraffic.name, endpointTraffic.detectPoint);
+    }
+
+    private static String buildId(int serviceId, String endpointName, int detectPoint) {
         return serviceId + Const.ID_SPLIT + endpointName + Const.ID_SPLIT + detectPoint;
     }
 
@@ -70,25 +83,38 @@ public class EndpointTraffic extends Metrics {
      * @param id in the storage of endpoint traffic
      * @return [serviceId, endpointName, detectPoint]
      */
-    public static String[] splitID(String id) {
+    public static EndpointID splitID(String id) {
         final String[] strings = id.split(Const.ID_PARSER_SPLIT);
         if (strings.length != 3) {
             throw new UnexpectedException("Can't split endpoint id into 3 parts, " + id);
         }
-        return strings;
+        return new EndpointID(
+            Integer.parseInt(strings[0]), strings[1], DetectPoint.valueOf(Integer.parseInt(strings[2])));
+    }
+
+    @RequiredArgsConstructor
+    public static class EndpointID {
+        @Getter
+        private final int serviceId;
+        @Getter
+        private final String endpointName;
+        @Getter
+        private final DetectPoint detectPoint;
     }
 
     @Override
     public String id() {
-        return buildId(serviceId, name, detectPoint);
+        // Downgrade the time bucket to day level only.
+        // supportDownSampling == false for this entity.
+        String splitJointId = String.valueOf(getTimeBucket());
+        splitJointId += Const.ID_SPLIT + entityId;
+        return splitJointId;
     }
 
     @Override
     public int hashCode() {
         int result = 17;
-        result = 31 * result + serviceId;
-        result = 31 * result + name.hashCode();
-        result = 31 * result + detectPoint;
+        result = 31 * result + entityId.hashCode();
         return result;
     }
 
@@ -121,6 +147,16 @@ public class EndpointTraffic extends Metrics {
         return remoteBuilder;
     }
 
+    /**
+     * Only accept the minute level time bucket and convert it to day level.
+     */
+    @Override
+    public void setTimeBucket(long timeBucket) {
+        if (TimeBucket.isMinuteBucket(timeBucket)) {
+            super.setTimeBucket(timeBucket / 10000);
+        }
+    }
+
     @Override
     public void deserialize(RemoteData remoteData) {
         setServiceId(remoteData.getDataIntegers(0));
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/endpoint/EndpointTrafficDispatcher.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/endpoint/EndpointTrafficDispatcher.java
index 1bb0378..41db2cf 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/endpoint/EndpointTrafficDispatcher.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/endpoint/EndpointTrafficDispatcher.java
@@ -34,7 +34,7 @@ public class EndpointTrafficDispatcher implements SourceDispatcher<Endpoint> {
         EndpointTraffic traffic = new EndpointTraffic();
         traffic.setName(source.getName());
         traffic.setServiceId(source.getServiceId());
-        traffic.setDetectPoint(DetectPoint.SERVER.ordinal());
+        traffic.setDetectPoint(DetectPoint.SERVER.value());
         traffic.setEntityId(source.getEntityId());
         MetricsStreamProcessor.getInstance().in(traffic);
     }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/endpointrelation/EndpointRelationServerSideMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/endpointrelation/EndpointRelationServerSideMetrics.java
index 85081b3..14dd9a4 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/endpointrelation/EndpointRelationServerSideMetrics.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/endpointrelation/EndpointRelationServerSideMetrics.java
@@ -20,12 +20,10 @@ package org.apache.skywalking.oap.server.core.analysis.manual.endpointrelation;
 
 import java.util.HashMap;
 import java.util.Map;
-import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.Setter;
 import org.apache.skywalking.oap.server.core.Const;
 import org.apache.skywalking.oap.server.core.analysis.Stream;
-import org.apache.skywalking.oap.server.core.analysis.manual.RelationDefineUtil;
 import org.apache.skywalking.oap.server.core.analysis.metrics.Metrics;
 import org.apache.skywalking.oap.server.core.analysis.worker.MetricsStreamProcessor;
 import org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData;
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/log/HTTPAccessLogDispatcher.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/log/HTTPAccessLogDispatcher.java
index f92eced..9a6914f 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/log/HTTPAccessLogDispatcher.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/log/HTTPAccessLogDispatcher.java
@@ -31,7 +31,7 @@ public class HTTPAccessLogDispatcher implements SourceDispatcher<HTTPAccessLog>
         record.setTimeBucket(source.getTimeBucket());
         record.setServiceId(source.getServiceId());
         record.setServiceInstanceId(source.getServiceInstanceId());
-        record.setEndpointId(source.getEndpointId());
+        record.setEndpointName(source.getEndpointName());
         record.setTraceId(source.getTraceId());
         record.setIsError(source.getIsError());
         record.setStatusCode(source.getStatusCode());
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/segment/SegmentRecord.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/segment/SegmentRecord.java
index b5f94cc..a36e69c 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/segment/SegmentRecord.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/segment/SegmentRecord.java
@@ -73,7 +73,7 @@ public class SegmentRecord extends Record {
     @Setter
     @Getter
     @Column(columnName = ENDPOINT_ID)
-    private int endpointId;
+    private String endpointId;
     @Setter
     @Getter
     @Column(columnName = START_TIME)
@@ -137,7 +137,7 @@ public class SegmentRecord extends Record {
             record.setServiceId(((Number) dbMap.get(SERVICE_ID)).intValue());
             record.setServiceInstanceId(((Number) dbMap.get(SERVICE_INSTANCE_ID)).intValue());
             record.setEndpointName((String) dbMap.get(ENDPOINT_NAME));
-            record.setEndpointId(((Number) dbMap.get(ENDPOINT_ID)).intValue());
+            record.setEndpointId((String) dbMap.get(ENDPOINT_ID));
             record.setStartTime(((Number) dbMap.get(START_TIME)).longValue());
             record.setEndTime(((Number) dbMap.get(END_TIME)).longValue());
             record.setLatency(((Number) dbMap.get(LATENCY)).intValue());
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/AggregationQueryService.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/AggregationQueryService.java
index 9154f7b..b0bf8e2 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/AggregationQueryService.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/AggregationQueryService.java
@@ -122,7 +122,7 @@ public class AggregationQueryService implements Service {
             indName, ValueColumnMetadata.INSTANCE.getValueCName(indName), topN, downsampling, startTB, endTB, order);
 
         for (TopNEntity entity : topNEntities) {
-            entity.setName(EndpointTraffic.splitID(entity.getId())[1]);
+            entity.setName(EndpointTraffic.splitID(entity.getId()).getEndpointName());
         }
         return topNEntities;
     }
@@ -138,7 +138,7 @@ public class AggregationQueryService implements Service {
             serviceId, indName, ValueColumnMetadata.INSTANCE
                 .getValueCName(indName), topN, downsampling, startTB, endTB, order);
         for (TopNEntity entity : topNEntities) {
-            entity.setName(EndpointTraffic.splitID(entity.getId())[1]);
+            entity.setName(EndpointTraffic.splitID(entity.getId()).getEndpointName());
         }
         return topNEntities;
     }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/MetadataQueryService.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/MetadataQueryService.java
index 7b9454e..2d7bd82 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/MetadataQueryService.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/MetadataQueryService.java
@@ -102,12 +102,12 @@ public class MetadataQueryService implements org.apache.skywalking.oap.server.li
     }
 
     public EndpointInfo getEndpointInfo(final String endpointId) throws IOException {
-        final String[] strings = EndpointTraffic.splitID(endpointId);
-        int serviceId = Integer.parseInt(strings[0]);
+        final EndpointTraffic.EndpointID endpointID = EndpointTraffic.splitID(endpointId);
+        int serviceId = endpointID.getServiceId();
 
         EndpointInfo endpointInfo = new EndpointInfo();
         endpointInfo.setId(endpointId);
-        endpointInfo.setName(strings[1]);
+        endpointInfo.setName(endpointID.getEndpointName());
         endpointInfo.setServiceId(serviceId);
         endpointInfo.setServiceName(getServiceInventoryCache().get(serviceId).getName());
         return endpointInfo;
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/ServiceInstanceTopologyBuilder.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/ServiceInstanceTopologyBuilder.java
index 486f486..895b725 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/ServiceInstanceTopologyBuilder.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/ServiceInstanceTopologyBuilder.java
@@ -60,16 +60,14 @@ public class ServiceInstanceTopologyBuilder {
 
     ServiceInstanceTopology build(List<Call.CallDetail> serviceInstanceRelationClientCalls,
         List<Call.CallDetail> serviceInstanceRelationServerCalls) {
-        filterZeroSourceOrTargetReference(serviceInstanceRelationClientCalls);
-        filterZeroSourceOrTargetReference(serviceInstanceRelationServerCalls);
 
         Map<Integer, ServiceInstanceNode> nodes = new HashMap<>();
         List<Call> calls = new LinkedList<>();
         HashMap<String, Call> callMap = new HashMap<>();
 
         for (Call.CallDetail clientCall : serviceInstanceRelationClientCalls) {
-            ServiceInstanceInventory sourceInstance = serviceInstanceInventoryCache.get(clientCall.getSource());
-            ServiceInstanceInventory targetInstance = serviceInstanceInventoryCache.get(clientCall.getTarget());
+            ServiceInstanceInventory sourceInstance = serviceInstanceInventoryCache.get(Integer.parseInt(clientCall.getSource()));
+            ServiceInstanceInventory targetInstance = serviceInstanceInventoryCache.get(Integer.parseInt(clientCall.getTarget()));
 
             if (isNull(sourceInstance) || isNull(targetInstance)) {
                 continue;
@@ -113,8 +111,8 @@ public class ServiceInstanceTopologyBuilder {
         }
 
         for (Call.CallDetail serverCall : serviceInstanceRelationServerCalls) {
-            ServiceInstanceInventory sourceInstance = serviceInstanceInventoryCache.get(serverCall.getSource());
-            ServiceInstanceInventory targetInstance = serviceInstanceInventoryCache.get(serverCall.getTarget());
+            ServiceInstanceInventory sourceInstance = serviceInstanceInventoryCache.get(Integer.parseInt(serverCall.getSource()));
+            ServiceInstanceInventory targetInstance = serviceInstanceInventoryCache.get(Integer.parseInt(serverCall.getTarget()));
 
             if (isNull(sourceInstance) || isNull(targetInstance)) {
                 continue;
@@ -202,13 +200,4 @@ public class ServiceInstanceTopologyBuilder {
         }
         return instanceNode;
     }
-
-    private void filterZeroSourceOrTargetReference(List<Call.CallDetail> serviceRelationClientCalls) {
-        for (int i = serviceRelationClientCalls.size() - 1; i >= 0; i--) {
-            Call.CallDetail call = serviceRelationClientCalls.get(i);
-            if (call.getSource() == 0 || call.getTarget() == 0) {
-                serviceRelationClientCalls.remove(i);
-            }
-        }
-    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/TopologyBuilder.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/TopologyBuilder.java
index 8aeb8ad..2c6ad73 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/TopologyBuilder.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/TopologyBuilder.java
@@ -55,16 +55,14 @@ class TopologyBuilder {
     }
 
     Topology build(List<Call.CallDetail> serviceRelationClientCalls, List<Call.CallDetail> serviceRelationServerCalls) {
-        filterZeroSourceOrTargetReference(serviceRelationClientCalls);
-        filterZeroSourceOrTargetReference(serviceRelationServerCalls);
 
         Map<Integer, Node> nodes = new HashMap<>();
         List<Call> calls = new LinkedList<>();
         HashMap<String, Call> callMap = new HashMap<>();
 
         for (Call.CallDetail clientCall : serviceRelationClientCalls) {
-            ServiceInventory source = serviceInventoryCache.get(clientCall.getSource());
-            ServiceInventory target = serviceInventoryCache.get(clientCall.getTarget());
+            ServiceInventory source = serviceInventoryCache.get(Integer.parseInt(clientCall.getSource()));
+            ServiceInventory target = serviceInventoryCache.get(Integer.parseInt(clientCall.getTarget()));
 
             if (isNull(source) || isNull(target)) {
                 continue;
@@ -107,8 +105,8 @@ class TopologyBuilder {
         }
 
         for (Call.CallDetail serverCall : serviceRelationServerCalls) {
-            ServiceInventory source = serviceInventoryCache.get(serverCall.getSource());
-            ServiceInventory target = serviceInventoryCache.get(serverCall.getTarget());
+            ServiceInventory source = serviceInventoryCache.get(Integer.parseInt(serverCall.getSource()));
+            ServiceInventory target = serviceInventoryCache.get(Integer.parseInt(serverCall.getTarget()));
 
             if (isNull(source) || isNull(target)) {
                 continue;
@@ -117,7 +115,7 @@ class TopologyBuilder {
             if (source.getSequence() == Const.USER_SERVICE_ID) {
                 if (!nodes.containsKey(source.getSequence())) {
                     Node visualUserNode = new Node();
-                    visualUserNode.setId(source.getSequence());
+                    visualUserNode.setId(String.valueOf(source.getSequence()));
                     visualUserNode.setName(Const.USER_CODE);
                     visualUserNode.setType(Const.USER_CODE.toUpperCase());
                     visualUserNode.setReal(false);
@@ -128,7 +126,7 @@ class TopologyBuilder {
             if (BooleanUtils.valueToBoolean(source.getIsAddress())) {
                 if (!nodes.containsKey(source.getSequence())) {
                     Node conjecturalNode = new Node();
-                    conjecturalNode.setId(source.getSequence());
+                    conjecturalNode.setId(String.valueOf(source.getSequence()));
                     conjecturalNode.setName(source.getName());
                     conjecturalNode.setType(
                         componentLibraryCatalogService.getServerNameBasedOnComponent(serverCall.getComponentId()));
@@ -178,7 +176,7 @@ class TopologyBuilder {
 
     private Node buildNode(ServiceInventory serviceInventory) {
         Node serviceNode = new Node();
-        serviceNode.setId(serviceInventory.getSequence());
+        serviceNode.setId(String.valueOf(serviceInventory.getSequence()));
         serviceNode.setName(serviceInventory.getName());
         if (BooleanUtils.valueToBoolean(serviceInventory.getIsAddress())) {
             serviceNode.setReal(false);
@@ -187,13 +185,4 @@ class TopologyBuilder {
         }
         return serviceNode;
     }
-
-    private void filterZeroSourceOrTargetReference(List<Call.CallDetail> serviceRelationClientCalls) {
-        for (int i = serviceRelationClientCalls.size() - 1; i >= 0; i--) {
-            Call.CallDetail call = serviceRelationClientCalls.get(i);
-            if (call.getSource() == 0 || call.getTarget() == 0) {
-                serviceRelationClientCalls.remove(i);
-            }
-        }
-    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/TopologyQueryService.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/TopologyQueryService.java
index 858d612..d793d1a 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/TopologyQueryService.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/TopologyQueryService.java
@@ -27,6 +27,7 @@ import java.util.Set;
 import org.apache.skywalking.oap.server.core.Const;
 import org.apache.skywalking.oap.server.core.CoreModule;
 import org.apache.skywalking.oap.server.core.analysis.Downsampling;
+import org.apache.skywalking.oap.server.core.analysis.manual.endpoint.EndpointTraffic;
 import org.apache.skywalking.oap.server.core.config.IComponentLibraryCatalogService;
 import org.apache.skywalking.oap.server.core.query.entity.Call;
 import org.apache.skywalking.oap.server.core.query.entity.Node;
@@ -184,7 +185,8 @@ public class TopologyQueryService implements Service {
     private Node buildEndpointNode(String endpointId) {
         Node node = new Node();
         node.setId(endpointId);
-        node.setName(getEndpointInventoryCache().get(endpointId).getName());
+        final EndpointTraffic.EndpointID endpointID = EndpointTraffic.splitID(endpointId);
+        node.setName(endpointID.getEndpointName());
         node.setType(Const.EMPTY_STRING);
         node.setReal(true);
         return node;
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/TraceQueryService.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/TraceQueryService.java
index 1ffdcc5..940938b 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/TraceQueryService.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/TraceQueryService.java
@@ -100,7 +100,7 @@ public class TraceQueryService implements Service {
 
     public TraceBrief queryBasicTraces(final int serviceId,
                                        final int serviceInstanceId,
-                                       final int endpointId,
+                                       final String endpointId,
                                        final String traceId,
                                        final String endpointName,
                                        final int minTraceDuration,
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Endpoint.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Endpoint.java
index dc8696c..73e5cf8 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Endpoint.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Endpoint.java
@@ -24,6 +24,6 @@ import lombok.Setter;
 @Getter
 @Setter
 public class Endpoint {
-    private int id;
+    private String id;
     private String name;
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/AbstractLog.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/AbstractLog.java
index c91002b..fc9f824 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/AbstractLog.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/AbstractLog.java
@@ -30,7 +30,7 @@ public abstract class AbstractLog extends Source {
     private long timestamp;
     private int serviceId;
     private int serviceInstanceId;
-    private int endpointId;
+    private String endpointName;
     private String traceId;
     private int isError;
     private String statusCode;
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/DetectPoint.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/DetectPoint.java
index 9e40512..e649542 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/DetectPoint.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/DetectPoint.java
@@ -18,10 +18,14 @@
 
 package org.apache.skywalking.oap.server.core.source;
 
+import lombok.RequiredArgsConstructor;
 import org.apache.skywalking.apm.network.language.agent.SpanType;
 
+@RequiredArgsConstructor
 public enum DetectPoint {
-    SERVER, CLIENT, PROXY, UNRECOGNIZED;
+    SERVER(0), CLIENT(1), PROXY(2), UNRECOGNIZED(3);
+
+    private final int value;
 
     public static DetectPoint fromSpanType(SpanType spanType) {
         switch (spanType) {
@@ -49,4 +53,21 @@ public enum DetectPoint {
                 return UNRECOGNIZED;
         }
     }
+
+    public static DetectPoint valueOf(int value) {
+        switch (value) {
+            case 0:
+                return SERVER;
+            case 1:
+                return CLIENT;
+            case 2:
+                return PROXY;
+            default:
+                return UNRECOGNIZED;
+        }
+    }
+
+    public int value() {
+        return this.value;
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Segment.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Segment.java
index 21bd727..1660ba3 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Segment.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Segment.java
@@ -53,7 +53,7 @@ public class Segment extends Source {
     private String endpointName;
     @Setter
     @Getter
-    private int endpointId;
+    private String endpointId;
     @Setter
     @Getter
     private long startTime;
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/StorageModule.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/StorageModule.java
index a3194b6..be4d340 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/StorageModule.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/StorageModule.java
@@ -18,7 +18,6 @@
 
 package org.apache.skywalking.oap.server.core.storage;
 
-import org.apache.skywalking.oap.server.core.storage.cache.IEndpointInventoryCacheDAO;
 import org.apache.skywalking.oap.server.core.storage.cache.INetworkAddressInventoryCacheDAO;
 import org.apache.skywalking.oap.server.core.storage.cache.IServiceInstanceInventoryCacheDAO;
 import org.apache.skywalking.oap.server.core.storage.cache.IServiceInventoryCacheDAO;
@@ -56,7 +55,6 @@ public class StorageModule extends ModuleDefine {
             IHistoryDeleteDAO.class,
             IServiceInventoryCacheDAO.class,
             IServiceInstanceInventoryCacheDAO.class,
-            IEndpointInventoryCacheDAO.class,
             INetworkAddressInventoryCacheDAO.class,
             ITopologyQueryDAO.class,
             IMetricsQueryDAO.class,
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/cache/IEndpointInventoryCacheDAO.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/cache/IEndpointInventoryCacheDAO.java
deleted file mode 100644
index 00d41e2..0000000
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/cache/IEndpointInventoryCacheDAO.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-package org.apache.skywalking.oap.server.core.storage.cache;
-
-import org.apache.skywalking.oap.server.core.analysis.manual.endpoint.EndpointTraffic;
-import org.apache.skywalking.oap.server.core.storage.DAO;
-
-public interface IEndpointInventoryCacheDAO extends DAO {
-
-    int getEndpointId(int serviceId, String endpointName, int detectPoint);
-
-    EndpointTraffic get(int endpointId);
-}
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/query/ITraceQueryDAO.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/query/ITraceQueryDAO.java
index 693f0a1..b47d2fa 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/query/ITraceQueryDAO.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/query/ITraceQueryDAO.java
@@ -30,7 +30,7 @@ import org.apache.skywalking.oap.server.library.module.Service;
 public interface ITraceQueryDAO extends Service {
 
     TraceBrief queryBasicTraces(long startSecondTB, long endSecondTB, long minDuration, long maxDuration,
-        String endpointName, int serviceId, int serviceInstanceId, int endpointId, String traceId, int limit, int from,
+        String endpointName, int serviceId, int serviceInstanceId, String endpointId, String traceId, int limit, int from,
         TraceState traceState, QueryOrder queryOrder) throws IOException;
 
     List<SegmentRecord> queryByTraceId(String traceId) throws IOException;
diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/TraceQuery.java b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/TraceQuery.java
index ce4c2e5..6e2b72c 100644
--- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/TraceQuery.java
+++ b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/TraceQuery.java
@@ -75,7 +75,7 @@ public class TraceQuery implements GraphQLQueryResolver {
         int maxDuration = condition.getMaxTraceDuration();
         String endpointName = condition.getEndpointName();
         int serviceId = StringUtils.isEmpty(condition.getServiceId()) ? 0 : Integer.parseInt(condition.getServiceId());
-        int endpointId = StringUtils.isEmpty(condition.getEndpointId()) ? 0 : Integer.parseInt(condition.getEndpointId());
+        String endpointId = condition.getEndpointId();
         int serviceInstanceId = StringUtils.isEmpty(condition.getServiceInstanceId()) ? 0 : Integer.parseInt(condition.getServiceInstanceId());
         TraceState traceState = condition.getTraceState();
         QueryOrder queryOrder = condition.getQueryOrder();
diff --git a/oap-server/server-receiver-plugin/skywalking-sharing-server-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/sharing/server/CoreRegisterLinker.java b/oap-server/server-receiver-plugin/skywalking-sharing-server-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/sharing/server/CoreRegisterLinker.java
index 843d425..1677762 100644
--- a/oap-server/server-receiver-plugin/skywalking-sharing-server-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/sharing/server/CoreRegisterLinker.java
+++ b/oap-server/server-receiver-plugin/skywalking-sharing-server-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/sharing/server/CoreRegisterLinker.java
@@ -19,9 +19,7 @@
 package org.apache.skywalking.oap.server.receiver.sharing.server;
 
 import org.apache.skywalking.oap.server.core.CoreModule;
-import org.apache.skywalking.oap.server.core.cache.EndpointInventoryCache;
 import org.apache.skywalking.oap.server.core.cache.ServiceInventoryCache;
-import org.apache.skywalking.oap.server.core.register.service.IEndpointTrafficGenerator;
 import org.apache.skywalking.oap.server.core.register.service.IServiceInstanceInventoryRegister;
 import org.apache.skywalking.oap.server.core.register.service.IServiceInventoryRegister;
 import org.apache.skywalking.oap.server.library.module.ModuleManager;
@@ -30,9 +28,7 @@ public class CoreRegisterLinker {
     private static volatile ModuleManager MODULE_MANAGER;
     private static volatile IServiceInventoryRegister SERVICE_INVENTORY_REGISTER;
     private static volatile IServiceInstanceInventoryRegister SERVICE_INSTANCE_INVENTORY_REGISTER;
-    private static volatile IEndpointTrafficGenerator ENDPOINT_INVENTORY_REGISTER;
     private static volatile ServiceInventoryCache SERVICE_INVENTORY_CACHE;
-    private static volatile EndpointInventoryCache ENDPOINT_INVENTORY_CACHE;
 
     public static void setModuleManager(ModuleManager moduleManager) {
         CoreRegisterLinker.MODULE_MANAGER = moduleManager;
@@ -56,15 +52,6 @@ public class CoreRegisterLinker {
         return SERVICE_INSTANCE_INVENTORY_REGISTER;
     }
 
-    public static IEndpointTrafficGenerator getEndpointInventoryRegister() {
-        if (ENDPOINT_INVENTORY_REGISTER == null) {
-            ENDPOINT_INVENTORY_REGISTER = MODULE_MANAGER.find(CoreModule.NAME)
-                                                        .provider()
-                                                        .getService(IEndpointTrafficGenerator.class);
-        }
-        return ENDPOINT_INVENTORY_REGISTER;
-    }
-
     public static ServiceInventoryCache getServiceInventoryCache() {
         if (SERVICE_INVENTORY_CACHE == null) {
             SERVICE_INVENTORY_CACHE = MODULE_MANAGER.find(CoreModule.NAME)
@@ -73,13 +60,4 @@ public class CoreRegisterLinker {
         }
         return SERVICE_INVENTORY_CACHE;
     }
-
-    public static EndpointInventoryCache getEndpointInventoryCache() {
-        if (ENDPOINT_INVENTORY_CACHE == null) {
-            ENDPOINT_INVENTORY_CACHE = MODULE_MANAGER.find(CoreModule.NAME)
-                                                     .provider()
-                                                     .getService(EndpointInventoryCache.class);
-        }
-        return ENDPOINT_INVENTORY_CACHE;
-    }
 }
diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/segment/SegmentSpanListener.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/segment/SegmentSpanListener.java
index bbb399b..544d87c 100644
--- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/segment/SegmentSpanListener.java
+++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/segment/SegmentSpanListener.java
@@ -21,10 +21,10 @@ package org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener
 import java.util.stream.Collectors;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.skywalking.apm.network.language.agent.UniqueId;
-import org.apache.skywalking.oap.server.core.Const;
 import org.apache.skywalking.oap.server.core.CoreModule;
 import org.apache.skywalking.oap.server.core.analysis.TimeBucket;
-import org.apache.skywalking.oap.server.core.cache.EndpointInventoryCache;
+import org.apache.skywalking.oap.server.core.analysis.manual.endpoint.EndpointTraffic;
+import org.apache.skywalking.oap.server.core.source.DetectPoint;
 import org.apache.skywalking.oap.server.core.source.Segment;
 import org.apache.skywalking.oap.server.core.source.SourceReceiver;
 import org.apache.skywalking.oap.server.library.module.ModuleManager;
@@ -46,18 +46,13 @@ public class SegmentSpanListener implements FirstSpanListener, EntrySpanListener
     private final SourceReceiver sourceReceiver;
     private final TraceSegmentSampler sampler;
     private final Segment segment = new Segment();
-    private final EndpointInventoryCache serviceNameCacheService;
     private SAMPLE_STATUS sampleStatus = SAMPLE_STATUS.UNKNOWN;
-    private int entryEndpointId = 0;
-    private int firstEndpointId = 0;
-    private String firstEndpointName = "";
+    private String endpointId = "";
+    private String endpointName = "";
 
     private SegmentSpanListener(ModuleManager moduleManager, TraceSegmentSampler sampler) {
         this.sampler = sampler;
         this.sourceReceiver = moduleManager.find(CoreModule.NAME).provider().getService(SourceReceiver.class);
-        this.serviceNameCacheService = moduleManager.find(CoreModule.NAME)
-                                                    .provider()
-                                                    .getService(EndpointInventoryCache.class);
     }
 
     @Override
@@ -84,13 +79,18 @@ public class SegmentSpanListener implements FirstSpanListener, EntrySpanListener
         segment.setDataBinary(segmentCoreInfo.getDataBinary());
         segment.setVersion(segmentCoreInfo.getVersion().number());
 
-        firstEndpointId = spanDecorator.getOperationNameId();
-        firstEndpointName = spanDecorator.getOperationName();
+        endpointId = EndpointTraffic.buildId(segmentCoreInfo.getServiceId(), spanDecorator.getOperationName(),
+                                             DetectPoint.fromSpanType(spanDecorator.getSpanType())
+        );
+        endpointName = spanDecorator.getOperationName();
     }
 
     @Override
     public void parseEntry(SpanDecorator spanDecorator, SegmentCoreInfo segmentCoreInfo) {
-        entryEndpointId = spanDecorator.getOperationNameId();
+        endpointId = EndpointTraffic.buildId(segmentCoreInfo.getServiceId(), spanDecorator.getOperationName(),
+                                             DetectPoint.fromSpanType(spanDecorator.getSpanType())
+        );
+        endpointName = spanDecorator.getOperationName();
     }
 
     @Override
@@ -121,23 +121,8 @@ public class SegmentSpanListener implements FirstSpanListener, EntrySpanListener
             return;
         }
 
-        if (entryEndpointId == Const.NONE) {
-            if (firstEndpointId != Const.NONE) {
-                /*
-                 * Since 6.6.0, only entry span is treated as an endpoint. Other span's endpoint id == 0.
-                 */
-                segment.setEndpointId(firstEndpointId);
-                segment.setEndpointName(serviceNameCacheService.get(firstEndpointId).getName());
-            } else {
-                /*
-                 * Only fill first operation name for the trace list query, as no endpoint id.
-                 */
-                segment.setEndpointName(firstEndpointName);
-            }
-        } else {
-            segment.setEndpointId(entryEndpointId);
-            segment.setEndpointName(serviceNameCacheService.get(entryEndpointId).getName());
-        }
+        segment.setEndpointId(endpointId);
+        segment.setEndpointName(endpointName);
 
         sourceReceiver.receive(segment);
     }
diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/standardization/ReferenceIdExchanger.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/standardization/ReferenceIdExchanger.java
index 5932fa0..44e09f3 100644
--- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/standardization/ReferenceIdExchanger.java
+++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/standardization/ReferenceIdExchanger.java
@@ -23,9 +23,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.skywalking.oap.server.core.Const;
 import org.apache.skywalking.oap.server.core.CoreModule;
 import org.apache.skywalking.oap.server.core.cache.ServiceInstanceInventoryCache;
-import org.apache.skywalking.oap.server.core.register.service.IEndpointTrafficGenerator;
 import org.apache.skywalking.oap.server.core.register.service.INetworkAddressInventoryRegister;
-import org.apache.skywalking.oap.server.core.source.DetectPoint;
 import org.apache.skywalking.oap.server.library.module.ModuleManager;
 import org.apache.skywalking.oap.server.receiver.trace.provider.parser.decorator.ReferenceDecorator;
 
@@ -39,7 +37,6 @@ import org.apache.skywalking.oap.server.receiver.trace.provider.parser.decorator
 @Slf4j
 public class ReferenceIdExchanger implements IdExchanger<ReferenceDecorator> {
     private static ReferenceIdExchanger EXCHANGER;
-    private final IEndpointTrafficGenerator endpointInventoryRegister;
     private final ServiceInstanceInventoryCache serviceInstanceInventoryCache;
     private final INetworkAddressInventoryRegister networkAddressInventoryRegister;
 
@@ -51,9 +48,6 @@ public class ReferenceIdExchanger implements IdExchanger<ReferenceDecorator> {
     }
 
     private ReferenceIdExchanger(ModuleManager moduleManager) {
-        this.endpointInventoryRegister = moduleManager.find(CoreModule.NAME)
-                                                      .provider()
-                                                      .getService(IEndpointTrafficGenerator.class);
         this.networkAddressInventoryRegister = moduleManager.find(CoreModule.NAME)
                                                             .provider()
                                                             .getService(INetworkAddressInventoryRegister.class);
@@ -62,65 +56,13 @@ public class ReferenceIdExchanger implements IdExchanger<ReferenceDecorator> {
                                                           .getService(ServiceInstanceInventoryCache.class);
     }
 
+    /**
+     * @since 7.1.0 Endpoint doesn't register anymore. Therefore, exchange of ref only relates to the network address only.
+     */
     @Override
     public boolean exchange(ReferenceDecorator standardBuilder, int serviceId) {
         boolean exchanged = true;
 
-        if (standardBuilder.getEntryEndpointId() == 0) {
-            String entryEndpointName = Strings.isNullOrEmpty(
-                standardBuilder.getEntryEndpointName()) ? Const.DOMAIN_OPERATION_NAME : standardBuilder
-                .getEntryEndpointName();
-            int entryServiceId = serviceInstanceInventoryCache.get(standardBuilder.getEntryServiceInstanceId())
-                                                              .getServiceId();
-            int entryEndpointId = getEndpointId(entryServiceId, entryEndpointName);
-            if (entryEndpointId == 0) {
-                if (log.isDebugEnabled()) {
-                    log.debug(
-                        "entry endpoint name: {} from service id: {} exchange failed", entryEndpointName,
-                        entryServiceId
-                    );
-                }
-
-                exchanged = false;
-            } else {
-                standardBuilder.toBuilder();
-                standardBuilder.setEntryEndpointId(entryEndpointId);
-                standardBuilder.setEntryEndpointName(Const.EMPTY_STRING);
-            }
-        } else {
-            /**
-             * Since 6.6.0, endpoint id could be -1, as it is not an endpoint. Such as local span and exist span.
-             */
-        }
-
-        if (standardBuilder.getParentEndpointId() == 0) {
-            String parentEndpointName = Strings.isNullOrEmpty(
-                standardBuilder.getParentEndpointName()) ? Const.DOMAIN_OPERATION_NAME : standardBuilder
-                .getParentEndpointName();
-            int parentServiceId = serviceInstanceInventoryCache.get(standardBuilder.getParentServiceInstanceId())
-                                                               .getServiceId();
-            int parentEndpointId = getEndpointId(parentServiceId, parentEndpointName);
-
-            if (parentEndpointId == 0) {
-                if (log.isDebugEnabled()) {
-                    log.debug(
-                        "parent endpoint name: {} from service id: {} exchange failed", parentEndpointName,
-                        parentServiceId
-                    );
-                }
-
-                exchanged = false;
-            } else {
-                standardBuilder.toBuilder();
-                standardBuilder.setParentEndpointId(parentEndpointId);
-                standardBuilder.setParentEndpointName(Const.EMPTY_STRING);
-            }
-        } else {
-            /**
-             * Since 6.6.0, endpoint id could be -1, as it is not an endpoint. Such as local span and exist span.
-             */
-        }
-
         if (standardBuilder.getNetworkAddressId() == 0 && !Strings.isNullOrEmpty(standardBuilder.getNetworkAddress())) {
             int networkAddressId = networkAddressInventoryRegister.getOrCreate(
                 standardBuilder.getNetworkAddress(), null);
@@ -142,16 +84,4 @@ public class ReferenceIdExchanger implements IdExchanger<ReferenceDecorator> {
         }
         return exchanged;
     }
-
-    /**
-     * @since 6.6.0 The endpoint in the ref should be server endpoint only. The agent will/should use `-1`, when it can't
-     * find the endpoint of entry span in the current tracing context when build the ref.
-     * @since 5.0 Endpoint in ref could be local or exit span's operation name. Especially if it is local span operation
-     * name, * exchange may not happen at agent, such as Java agent, then put literal endpoint string in the header,
-     * Need to try * to get the id by assuming the endpoint name is detected at server, local or client. * <p> * If
-     * agent does the exchange, then always use endpoint id.
-     */
-    private int getEndpointId(int serviceId, String endpointName) {
-        return endpointInventoryRegister.generate(serviceId, endpointName, DetectPoint.SERVER);
-    }
 }
diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/standardization/SpanExchanger.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/standardization/SpanExchanger.java
index 9a12d28..c948990 100644
--- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/standardization/SpanExchanger.java
+++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/standardization/SpanExchanger.java
@@ -24,7 +24,6 @@ import java.util.List;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.skywalking.apm.network.common.KeyStringValuePair;
 import org.apache.skywalking.apm.network.language.agent.SpanLayer;
-import org.apache.skywalking.apm.network.language.agent.SpanType;
 import org.apache.skywalking.oap.server.core.Const;
 import org.apache.skywalking.oap.server.core.CoreModule;
 import org.apache.skywalking.oap.server.core.cache.ServiceInstanceInventoryCache;
@@ -33,11 +32,9 @@ import org.apache.skywalking.oap.server.core.config.IComponentLibraryCatalogServ
 import org.apache.skywalking.oap.server.core.register.NodeType;
 import org.apache.skywalking.oap.server.core.register.ServiceInstanceInventory;
 import org.apache.skywalking.oap.server.core.register.ServiceInventory;
-import org.apache.skywalking.oap.server.core.register.service.IEndpointTrafficGenerator;
 import org.apache.skywalking.oap.server.core.register.service.INetworkAddressInventoryRegister;
 import org.apache.skywalking.oap.server.core.register.service.IServiceInstanceInventoryRegister;
 import org.apache.skywalking.oap.server.core.register.service.IServiceInventoryRegister;
-import org.apache.skywalking.oap.server.core.source.DetectPoint;
 import org.apache.skywalking.oap.server.library.module.ModuleManager;
 import org.apache.skywalking.oap.server.receiver.trace.provider.parser.decorator.SpanDecorator;
 
@@ -54,7 +51,6 @@ public class SpanExchanger implements IdExchanger<SpanDecorator> {
     private final IServiceInventoryRegister serviceInventoryRegister;
     private final ServiceInstanceInventoryCache serviceInstanceInventoryCacheDAO;
     private final IServiceInstanceInventoryRegister serviceInstanceInventoryRegister;
-    private final IEndpointTrafficGenerator endpointInventoryRegister;
     private final INetworkAddressInventoryRegister networkAddressInventoryRegister;
     private final IComponentLibraryCatalogService componentLibraryCatalogService;
 
@@ -78,9 +74,6 @@ public class SpanExchanger implements IdExchanger<SpanDecorator> {
         this.serviceInstanceInventoryRegister = moduleManager.find(CoreModule.NAME)
                                                              .provider()
                                                              .getService(IServiceInstanceInventoryRegister.class);
-        this.endpointInventoryRegister = moduleManager.find(CoreModule.NAME)
-                                                      .provider()
-                                                      .getService(IEndpointTrafficGenerator.class);
         this.networkAddressInventoryRegister = moduleManager.find(CoreModule.NAME)
                                                             .provider()
                                                             .getService(INetworkAddressInventoryRegister.class);
@@ -154,32 +147,6 @@ public class SpanExchanger implements IdExchanger<SpanDecorator> {
             serviceInstanceInventoryRegister.update(newServiceInstanceInventory.getSequence(), nodeType, properties);
         }
 
-        if (standardBuilder.getOperationNameId() == Const.NONE) {
-            /**
-             * Only operation name of entry span is being treated as an endpoint,
-             * so, since 6.6.0, only it triggers register.
-             */
-            if (SpanType.Entry.equals(standardBuilder.getSpanType())) {
-                String endpointName = Strings.isNullOrEmpty(
-                    standardBuilder.getOperationName()) ? Const.DOMAIN_OPERATION_NAME : standardBuilder
-                    .getOperationName();
-                int endpointId = endpointInventoryRegister.generate(
-                    serviceId, endpointName, DetectPoint.fromSpanType(standardBuilder
-                                                                          .getSpanType()));
-
-                if (endpointId == 0) {
-                    if (log.isDebugEnabled()) {
-                        log.debug("endpoint name: {} from service id: {} exchange failed", endpointName, serviceId);
-                    }
-
-                    exchanged = false;
-                } else {
-                    standardBuilder.toBuilder();
-                    standardBuilder.setOperationNameId(endpointId);
-                    standardBuilder.setOperationName(Const.EMPTY_STRING);
-                }
-            }
-        }
         return exchanged;
     }
 
diff --git a/oap-server/server-receiver-plugin/zipkin-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/zipkin/trace/SpanForward.java b/oap-server/server-receiver-plugin/zipkin-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/zipkin/trace/SpanForward.java
index 27a48d4..f1e36e7 100644
--- a/oap-server/server-receiver-plugin/zipkin-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/zipkin/trace/SpanForward.java
+++ b/oap-server/server-receiver-plugin/zipkin-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/zipkin/trace/SpanForward.java
@@ -76,7 +76,7 @@ public class SpanForward {
                 case SERVER:
                 case CONSUMER:
                     if (!StringUtil.isEmpty(spanName) && serviceId != Const.NONE) {
-                        int endpointId = endpointInventoryCache.getEndpointId(serviceId, spanName, DetectPoint.SERVER.ordinal());
+                        int endpointId = endpointInventoryCache.getEndpointId(serviceId, spanName, DetectPoint.SERVER.value());
                         if (endpointId != Const.NONE) {
                             zipkinSpan.setEndpointId(endpointId);
                         } else if (config.isRegisterZipkinEndpoint()) {
diff --git a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/StorageModuleElasticsearchProvider.java b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/StorageModuleElasticsearchProvider.java
index af7c4bb..e89eb09 100644
--- a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/StorageModuleElasticsearchProvider.java
+++ b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/StorageModuleElasticsearchProvider.java
@@ -40,7 +40,6 @@ import org.apache.skywalking.oap.server.core.storage.IRegisterLockDAO;
 import org.apache.skywalking.oap.server.core.storage.StorageDAO;
 import org.apache.skywalking.oap.server.core.storage.StorageException;
 import org.apache.skywalking.oap.server.core.storage.StorageModule;
-import org.apache.skywalking.oap.server.core.storage.cache.IEndpointInventoryCacheDAO;
 import org.apache.skywalking.oap.server.core.storage.cache.INetworkAddressInventoryCacheDAO;
 import org.apache.skywalking.oap.server.core.storage.cache.IServiceInstanceInventoryCacheDAO;
 import org.apache.skywalking.oap.server.core.storage.cache.IServiceInventoryCacheDAO;
@@ -68,7 +67,6 @@ import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.base.Histor
 import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.base.StorageEsDAO;
 import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.base.StorageEsInstaller;
 import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.base.TimeSeriesUtils;
-import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.cache.EndpointInventoryCacheEsDAO;
 import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.cache.NetworkAddressInventoryCacheEsDAO;
 import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.cache.ServiceInstanceInventoryCacheDAO;
 import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.cache.ServiceInventoryCacheEsDAO;
@@ -177,8 +175,6 @@ public class StorageModuleElasticsearchProvider extends ModuleProvider {
             IServiceInstanceInventoryCacheDAO.class, new ServiceInstanceInventoryCacheDAO(elasticSearchClient, config
                 .getResultWindowMaxSize()));
         this.registerServiceImplementation(
-            IEndpointInventoryCacheDAO.class, new EndpointInventoryCacheEsDAO(elasticSearchClient));
-        this.registerServiceImplementation(
             INetworkAddressInventoryCacheDAO.class, new NetworkAddressInventoryCacheEsDAO(elasticSearchClient, config
                 .getResultWindowMaxSize()));
 
diff --git a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/cache/EndpointInventoryCacheEsDAO.java b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/cache/EndpointInventoryCacheEsDAO.java
deleted file mode 100644
index 0e35acc..0000000
--- a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/cache/EndpointInventoryCacheEsDAO.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-package org.apache.skywalking.oap.server.storage.plugin.elasticsearch.cache;
-
-import org.apache.skywalking.oap.server.core.Const;
-import org.apache.skywalking.oap.server.core.analysis.manual.endpoint.EndpointTraffic;
-import org.apache.skywalking.oap.server.core.register.RegisterSource;
-import org.apache.skywalking.oap.server.core.storage.cache.IEndpointInventoryCacheDAO;
-import org.apache.skywalking.oap.server.library.client.elasticsearch.ElasticSearchClient;
-import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.base.EsDAO;
-import org.elasticsearch.action.get.GetResponse;
-import org.elasticsearch.action.search.SearchResponse;
-import org.elasticsearch.index.query.QueryBuilders;
-import org.elasticsearch.search.SearchHit;
-import org.elasticsearch.search.builder.SearchSourceBuilder;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class EndpointInventoryCacheEsDAO extends EsDAO implements IEndpointInventoryCacheDAO {
-
-    private static final Logger logger = LoggerFactory.getLogger(EndpointInventoryCacheEsDAO.class);
-
-    protected final EndpointTraffic.Builder builder = new EndpointTraffic.Builder();
-
-    public EndpointInventoryCacheEsDAO(ElasticSearchClient client) {
-        super(client);
-    }
-
-    @Override
-    public int getEndpointId(int serviceId, String endpointName, int detectPoint) {
-        try {
-            String id = EndpointTraffic.buildId(serviceId, endpointName, detectPoint);
-            GetResponse response = getClient().get(EndpointTraffic.INDEX_NAME, id);
-            if (response.isExists()) {
-                return (int) response.getSource().getOrDefault(RegisterSource.SEQUENCE, 0);
-            } else {
-                return Const.NONE;
-            }
-        } catch (Throwable e) {
-            logger.error(e.getMessage(), e);
-            return Const.NONE;
-        }
-    }
-
-    @Override
-    public EndpointTraffic get(int endpointId) {
-        try {
-            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
-            searchSourceBuilder.query(QueryBuilders.termQuery(EndpointTraffic.SEQUENCE, endpointId));
-            searchSourceBuilder.size(1);
-
-            SearchResponse response = getClient().search(EndpointTraffic.INDEX_NAME, searchSourceBuilder);
-            if (response.getHits().totalHits == 1) {
-                SearchHit searchHit = response.getHits().getAt(0);
-                return builder.map2Data(searchHit.getSourceAsMap());
-            } else {
-                return null;
-            }
-        } catch (Throwable e) {
-            logger.error(e.getMessage(), e);
-            return null;
-        }
-    }
-}
diff --git a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/MetadataQueryEsDAO.java b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/MetadataQueryEsDAO.java
index 7c3abb5..2a6ad95 100644
--- a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/MetadataQueryEsDAO.java
+++ b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/MetadataQueryEsDAO.java
@@ -26,13 +26,14 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
+import org.apache.skywalking.oap.server.core.analysis.manual.endpoint.EndpointTraffic;
 import org.apache.skywalking.oap.server.core.query.entity.Attribute;
 import org.apache.skywalking.oap.server.core.query.entity.Database;
 import org.apache.skywalking.oap.server.core.query.entity.Endpoint;
 import org.apache.skywalking.oap.server.core.query.entity.LanguageTrans;
 import org.apache.skywalking.oap.server.core.query.entity.Service;
 import org.apache.skywalking.oap.server.core.query.entity.ServiceInstance;
-import org.apache.skywalking.oap.server.core.analysis.manual.endpoint.EndpointTraffic;
 import org.apache.skywalking.oap.server.core.register.NodeType;
 import org.apache.skywalking.oap.server.core.register.RegisterSource;
 import org.apache.skywalking.oap.server.core.register.ServiceInstanceInventory;
@@ -83,6 +84,9 @@ public class MetadataQueryEsDAO extends EsDAO implements IMetadataQueryDAO {
         return (int) response.getHits().getTotalHits();
     }
 
+    /**
+     * @since 7.0.0, as EndpointInventory has been replaced by EndpointTraffic. This is not an accurate number anymore.
+     */
     @Override
     public int numOfEndpoint() throws IOException {
         SearchSourceBuilder sourceBuilder = SearchSourceBuilder.searchSource();
@@ -90,7 +94,7 @@ public class MetadataQueryEsDAO extends EsDAO implements IMetadataQueryDAO {
         BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
 
         boolQueryBuilder.must()
-                        .add(QueryBuilders.termQuery(EndpointTraffic.DETECT_POINT, DetectPoint.SERVER.ordinal()));
+                        .add(QueryBuilders.termQuery(EndpointTraffic.DETECT_POINT, DetectPoint.SERVER.value()));
 
         sourceBuilder.query(boolQueryBuilder);
         sourceBuilder.size(0);
@@ -226,10 +230,15 @@ public class MetadataQueryEsDAO extends EsDAO implements IMetadataQueryDAO {
         }
 
         boolQueryBuilder.must()
-                        .add(QueryBuilders.termQuery(EndpointTraffic.DETECT_POINT, DetectPoint.SERVER.ordinal()));
+                        .add(QueryBuilders.termQuery(EndpointTraffic.DETECT_POINT, DetectPoint.SERVER.value()));
 
         sourceBuilder.query(boolQueryBuilder);
-        sourceBuilder.size(limit);
+        /**
+         * Query the dataset by a larger limit condition and distinct in the memory,
+         * in order to avoid the storage level distinct.
+         * This is a match query only, don't need 100% accurate.
+         */
+        sourceBuilder.size(limit * 7);
 
         SearchResponse response = getClient().search(EndpointTraffic.INDEX_NAME, sourceBuilder);
 
@@ -237,18 +246,22 @@ public class MetadataQueryEsDAO extends EsDAO implements IMetadataQueryDAO {
         for (SearchHit searchHit : response.getHits()) {
             Map<String, Object> sourceAsMap = searchHit.getSourceAsMap();
 
+            final EndpointTraffic endpointTraffic = new EndpointTraffic.Builder().map2Data(sourceAsMap);
+
             Endpoint endpoint = new Endpoint();
-            endpoint.setId(((Number) sourceAsMap.get(EndpointTraffic.SEQUENCE)).intValue());
+            endpoint.setId(EndpointTraffic.buildId(endpointTraffic));
             endpoint.setName((String) sourceAsMap.get(EndpointTraffic.NAME));
             endpoints.add(endpoint);
         }
 
-        return endpoints;
+        final List<Endpoint> endpointList = endpoints.stream().distinct().collect(Collectors.toList());
+
+        return endpointList.size() > limit ? endpointList.subList(0, limit) : endpointList;
     }
 
     @Override
     public List<ServiceInstance> getServiceInstances(long startTimestamp, long endTimestamp,
-        String serviceId) throws IOException {
+                                                     String serviceId) throws IOException {
         SearchSourceBuilder sourceBuilder = SearchSourceBuilder.searchSource();
 
         BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
@@ -285,8 +298,9 @@ public class MetadataQueryEsDAO extends EsDAO implements IMetadataQueryDAO {
                     } else if (key.equals(PROCESS_NO)) {
                         serviceInstance.getAttributes().add(new Attribute(PROCESS_NO, value));
                     } else if (key.equals(IPV4S)) {
-                        List<String> ipv4s = ServiceInstanceInventory.PropertyUtil.ipv4sDeserialize(properties.get(IPV4S)
-                                                                                                              .getAsString());
+                        List<String> ipv4s = ServiceInstanceInventory.PropertyUtil.ipv4sDeserialize(
+                            properties.get(IPV4S)
+                                      .getAsString());
                         for (String ipv4 : ipv4s) {
                             serviceInstance.getAttributes()
                                            .add(new Attribute(ServiceInstanceInventory.PropertyUtil.IPV4S, ipv4));
diff --git a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/TopologyQueryEsDAO.java b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/TopologyQueryEsDAO.java
index 24ae7fb..29ccea3 100644
--- a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/TopologyQueryEsDAO.java
+++ b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/TopologyQueryEsDAO.java
@@ -18,6 +18,9 @@
 
 package org.apache.skywalking.oap.server.storage.plugin.elasticsearch.query;
 
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
 import org.apache.skywalking.oap.server.core.UnexpectedException;
 import org.apache.skywalking.oap.server.core.analysis.Downsampling;
 import org.apache.skywalking.oap.server.core.analysis.manual.RelationDefineUtil;
@@ -42,10 +45,6 @@ import org.elasticsearch.search.aggregations.AggregationBuilders;
 import org.elasticsearch.search.aggregations.bucket.terms.Terms;
 import org.elasticsearch.search.builder.SearchSourceBuilder;
 
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
 public class TopologyQueryEsDAO extends EsDAO implements ITopologyQueryDAO {
 
     public TopologyQueryEsDAO(ElasticSearchClient client) {
@@ -53,8 +52,10 @@ public class TopologyQueryEsDAO extends EsDAO implements ITopologyQueryDAO {
     }
 
     @Override
-    public List<Call.CallDetail> loadSpecifiedServerSideServiceRelations(Downsampling downsampling, long startTB,
-        long endTB, List<Integer> serviceIds) throws IOException {
+    public List<Call.CallDetail> loadSpecifiedServerSideServiceRelations(Downsampling downsampling,
+                                                                         long startTB,
+                                                                         long endTB,
+                                                                         List<Integer> serviceIds) throws IOException {
         if (CollectionUtils.isEmpty(serviceIds)) {
             throw new UnexpectedException("Service id is empty");
         }
@@ -68,8 +69,10 @@ public class TopologyQueryEsDAO extends EsDAO implements ITopologyQueryDAO {
     }
 
     @Override
-    public List<Call.CallDetail> loadSpecifiedClientSideServiceRelations(Downsampling downsampling, long startTB,
-        long endTB, List<Integer> serviceIds) throws IOException {
+    public List<Call.CallDetail> loadSpecifiedClientSideServiceRelations(Downsampling downsampling,
+                                                                         long startTB,
+                                                                         long endTB,
+                                                                         List<Integer> serviceIds) throws IOException {
         if (CollectionUtils.isEmpty(serviceIds)) {
             throw new UnexpectedException("Service id is empty");
         }
@@ -83,7 +86,7 @@ public class TopologyQueryEsDAO extends EsDAO implements ITopologyQueryDAO {
     }
 
     private void setQueryCondition(SearchSourceBuilder sourceBuilder, long startTB, long endTB,
-        List<Integer> serviceIds) {
+                                   List<Integer> serviceIds) {
         BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
         boolQuery.must()
                  .add(QueryBuilders.rangeQuery(ServiceRelationServerSideMetrics.TIME_BUCKET).gte(startTB).lte(endTB));
@@ -93,22 +96,32 @@ public class TopologyQueryEsDAO extends EsDAO implements ITopologyQueryDAO {
 
         if (serviceIds.size() == 1) {
             serviceIdBoolQuery.should()
-                              .add(QueryBuilders.termQuery(ServiceRelationServerSideMetrics.SOURCE_SERVICE_ID, serviceIds
-                                  .get(0)));
+                              .add(
+                                  QueryBuilders.termQuery(ServiceRelationServerSideMetrics.SOURCE_SERVICE_ID, serviceIds
+                                      .get(0)));
             serviceIdBoolQuery.should()
-                              .add(QueryBuilders.termQuery(ServiceRelationServerSideMetrics.DEST_SERVICE_ID, serviceIds.get(0)));
+                              .add(QueryBuilders.termQuery(
+                                  ServiceRelationServerSideMetrics.DEST_SERVICE_ID,
+                                  serviceIds.get(0)
+                              ));
         } else {
             serviceIdBoolQuery.should()
-                              .add(QueryBuilders.termsQuery(ServiceRelationServerSideMetrics.SOURCE_SERVICE_ID, serviceIds));
+                              .add(QueryBuilders.termsQuery(
+                                  ServiceRelationServerSideMetrics.SOURCE_SERVICE_ID,
+                                  serviceIds
+                              ));
             serviceIdBoolQuery.should()
-                              .add(QueryBuilders.termsQuery(ServiceRelationServerSideMetrics.DEST_SERVICE_ID, serviceIds));
+                              .add(QueryBuilders.termsQuery(
+                                  ServiceRelationServerSideMetrics.DEST_SERVICE_ID,
+                                  serviceIds
+                              ));
         }
         sourceBuilder.query(boolQuery);
     }
 
     @Override
     public List<Call.CallDetail> loadServerSideServiceRelations(Downsampling downsampling, long startTB,
-        long endTB) throws IOException {
+                                                                long endTB) throws IOException {
         String indexName = ModelName.build(downsampling, ServiceRelationServerSideMetrics.INDEX_NAME);
         SearchSourceBuilder sourceBuilder = SearchSourceBuilder.searchSource();
         sourceBuilder.query(QueryBuilders.rangeQuery(ServiceRelationServerSideMetrics.TIME_BUCKET)
@@ -121,7 +134,7 @@ public class TopologyQueryEsDAO extends EsDAO implements ITopologyQueryDAO {
 
     @Override
     public List<Call.CallDetail> loadClientSideServiceRelations(Downsampling downsampling, long startTB,
-        long endTB) throws IOException {
+                                                                long endTB) throws IOException {
         String indexName = ModelName.build(downsampling, ServiceRelationClientSideMetrics.INDEX_NAME);
         SearchSourceBuilder sourceBuilder = SearchSourceBuilder.searchSource();
         sourceBuilder.query(QueryBuilders.rangeQuery(ServiceRelationServerSideMetrics.TIME_BUCKET)
@@ -133,8 +146,11 @@ public class TopologyQueryEsDAO extends EsDAO implements ITopologyQueryDAO {
     }
 
     @Override
-    public List<Call.CallDetail> loadServerSideServiceInstanceRelations(int clientServiceId, int serverServiceId,
-        Downsampling downsampling, long startTB, long endTB) throws IOException {
+    public List<Call.CallDetail> loadServerSideServiceInstanceRelations(int clientServiceId,
+                                                                        int serverServiceId,
+                                                                        Downsampling downsampling,
+                                                                        long startTB,
+                                                                        long endTB) throws IOException {
         String indexName = ModelName.build(downsampling, ServiceInstanceRelationServerSideMetrics.INDEX_NAME);
         SearchSourceBuilder sourceBuilder = SearchSourceBuilder.searchSource();
         sourceBuilder.size(0);
@@ -144,8 +160,11 @@ public class TopologyQueryEsDAO extends EsDAO implements ITopologyQueryDAO {
     }
 
     @Override
-    public List<Call.CallDetail> loadClientSideServiceInstanceRelations(int clientServiceId, int serverServiceId,
-        Downsampling downsampling, long startTB, long endTB) throws IOException {
+    public List<Call.CallDetail> loadClientSideServiceInstanceRelations(int clientServiceId,
+                                                                        int serverServiceId,
+                                                                        Downsampling downsampling,
+                                                                        long startTB,
+                                                                        long endTB) throws IOException {
         String indexName = ModelName.build(downsampling, ServiceInstanceRelationClientSideMetrics.INDEX_NAME);
         SearchSourceBuilder sourceBuilder = SearchSourceBuilder.searchSource();
         sourceBuilder.size(0);
@@ -155,7 +174,7 @@ public class TopologyQueryEsDAO extends EsDAO implements ITopologyQueryDAO {
     }
 
     private void setInstanceQueryCondition(SearchSourceBuilder sourceBuilder, long startTB, long endTB,
-        int clientServiceId, int serverServiceId) {
+                                           int clientServiceId, int serverServiceId) {
         BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
         boolQuery.must()
                  .add(QueryBuilders.rangeQuery(EndpointRelationServerSideMetrics.TIME_BUCKET).gte(startTB).lte(endTB));
@@ -166,21 +185,27 @@ public class TopologyQueryEsDAO extends EsDAO implements ITopologyQueryDAO {
         BoolQueryBuilder serverRelationBoolQuery = new BoolQueryBuilder();
         serviceIdBoolQuery.should(serverRelationBoolQuery);
 
-        serverRelationBoolQuery.must(QueryBuilders.termQuery(ServiceInstanceRelationServerSideMetrics.SOURCE_SERVICE_ID, clientServiceId));
-        serverRelationBoolQuery.must(QueryBuilders.termQuery(ServiceInstanceRelationServerSideMetrics.DEST_SERVICE_ID, serverServiceId));
+        serverRelationBoolQuery.must(
+            QueryBuilders.termQuery(ServiceInstanceRelationServerSideMetrics.SOURCE_SERVICE_ID, clientServiceId));
+        serverRelationBoolQuery.must(
+            QueryBuilders.termQuery(ServiceInstanceRelationServerSideMetrics.DEST_SERVICE_ID, serverServiceId));
 
         BoolQueryBuilder clientRelationBoolQuery = new BoolQueryBuilder();
         serviceIdBoolQuery.should(clientRelationBoolQuery);
 
-        clientRelationBoolQuery.must(QueryBuilders.termQuery(ServiceInstanceRelationServerSideMetrics.DEST_SERVICE_ID, clientServiceId));
-        clientRelationBoolQuery.must(QueryBuilders.termQuery(ServiceInstanceRelationServerSideMetrics.SOURCE_SERVICE_ID, serverServiceId));
+        clientRelationBoolQuery.must(
+            QueryBuilders.termQuery(ServiceInstanceRelationServerSideMetrics.DEST_SERVICE_ID, clientServiceId));
+        clientRelationBoolQuery.must(
+            QueryBuilders.termQuery(ServiceInstanceRelationServerSideMetrics.SOURCE_SERVICE_ID, serverServiceId));
 
         sourceBuilder.query(boolQuery);
     }
 
     @Override
-    public List<Call.CallDetail> loadSpecifiedDestOfServerSideEndpointRelations(Downsampling downsampling, long startTB,
-        long endTB, int destEndpointId) throws IOException {
+    public List<Call.CallDetail> loadSpecifiedDestOfServerSideEndpointRelations(Downsampling downsampling,
+                                                                                long startTB,
+                                                                                long endTB,
+                                                                                int destEndpointId) throws IOException {
         String indexName = ModelName.build(downsampling, EndpointRelationServerSideMetrics.INDEX_NAME);
 
         SearchSourceBuilder sourceBuilder = SearchSourceBuilder.searchSource();
@@ -193,17 +218,44 @@ public class TopologyQueryEsDAO extends EsDAO implements ITopologyQueryDAO {
         BoolQueryBuilder serviceIdBoolQuery = QueryBuilders.boolQuery();
         boolQuery.must().add(serviceIdBoolQuery);
         serviceIdBoolQuery.should()
-                          .add(QueryBuilders.termQuery(EndpointRelationServerSideMetrics.SOURCE_ENDPOINT, destEndpointId));
+                          .add(QueryBuilders.termQuery(
+                              EndpointRelationServerSideMetrics.SOURCE_ENDPOINT,
+                              destEndpointId
+                          ));
         serviceIdBoolQuery.should()
-                          .add(QueryBuilders.termQuery(EndpointRelationServerSideMetrics.DEST_ENDPOINT, destEndpointId));
+                          .add(
+                              QueryBuilders.termQuery(EndpointRelationServerSideMetrics.DEST_ENDPOINT, destEndpointId));
 
         sourceBuilder.query(boolQuery);
 
-        return load(sourceBuilder, indexName, DetectPoint.SERVER);
+        return loadEndpoint(sourceBuilder, indexName, DetectPoint.SERVER);
     }
 
     private List<Call.CallDetail> load(SearchSourceBuilder sourceBuilder, String indexName,
-        DetectPoint detectPoint) throws IOException {
+                                       DetectPoint detectPoint) throws IOException {
+        sourceBuilder.aggregation(AggregationBuilders.terms(Metrics.ENTITY_ID).field(Metrics.ENTITY_ID).size(1000));
+
+        SearchResponse response = getClient().search(indexName, sourceBuilder);
+
+        List<Call.CallDetail> calls = new ArrayList<>();
+        Terms entityTerms = response.getAggregations().get(Metrics.ENTITY_ID);
+        for (Terms.Bucket entityBucket : entityTerms.getBuckets()) {
+            String entityId = entityBucket.getKeyAsString();
+
+            RelationDefineUtil.RelationDefine relationDefine = RelationDefineUtil.splitEntityId(entityId);
+            Call.CallDetail call = new Call.CallDetail();
+            call.setSource(String.valueOf(relationDefine.getSource()));
+            call.setTarget(String.valueOf(relationDefine.getDest()));
+            call.setComponentId(relationDefine.getComponentId());
+            call.setDetectPoint(detectPoint);
+            call.generateID();
+            calls.add(call);
+        }
+        return calls;
+    }
+
+    private List<Call.CallDetail> loadEndpoint(SearchSourceBuilder sourceBuilder, String indexName,
+                                               DetectPoint detectPoint) throws IOException {
         sourceBuilder.aggregation(AggregationBuilders.terms(Metrics.ENTITY_ID).field(Metrics.ENTITY_ID).size(1000));
 
         SearchResponse response = getClient().search(indexName, sourceBuilder);
@@ -213,10 +265,15 @@ public class TopologyQueryEsDAO extends EsDAO implements ITopologyQueryDAO {
         for (Terms.Bucket entityBucket : entityTerms.getBuckets()) {
             String entityId = entityBucket.getKeyAsString();
 
-            RelationDefineUtil.EndpointRelationDefine relationDefine = RelationDefineUtil.splitEndpointEntityId(entityId);
+            RelationDefineUtil.EndpointRelationDefine relationDefine = RelationDefineUtil.splitEndpointEntityId(
+                entityId);
             Call.CallDetail call = new Call.CallDetail();
-            call.setSource(EndpointTraffic.buildId(relationDefine.getSourceServiceId(), relationDefine.getSource(), DetectPoint.SERVER.ordinal()));
-            call.setTarget(EndpointTraffic.buildId(relationDefine.getDestServiceId(), relationDefine.getDest(), DetectPoint.SERVER.ordinal()));
+            call.setSource(EndpointTraffic.buildId(relationDefine.getSourceServiceId(), relationDefine.getSource(),
+                                                   detectPoint
+            ));
+            call.setTarget(EndpointTraffic.buildId(relationDefine.getDestServiceId(), relationDefine.getDest(),
+                                                   detectPoint
+            ));
             call.setComponentId(relationDefine.getComponentId());
             call.setDetectPoint(detectPoint);
             call.generateID();
diff --git a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/TraceQueryEsDAO.java b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/TraceQueryEsDAO.java
index 65ca713..e133045 100644
--- a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/TraceQueryEsDAO.java
+++ b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/TraceQueryEsDAO.java
@@ -54,9 +54,19 @@ public class TraceQueryEsDAO extends EsDAO implements ITraceQueryDAO {
     }
 
     @Override
-    public TraceBrief queryBasicTraces(long startSecondTB, long endSecondTB, long minDuration, long maxDuration,
-        String endpointName, int serviceId, int serviceInstanceId, int endpointId, String traceId, int limit, int from,
-        TraceState traceState, QueryOrder queryOrder) throws IOException {
+    public TraceBrief queryBasicTraces(long startSecondTB,
+                                       long endSecondTB,
+                                       long minDuration,
+                                       long maxDuration,
+                                       String endpointName,
+                                       int serviceId,
+                                       int serviceInstanceId,
+                                       String endpointId,
+                                       String traceId,
+                                       int limit,
+                                       int from,
+                                       TraceState traceState,
+                                       QueryOrder queryOrder) throws IOException {
         SearchSourceBuilder sourceBuilder = SearchSourceBuilder.searchSource();
 
         BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
@@ -87,7 +97,7 @@ public class TraceQueryEsDAO extends EsDAO implements ITraceQueryDAO {
         if (serviceInstanceId != 0) {
             boolQueryBuilder.must().add(QueryBuilders.termQuery(SegmentRecord.SERVICE_INSTANCE_ID, serviceInstanceId));
         }
-        if (endpointId != 0) {
+        if (!Strings.isNullOrEmpty(endpointId)) {
             boolQueryBuilder.must().add(QueryBuilders.termQuery(SegmentRecord.ENDPOINT_ID, endpointId));
         }
         if (!Strings.isNullOrEmpty(traceId)) {
@@ -125,7 +135,8 @@ public class TraceQueryEsDAO extends EsDAO implements ITraceQueryDAO {
             basicTrace.getEndpointNames().add((String) searchHit.getSourceAsMap().get(SegmentRecord.ENDPOINT_NAME));
             basicTrace.setDuration(((Number) searchHit.getSourceAsMap().get(SegmentRecord.LATENCY)).intValue());
             basicTrace.setError(BooleanUtils.valueToBoolean(((Number) searchHit.getSourceAsMap()
-                                                                               .get(SegmentRecord.IS_ERROR)).intValue()));
+                                                                               .get(
+                                                                                   SegmentRecord.IS_ERROR)).intValue()));
             basicTrace.getTraceIds().add((String) searchHit.getSourceAsMap().get(SegmentRecord.TRACE_ID));
             traceBrief.getTraces().add(basicTrace);
         }
diff --git a/oap-server/server-storage-plugin/storage-elasticsearch7-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch7/StorageModuleElasticsearch7Provider.java b/oap-server/server-storage-plugin/storage-elasticsearch7-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch7/StorageModuleElasticsearch7Provider.java
index 0951c40..21a8685 100644
--- a/oap-server/server-storage-plugin/storage-elasticsearch7-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch7/StorageModuleElasticsearch7Provider.java
+++ b/oap-server/server-storage-plugin/storage-elasticsearch7-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch7/StorageModuleElasticsearch7Provider.java
@@ -34,7 +34,6 @@ import org.apache.skywalking.oap.server.core.storage.IRegisterLockDAO;
 import org.apache.skywalking.oap.server.core.storage.StorageDAO;
 import org.apache.skywalking.oap.server.core.storage.StorageException;
 import org.apache.skywalking.oap.server.core.storage.StorageModule;
-import org.apache.skywalking.oap.server.core.storage.cache.IEndpointInventoryCacheDAO;
 import org.apache.skywalking.oap.server.core.storage.cache.INetworkAddressInventoryCacheDAO;
 import org.apache.skywalking.oap.server.core.storage.cache.IServiceInstanceInventoryCacheDAO;
 import org.apache.skywalking.oap.server.core.storage.cache.IServiceInventoryCacheDAO;
@@ -63,7 +62,6 @@ import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.query.TopNR
 import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.query.TopologyQueryEsDAO;
 import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.ttl.ElasticsearchStorageTTL;
 import org.apache.skywalking.oap.server.storage.plugin.elasticsearch7.base.StorageEs7Installer;
-import org.apache.skywalking.oap.server.storage.plugin.elasticsearch7.cache.EndpointInventoryCacheEs7DAO;
 import org.apache.skywalking.oap.server.storage.plugin.elasticsearch7.cache.NetworkAddressInventoryCacheEs7DAO;
 import org.apache.skywalking.oap.server.storage.plugin.elasticsearch7.cache.ServiceInstanceInventoryCacheEs7DAO;
 import org.apache.skywalking.oap.server.storage.plugin.elasticsearch7.cache.ServiceInventoryCacheEs7DAO;
@@ -172,8 +170,6 @@ public class StorageModuleElasticsearch7Provider extends ModuleProvider {
                 config.getResultWindowMaxSize()
             ));
         this.registerServiceImplementation(
-            IEndpointInventoryCacheDAO.class, new EndpointInventoryCacheEs7DAO(elasticSearch7Client));
-        this.registerServiceImplementation(
             INetworkAddressInventoryCacheDAO.class, new NetworkAddressInventoryCacheEs7DAO(
                 elasticSearch7Client,
                 config.getResultWindowMaxSize()
diff --git a/oap-server/server-storage-plugin/storage-elasticsearch7-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch7/query/MetadataQueryEs7DAO.java b/oap-server/server-storage-plugin/storage-elasticsearch7-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch7/query/MetadataQueryEs7DAO.java
index 55d1a54..29ab5e2 100644
--- a/oap-server/server-storage-plugin/storage-elasticsearch7-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch7/query/MetadataQueryEs7DAO.java
+++ b/oap-server/server-storage-plugin/storage-elasticsearch7-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch7/query/MetadataQueryEs7DAO.java
@@ -54,6 +54,9 @@ public class MetadataQueryEs7DAO extends MetadataQueryEsDAO {
         return (int) response.getHits().getTotalHits().value;
     }
 
+    /**
+     * @since 7.0.0, as EndpointInventory has been replaced by EndpointTraffic. This is not an accurate number anymore.
+     */
     @Override
     public int numOfEndpoint() throws IOException {
         SearchSourceBuilder sourceBuilder = SearchSourceBuilder.searchSource();
@@ -61,7 +64,7 @@ public class MetadataQueryEs7DAO extends MetadataQueryEsDAO {
         BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
 
         boolQueryBuilder.must()
-                        .add(QueryBuilders.termQuery(EndpointTraffic.DETECT_POINT, DetectPoint.SERVER.ordinal()));
+                        .add(QueryBuilders.termQuery(EndpointTraffic.DETECT_POINT, DetectPoint.SERVER.value()));
 
         sourceBuilder.query(boolQueryBuilder);
         sourceBuilder.size(0);
diff --git a/oap-server/server-storage-plugin/storage-elasticsearch7-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch7/query/TraceQueryEs7DAO.java b/oap-server/server-storage-plugin/storage-elasticsearch7-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch7/query/TraceQueryEs7DAO.java
index ea89e6e..862bf54 100644
--- a/oap-server/server-storage-plugin/storage-elasticsearch7-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch7/query/TraceQueryEs7DAO.java
+++ b/oap-server/server-storage-plugin/storage-elasticsearch7-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch7/query/TraceQueryEs7DAO.java
@@ -48,7 +48,7 @@ public class TraceQueryEs7DAO extends TraceQueryEsDAO {
 
     @Override
     public TraceBrief queryBasicTraces(long startSecondTB, long endSecondTB, long minDuration, long maxDuration,
-        String endpointName, int serviceId, int serviceInstanceId, int endpointId, String traceId, int limit, int from,
+        String endpointName, int serviceId, int serviceInstanceId, String endpointId, String traceId, int limit, int from,
         TraceState traceState, QueryOrder queryOrder) throws IOException {
         SearchSourceBuilder sourceBuilder = SearchSourceBuilder.searchSource();
 
@@ -80,7 +80,7 @@ public class TraceQueryEs7DAO extends TraceQueryEsDAO {
         if (serviceInstanceId != 0) {
             boolQueryBuilder.must().add(QueryBuilders.termQuery(SegmentRecord.SERVICE_INSTANCE_ID, serviceInstanceId));
         }
-        if (endpointId != 0) {
+        if (!Strings.isNullOrEmpty(endpointId)) {
             boolQueryBuilder.must().add(QueryBuilders.termQuery(SegmentRecord.ENDPOINT_ID, endpointId));
         }
         if (!Strings.isNullOrEmpty(traceId)) {
diff --git a/oap-server/server-storage-plugin/storage-influxdb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/influxdb/query/TopologyQuery.java b/oap-server/server-storage-plugin/storage-influxdb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/influxdb/query/TopologyQuery.java
index de9e40a..25ed12e 100644
--- a/oap-server/server-storage-plugin/storage-influxdb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/influxdb/query/TopologyQuery.java
+++ b/oap-server/server-storage-plugin/storage-influxdb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/influxdb/query/TopologyQuery.java
@@ -178,7 +178,7 @@ public class TopologyQuery implements ITopologyQueryDAO {
         query2.and(eq(EndpointRelationServerSideMetrics.SOURCE_ENDPOINT, destEndpointId));
 
         List<Call.CallDetail> calls = buildCalls(query, DetectPoint.SERVER);
-        calls.addAll(buildCalls(query2, DetectPoint.CLIENT));
+        calls.addAll(buildEndpointCalls(query2, DetectPoint.CLIENT));
         return calls;
     }
 
@@ -244,10 +244,37 @@ public class TopologyQuery implements ITopologyQueryDAO {
         series.getValues().forEach(values -> {
             Call.CallDetail call = new Call.CallDetail();
             String entityId = (String) values.get(1);
+            RelationDefineUtil.RelationDefine relationDefine = RelationDefineUtil.splitEntityId(entityId);
+
+            call.setSource(String.valueOf(relationDefine.getSource()));
+            call.setTarget(String.valueOf(relationDefine.getDest()));
+            call.setComponentId(relationDefine.getComponentId());
+            call.setDetectPoint(detectPoint);
+            call.generateID();
+            calls.add(call);
+        });
+        return calls;
+    }
+
+    private List<Call.CallDetail> buildEndpointCalls(WhereQueryImpl query,
+                                             DetectPoint detectPoint) throws IOException {
+        QueryResult.Series series = client.queryForSingleSeries(query);
+
+        if (log.isDebugEnabled()) {
+            log.debug("SQL: {} result set: {}", query.getCommand(), series);
+        }
+        if (series == null) {
+            return Collections.emptyList();
+        }
+
+        List<Call.CallDetail> calls = new ArrayList<>();
+        series.getValues().forEach(values -> {
+            Call.CallDetail call = new Call.CallDetail();
+            String entityId = (String) values.get(1);
             RelationDefineUtil.EndpointRelationDefine relationDefine = RelationDefineUtil.splitEndpointEntityId(entityId);
 
-            call.setSource(EndpointTraffic.buildId(relationDefine.getSourceServiceId(), relationDefine.getSource(), DetectPoint.SERVER.ordinal()));
-            call.setTarget(EndpointTraffic.buildId(relationDefine.getDestServiceId(), relationDefine.getDest(), DetectPoint.SERVER.ordinal()));
+            call.setSource(EndpointTraffic.buildId(relationDefine.getSourceServiceId(), relationDefine.getSource(), detectPoint));
+            call.setTarget(EndpointTraffic.buildId(relationDefine.getDestServiceId(), relationDefine.getDest(), detectPoint));
             call.setComponentId(relationDefine.getComponentId());
             call.setDetectPoint(detectPoint);
             call.generateID();
diff --git a/oap-server/server-storage-plugin/storage-influxdb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/influxdb/query/TraceQuery.java b/oap-server/server-storage-plugin/storage-influxdb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/influxdb/query/TraceQuery.java
index 6ad679e..74a847c 100644
--- a/oap-server/server-storage-plugin/storage-influxdb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/influxdb/query/TraceQuery.java
+++ b/oap-server/server-storage-plugin/storage-influxdb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/influxdb/query/TraceQuery.java
@@ -63,7 +63,7 @@ public class TraceQuery implements ITraceQueryDAO {
                                        String endpointName,
                                        int serviceId,
                                        int serviceInstanceId,
-                                       int endpointId,
+                                       String endpointId,
                                        String traceId,
                                        int limit,
                                        int from,
@@ -106,7 +106,7 @@ public class TraceQuery implements ITraceQueryDAO {
         if (serviceInstanceId != 0) {
             recallQuery.and(eq(SegmentRecord.SERVICE_INSTANCE_ID, serviceInstanceId));
         }
-        if (endpointId != 0) {
+        if (!com.google.common.base.Strings.isNullOrEmpty(endpointId)) {
             recallQuery.and(eq(SegmentRecord.ENDPOINT_ID, endpointId));
         }
         if (!Strings.isNullOrEmpty(traceId)) {
diff --git a/oap-server/server-storage-plugin/storage-jaeger-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jaeger/elasticsearch/JaegerTraceQueryEsDAO.java b/oap-server/server-storage-plugin/storage-jaeger-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jaeger/elasticsearch/JaegerTraceQueryEsDAO.java
index d292843..473a20a 100644
--- a/oap-server/server-storage-plugin/storage-jaeger-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jaeger/elasticsearch/JaegerTraceQueryEsDAO.java
+++ b/oap-server/server-storage-plugin/storage-jaeger-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jaeger/elasticsearch/JaegerTraceQueryEsDAO.java
@@ -80,9 +80,19 @@ public class JaegerTraceQueryEsDAO extends EsDAO implements ITraceQueryDAO {
     }
 
     @Override
-    public TraceBrief queryBasicTraces(long startSecondTB, long endSecondTB, long minDuration, long maxDuration,
-        String endpointName, int serviceId, int serviceInstanceId, int endpointId, String traceId, int limit, int from,
-        TraceState traceState, QueryOrder queryOrder) throws IOException {
+    public TraceBrief queryBasicTraces(long startSecondTB,
+                                       long endSecondTB,
+                                       long minDuration,
+                                       long maxDuration,
+                                       String endpointName,
+                                       int serviceId,
+                                       int serviceInstanceId,
+                                       String endpointId,
+                                       String traceId,
+                                       int limit,
+                                       int from,
+                                       TraceState traceState,
+                                       QueryOrder queryOrder) throws IOException {
 
         SearchSourceBuilder sourceBuilder = SearchSourceBuilder.searchSource();
 
@@ -113,7 +123,7 @@ public class JaegerTraceQueryEsDAO extends EsDAO implements ITraceQueryDAO {
         if (serviceInstanceId != 0) {
             boolQueryBuilder.must().add(QueryBuilders.termQuery(SERVICE_INSTANCE_ID, serviceInstanceId));
         }
-        if (endpointId != 0) {
+        if (!Strings.isNullOrEmpty(endpointId)) {
             boolQueryBuilder.must().add(QueryBuilders.termQuery(ENDPOINT_ID, endpointId));
         }
         if (!Strings.isNullOrEmpty(traceId)) {
diff --git a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2EndpointInventoryCacheDAO.java b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2EndpointInventoryCacheDAO.java
deleted file mode 100644
index f75be15..0000000
--- a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2EndpointInventoryCacheDAO.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-package org.apache.skywalking.oap.server.storage.plugin.jdbc.h2.dao;
-
-import java.io.IOException;
-import org.apache.skywalking.oap.server.core.analysis.manual.endpoint.EndpointTraffic;
-import org.apache.skywalking.oap.server.core.storage.cache.IEndpointInventoryCacheDAO;
-import org.apache.skywalking.oap.server.library.client.jdbc.hikaricp.JDBCHikariCPClient;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class H2EndpointInventoryCacheDAO extends H2SQLExecutor implements IEndpointInventoryCacheDAO {
-    private static final Logger logger = LoggerFactory.getLogger(H2EndpointInventoryCacheDAO.class);
-    private JDBCHikariCPClient h2Client;
-
-    public H2EndpointInventoryCacheDAO(JDBCHikariCPClient h2Client) {
-        this.h2Client = h2Client;
-    }
-
-    @Override
-    public int getEndpointId(int serviceId, String endpointName, int detectPoint) {
-        String id = EndpointTraffic.buildId(serviceId, endpointName, detectPoint);
-        return getEntityIDByID(h2Client, EndpointTraffic.SEQUENCE, EndpointTraffic.INDEX_NAME, id);
-    }
-
-    @Override
-    public EndpointTraffic get(int endpointId) {
-        try {
-            return (EndpointTraffic) getByColumn(h2Client, EndpointTraffic.INDEX_NAME, EndpointTraffic.SEQUENCE, endpointId, new EndpointTraffic.Builder());
-        } catch (IOException e) {
-            logger.error(e.getMessage(), e);
-            return null;
-        }
-    }
-}
diff --git a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2MetadataQueryDAO.java b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2MetadataQueryDAO.java
index 2d8f11f..b334f66 100644
--- a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2MetadataQueryDAO.java
+++ b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2MetadataQueryDAO.java
@@ -29,13 +29,13 @@ import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import org.apache.skywalking.oap.server.core.analysis.manual.endpoint.EndpointTraffic;
 import org.apache.skywalking.oap.server.core.query.entity.Attribute;
 import org.apache.skywalking.oap.server.core.query.entity.Database;
 import org.apache.skywalking.oap.server.core.query.entity.Endpoint;
 import org.apache.skywalking.oap.server.core.query.entity.LanguageTrans;
 import org.apache.skywalking.oap.server.core.query.entity.Service;
 import org.apache.skywalking.oap.server.core.query.entity.ServiceInstance;
-import org.apache.skywalking.oap.server.core.analysis.manual.endpoint.EndpointTraffic;
 import org.apache.skywalking.oap.server.core.register.NodeType;
 import org.apache.skywalking.oap.server.core.register.RegisterSource;
 import org.apache.skywalking.oap.server.core.register.ServiceInstanceInventory;
@@ -76,7 +76,8 @@ public class H2MetadataQueryDAO implements IMetadataQueryDAO {
 
     private Integer getNum(StringBuilder sql, List<Object> condition) throws IOException {
         try (Connection connection = h2Client.getConnection()) {
-            try (ResultSet resultSet = h2Client.executeQuery(connection, sql.toString(), condition.toArray(new Object[0]))) {
+            try (ResultSet resultSet = h2Client.executeQuery(
+                connection, sql.toString(), condition.toArray(new Object[0]))) {
                 if (resultSet.next()) {
                     return resultSet.getInt("num");
                 }
@@ -92,7 +93,7 @@ public class H2MetadataQueryDAO implements IMetadataQueryDAO {
         StringBuilder sql = new StringBuilder();
         List<Object> condition = new ArrayList<>(5);
         sql.append("select count(*) num from ").append(EndpointTraffic.INDEX_NAME).append(" where ");
-        sql.append(EndpointTraffic.DETECT_POINT).append("=").append(DetectPoint.SERVER.ordinal());
+        sql.append(EndpointTraffic.DETECT_POINT).append("=").append(DetectPoint.SERVER.value());
 
         return getNum(sql, condition);
     }
@@ -121,7 +122,8 @@ public class H2MetadataQueryDAO implements IMetadataQueryDAO {
         sql.append(" limit ").append(metadataQueryMaxSize);
 
         try (Connection connection = h2Client.getConnection()) {
-            try (ResultSet resultSet = h2Client.executeQuery(connection, sql.toString(), condition.toArray(new Object[0]))) {
+            try (ResultSet resultSet = h2Client.executeQuery(
+                connection, sql.toString(), condition.toArray(new Object[0]))) {
                 return buildServices(resultSet);
             }
         } catch (SQLException e) {
@@ -142,7 +144,8 @@ public class H2MetadataQueryDAO implements IMetadataQueryDAO {
         sql.append(" limit ").append(metadataQueryMaxSize);
 
         try (Connection connection = h2Client.getConnection()) {
-            try (ResultSet resultSet = h2Client.executeQuery(connection, sql.toString(), condition.toArray(new Object[0]))) {
+            try (ResultSet resultSet = h2Client.executeQuery(
+                connection, sql.toString(), condition.toArray(new Object[0]))) {
                 return buildServices(resultSet);
             }
         } catch (SQLException e) {
@@ -159,7 +162,8 @@ public class H2MetadataQueryDAO implements IMetadataQueryDAO {
         condition.add(NodeType.Database.value());
 
         try (Connection connection = h2Client.getConnection()) {
-            try (ResultSet resultSet = h2Client.executeQuery(connection, sql.toString(), condition.toArray(new Object[0]))) {
+            try (ResultSet resultSet = h2Client.executeQuery(
+                connection, sql.toString(), condition.toArray(new Object[0]))) {
                 List<Database> databases = new ArrayList<>();
                 while (resultSet.next()) {
                     Database database = new Database();
@@ -199,7 +203,8 @@ public class H2MetadataQueryDAO implements IMetadataQueryDAO {
         sql.append(" limit ").append(metadataQueryMaxSize);
 
         try (Connection connection = h2Client.getConnection()) {
-            try (ResultSet resultSet = h2Client.executeQuery(connection, sql.toString(), condition.toArray(new Object[0]))) {
+            try (ResultSet resultSet = h2Client.executeQuery(
+                connection, sql.toString(), condition.toArray(new Object[0]))) {
                 return buildServices(resultSet);
             }
         } catch (SQLException e) {
@@ -218,7 +223,8 @@ public class H2MetadataQueryDAO implements IMetadataQueryDAO {
         condition.add(serviceCode);
 
         try (Connection connection = h2Client.getConnection()) {
-            try (ResultSet resultSet = h2Client.executeQuery(connection, sql.toString(), condition.toArray(new Object[0]))) {
+            try (ResultSet resultSet = h2Client.executeQuery(
+                connection, sql.toString(), condition.toArray(new Object[0]))) {
 
                 while (resultSet.next()) {
                     Service service = new Service();
@@ -245,17 +251,29 @@ public class H2MetadataQueryDAO implements IMetadataQueryDAO {
             sql.append(" and ").append(EndpointTraffic.NAME).append(" like '%").append(keyword).append("%' ");
         }
         sql.append(" and ").append(EndpointTraffic.DETECT_POINT).append(" = ?");
-        condition.add(DetectPoint.SERVER.ordinal());
-        sql.append(" limit ").append(limit);
+        condition.add(DetectPoint.SERVER.value());
+        /**
+         * Query the dataset by a larger limit condition and distinct in the memory,
+         * in order to avoid the storage level distinct.
+         * This is a match query only, don't need 100% accurate.
+         */
+        sql.append(" limit ").append(limit * 7);
 
         List<Endpoint> endpoints = new ArrayList<>();
         try (Connection connection = h2Client.getConnection()) {
-            try (ResultSet resultSet = h2Client.executeQuery(connection, sql.toString(), condition.toArray(new Object[0]))) {
+            try (ResultSet resultSet = h2Client.executeQuery(
+                connection, sql.toString(), condition.toArray(new Object[0]))) {
 
                 while (resultSet.next()) {
+                    EndpointTraffic endpointTraffic = new EndpointTraffic();
+                    endpointTraffic.setServiceId(resultSet.getInt(EndpointTraffic.SERVICE_ID));
+                    endpointTraffic.setName(resultSet.getString(EndpointTraffic.NAME));
+                    endpointTraffic.setDetectPoint(resultSet.getInt(EndpointTraffic.DETECT_POINT));
+                    endpointTraffic.setTimeBucket(resultSet.getLong(EndpointTraffic.TIME_BUCKET));
+
                     Endpoint endpoint = new Endpoint();
-                    endpoint.setId(resultSet.getInt(EndpointTraffic.SEQUENCE));
-                    endpoint.setName(resultSet.getString(EndpointTraffic.NAME));
+                    endpoint.setId(EndpointTraffic.buildId(endpointTraffic));
+                    endpoint.setName(endpointTraffic.getName());
                     endpoints.add(endpoint);
                 }
             }
@@ -267,7 +285,7 @@ public class H2MetadataQueryDAO implements IMetadataQueryDAO {
 
     @Override
     public List<ServiceInstance> getServiceInstances(long startTimestamp, long endTimestamp,
-        String serviceId) throws IOException {
+                                                     String serviceId) throws IOException {
         StringBuilder sql = new StringBuilder();
         List<Object> condition = new ArrayList<>(5);
         sql.append("select * from ").append(ServiceInstanceInventory.INDEX_NAME).append(" where ");
@@ -277,7 +295,8 @@ public class H2MetadataQueryDAO implements IMetadataQueryDAO {
 
         List<ServiceInstance> serviceInstances = new ArrayList<>();
         try (Connection connection = h2Client.getConnection()) {
-            try (ResultSet resultSet = h2Client.executeQuery(connection, sql.toString(), condition.toArray(new Object[0]))) {
+            try (ResultSet resultSet = h2Client.executeQuery(
+                connection, sql.toString(), condition.toArray(new Object[0]))) {
 
                 while (resultSet.next()) {
                     ServiceInstance serviceInstance = new ServiceInstance();
@@ -300,11 +319,14 @@ public class H2MetadataQueryDAO implements IMetadataQueryDAO {
                             } else if (key.equals(PROCESS_NO)) {
                                 serviceInstance.getAttributes().add(new Attribute(PROCESS_NO, value));
                             } else if (key.equals(IPV4S)) {
-                                List<String> ipv4s = ServiceInstanceInventory.PropertyUtil.ipv4sDeserialize(properties.get(IPV4S)
-                                                                                                                      .getAsString());
+                                List<String> ipv4s = ServiceInstanceInventory.PropertyUtil.ipv4sDeserialize(
+                                    properties.get(IPV4S)
+                                              .getAsString());
                                 for (String ipv4 : ipv4s) {
                                     serviceInstance.getAttributes()
-                                                   .add(new Attribute(ServiceInstanceInventory.PropertyUtil.IPV4S, ipv4));
+                                                   .add(new Attribute(ServiceInstanceInventory.PropertyUtil.IPV4S,
+                                                                      ipv4
+                                                   ));
                                 }
                             } else {
                                 serviceInstance.getAttributes().add(new Attribute(key, value));
@@ -322,7 +344,7 @@ public class H2MetadataQueryDAO implements IMetadataQueryDAO {
     }
 
     private void setTimeRangeCondition(StringBuilder sql, List<Object> conditions, long startTimestamp,
-        long endTimestamp) {
+                                       long endTimestamp) {
         sql.append(" ( (")
            .append(RegisterSource.HEARTBEAT_TIME)
            .append(" >= ? and ")
diff --git a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2TopologyQueryDAO.java b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2TopologyQueryDAO.java
index aef2e9a..e6fee08 100644
--- a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2TopologyQueryDAO.java
+++ b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2TopologyQueryDAO.java
@@ -170,7 +170,7 @@ public class H2TopologyQueryDAO implements ITopologyQueryDAO {
         List<Call.CallDetail> calls = new ArrayList<>();
         try (Connection connection = h2Client.getConnection()) {
             try (ResultSet resultSet = h2Client.executeQuery(connection, "select " + Metrics.ENTITY_ID + " from " + tableName + " where " + Metrics.TIME_BUCKET + ">= ? and " + Metrics.TIME_BUCKET + "<=? and " + (isSourceId ? sourceCName : destCName) + "=?" + " group by " + Metrics.ENTITY_ID, conditions)) {
-                buildCalls(resultSet, calls, isSourceId);
+                buildEndpointCalls(resultSet, calls, isSourceId);
             }
         } catch (SQLException e) {
             throw new IOException(e);
@@ -183,10 +183,10 @@ public class H2TopologyQueryDAO implements ITopologyQueryDAO {
         while (resultSet.next()) {
             Call.CallDetail call = new Call.CallDetail();
             String entityId = resultSet.getString(Metrics.ENTITY_ID);
-            RelationDefineUtil.EndpointRelationDefine relationDefine = RelationDefineUtil.splitEndpointEntityId(entityId);
+            RelationDefineUtil.RelationDefine relationDefine = RelationDefineUtil.splitEntityId(entityId);
 
-            call.setSource(EndpointTraffic.buildId(relationDefine.getSourceServiceId(), relationDefine.getSource(), DetectPoint.SERVER.ordinal()));
-            call.setTarget(EndpointTraffic.buildId(relationDefine.getDestServiceId(), relationDefine.getDest(), DetectPoint.SERVER.ordinal()));
+            call.setSource(String.valueOf(relationDefine.getSource()));
+            call.setTarget(String.valueOf(relationDefine.getDest()));
             call.setComponentId(relationDefine.getComponentId());
             if (isClientSide) {
                 call.setDetectPoint(DetectPoint.CLIENT);
@@ -197,4 +197,25 @@ public class H2TopologyQueryDAO implements ITopologyQueryDAO {
             calls.add(call);
         }
     }
+
+    private void buildEndpointCalls(ResultSet resultSet, List<Call.CallDetail> calls,
+                            boolean isClientSide) throws SQLException {
+        while (resultSet.next()) {
+            Call.CallDetail call = new Call.CallDetail();
+            String entityId = resultSet.getString(Metrics.ENTITY_ID);
+            RelationDefineUtil.EndpointRelationDefine relationDefine = RelationDefineUtil.splitEndpointEntityId(entityId);
+
+            if (isClientSide) {
+                call.setDetectPoint(DetectPoint.CLIENT);
+            } else {
+                call.setDetectPoint(DetectPoint.SERVER);
+            }
+            call.setSource(EndpointTraffic.buildId(relationDefine.getSourceServiceId(), relationDefine.getSource(), call.getDetectPoint()));
+            call.setTarget(EndpointTraffic.buildId(relationDefine.getDestServiceId(), relationDefine.getDest(), call.getDetectPoint()));
+            call.setComponentId(relationDefine.getComponentId());
+
+            call.generateID();
+            calls.add(call);
+        }
+    }
 }
diff --git a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2TraceQueryDAO.java b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2TraceQueryDAO.java
index 40f1932..ff222ef 100644
--- a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2TraceQueryDAO.java
+++ b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2TraceQueryDAO.java
@@ -48,7 +48,7 @@ public class H2TraceQueryDAO implements ITraceQueryDAO {
 
     @Override
     public TraceBrief queryBasicTraces(long startSecondTB, long endSecondTB, long minDuration, long maxDuration,
-        String endpointName, int serviceId, int serviceInstanceId, int endpointId, String traceId, int limit, int from,
+        String endpointName, int serviceId, int serviceInstanceId, String endpointId, String traceId, int limit, int from,
         TraceState traceState, QueryOrder queryOrder) throws IOException {
         StringBuilder sql = new StringBuilder();
         List<Object> parameters = new ArrayList<>(10);
@@ -82,7 +82,7 @@ public class H2TraceQueryDAO implements ITraceQueryDAO {
             sql.append(" and ").append(SegmentRecord.SERVICE_INSTANCE_ID).append(" = ?");
             parameters.add(serviceInstanceId);
         }
-        if (endpointId != 0) {
+        if (!Strings.isNullOrEmpty(endpointId)) {
             sql.append(" and ").append(SegmentRecord.ENDPOINT_ID).append(" = ?");
             parameters.add(endpointId);
         }
diff --git a/oap-server/server-storage-plugin/storage-zipkin-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/zipkin/elasticsearch/ZipkinTraceQueryEsDAO.java b/oap-server/server-storage-plugin/storage-zipkin-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/zipkin/elasticsearch/ZipkinTraceQueryEsDAO.java
index 9461142..579993d 100644
--- a/oap-server/server-storage-plugin/storage-zipkin-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/zipkin/elasticsearch/ZipkinTraceQueryEsDAO.java
+++ b/oap-server/server-storage-plugin/storage-zipkin-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/zipkin/elasticsearch/ZipkinTraceQueryEsDAO.java
@@ -78,9 +78,19 @@ public class ZipkinTraceQueryEsDAO extends EsDAO implements ITraceQueryDAO {
     }
 
     @Override
-    public TraceBrief queryBasicTraces(long startSecondTB, long endSecondTB, long minDuration, long maxDuration,
-        String endpointName, int serviceId, int serviceInstanceId, int endpointId, String traceId, int limit, int from,
-        TraceState traceState, QueryOrder queryOrder) throws IOException {
+    public TraceBrief queryBasicTraces(long startSecondTB,
+                                       long endSecondTB,
+                                       long minDuration,
+                                       long maxDuration,
+                                       String endpointName,
+                                       int serviceId,
+                                       int serviceInstanceId,
+                                       String endpointId,
+                                       String traceId,
+                                       int limit,
+                                       int from,
+                                       TraceState traceState,
+                                       QueryOrder queryOrder) throws IOException {
 
         SearchSourceBuilder sourceBuilder = SearchSourceBuilder.searchSource();
 
@@ -111,7 +121,7 @@ public class ZipkinTraceQueryEsDAO extends EsDAO implements ITraceQueryDAO {
         if (serviceInstanceId != 0) {
             boolQueryBuilder.must().add(QueryBuilders.termQuery(SERVICE_INSTANCE_ID, serviceInstanceId));
         }
-        if (endpointId != 0) {
+        if (!Strings.isNullOrEmpty(endpointId)) {
             boolQueryBuilder.must().add(QueryBuilders.termQuery(ENDPOINT_ID, endpointId));
         }
         if (!Strings.isNullOrEmpty(traceId)) {