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

[skywalking] 01/01: Enhance endpoint dependency analysis to support cross threads cases.

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

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

commit c452c91432ec30a480b808a9e57a7a246e3be77f
Author: Wu Sheng <wu...@foxmail.com>
AuthorDate: Fri Mar 25 20:27:02 2022 +0800

    Enhance endpoint dependency analysis to support cross threads cases.
---
 CHANGES.md                                         |   2 +
 .../analyzer/provider/AnalyzerModuleProvider.java  |   6 +-
 .../parser/listener/CommonAnalysisListener.java    |  39 ++++++
 .../EndpointDepFromNotRPCAnalysisListener.java     | 150 +++++++++++++++++++++
 .../parser/listener/EndpointDependencyBuilder.java |  52 +++++++
 .../parser/listener/EndpointSourceBuilder.java     | 113 ++++++++++++++++
 .../NetworkAddressAliasMappingListener.java        |   2 +-
 ...lysisListener.java => RPCAnalysisListener.java} |  92 ++++++-------
 ...ceBuilder.java => RPCTrafficSourceBuilder.java} | 116 ++++------------
 .../oap/server/core/source/Endpoint.java           |   4 -
 .../oap/server/core/source/EndpointRelation.java   |   4 -
 .../skywalking/oap/server/core/source/Service.java |   4 -
 .../oap/server/core/source/ServiceInstance.java    |   4 -
 .../oap/server/core/source/ServiceRelation.java    |   4 -
 .../receiver/mesh/TelemetryDataDispatcher.java     |   4 -
 ...tenerTest.java => RPCAnalysisListenerTest.java} |  23 ++--
 test/e2e-v2/script/env                             |   2 +-
 17 files changed, 436 insertions(+), 185 deletions(-)

diff --git a/CHANGES.md b/CHANGES.md
index d1f6c88..865f8a8 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -139,6 +139,8 @@ NOTICE, this sharding concept is NOT just for splitting data into different data
 
 * Support ElasticSearch template mappings `properties parameters` and `_source` update.
 * Implement the eBPF profiling query and data collect protocol.
+* [**Breaking Change**] Remove **Deprecated responseCode** from sources, including Service, ServiceInstance, Endpoint
+* Enhance endpoint dependency analysis to support cross threads cases. Refactor span analysis code structures. 
 
 #### UI
 
diff --git a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/AnalyzerModuleProvider.java b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/AnalyzerModuleProvider.java
index 4fe93d5..5cd3067 100644
--- a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/AnalyzerModuleProvider.java
+++ b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/AnalyzerModuleProvider.java
@@ -32,7 +32,8 @@ import org.apache.skywalking.oap.server.analyzer.provider.trace.UninstrumentedGa
 import org.apache.skywalking.oap.server.analyzer.provider.trace.parser.ISegmentParserService;
 import org.apache.skywalking.oap.server.analyzer.provider.trace.parser.SegmentParserListenerManager;
 import org.apache.skywalking.oap.server.analyzer.provider.trace.parser.SegmentParserServiceImpl;
-import org.apache.skywalking.oap.server.analyzer.provider.trace.parser.listener.MultiScopesAnalysisListener;
+import org.apache.skywalking.oap.server.analyzer.provider.trace.parser.listener.EndpointDepFromNotRPCAnalysisListener;
+import org.apache.skywalking.oap.server.analyzer.provider.trace.parser.listener.RPCAnalysisListener;
 import org.apache.skywalking.oap.server.analyzer.provider.trace.parser.listener.NetworkAddressAliasMappingListener;
 import org.apache.skywalking.oap.server.analyzer.provider.trace.parser.listener.SegmentAnalysisListener;
 import org.apache.skywalking.oap.server.configuration.api.ConfigurationModule;
@@ -141,7 +142,8 @@ public class AnalyzerModuleProvider extends ModuleProvider {
     private SegmentParserListenerManager listenerManager() {
         SegmentParserListenerManager listenerManager = new SegmentParserListenerManager();
         if (moduleConfig.isTraceAnalysis()) {
-            listenerManager.add(new MultiScopesAnalysisListener.Factory(getManager()));
+            listenerManager.add(new RPCAnalysisListener.Factory(getManager()));
+            listenerManager.add(new EndpointDepFromNotRPCAnalysisListener.Factory(getManager()));
             listenerManager.add(new NetworkAddressAliasMappingListener.Factory(getManager()));
         }
         listenerManager.add(new SegmentAnalysisListener.Factory(getManager(), moduleConfig));
diff --git a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/CommonAnalysisListener.java b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/CommonAnalysisListener.java
new file mode 100644
index 0000000..8ff8baa
--- /dev/null
+++ b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/CommonAnalysisListener.java
@@ -0,0 +1,39 @@
+/*
+ * 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.analyzer.provider.trace.parser.listener;
+
+import org.apache.skywalking.apm.network.language.agent.v3.SpanLayer;
+import org.apache.skywalking.oap.server.core.analysis.Layer;
+
+/**
+ * The common logic for specific listeners.
+ */
+abstract class CommonAnalysisListener {
+    /**
+     * Identify the layer of span's service/instance owner. Such as  ${@link Layer#FAAS} and ${@link Layer#GENERAL}.
+     */
+    protected Layer identifyServiceLayer(SpanLayer spanLayer) {
+        if (SpanLayer.FAAS.equals(spanLayer)) {
+            // function as a Service
+            return Layer.FAAS;
+        } else {
+            return Layer.GENERAL;
+        }
+    }
+}
diff --git a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/EndpointDepFromNotRPCAnalysisListener.java b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/EndpointDepFromNotRPCAnalysisListener.java
new file mode 100644
index 0000000..9ef5665
--- /dev/null
+++ b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/EndpointDepFromNotRPCAnalysisListener.java
@@ -0,0 +1,150 @@
+/*
+ * 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.analyzer.provider.trace.parser.listener;
+
+import java.util.ArrayList;
+import java.util.List;
+import lombok.RequiredArgsConstructor;
+import org.apache.skywalking.apm.network.language.agent.v3.SegmentObject;
+import org.apache.skywalking.apm.network.language.agent.v3.SegmentReference;
+import org.apache.skywalking.apm.network.language.agent.v3.SpanLayer;
+import org.apache.skywalking.apm.network.language.agent.v3.SpanObject;
+import org.apache.skywalking.oap.server.analyzer.provider.AnalyzerModuleConfig;
+import org.apache.skywalking.oap.server.core.Const;
+import org.apache.skywalking.oap.server.core.CoreModule;
+import org.apache.skywalking.oap.server.core.analysis.Layer;
+import org.apache.skywalking.oap.server.core.analysis.TimeBucket;
+import org.apache.skywalking.oap.server.core.config.NamingControl;
+import org.apache.skywalking.oap.server.core.source.DetectPoint;
+import org.apache.skywalking.oap.server.core.source.SourceReceiver;
+import org.apache.skywalking.oap.server.library.module.ModuleManager;
+import org.apache.skywalking.oap.server.library.util.StringUtil;
+
+/**
+ * Endpoint dependency could be detected by local and exit span.
+ * {@link RPCAnalysisListener} is detecting all RPC relative statistics.
+ *
+ * @since 9.0.0
+ */
+@RequiredArgsConstructor
+public class EndpointDepFromNotRPCAnalysisListener extends CommonAnalysisListener implements ExitAnalysisListener, LocalAnalysisListener {
+    private final SourceReceiver sourceReceiver;
+    private final AnalyzerModuleConfig config;
+    private final NamingControl namingControl;
+
+    private final List<EndpointDependencyBuilder> depBuilders = new ArrayList<>(10);
+
+    @Override
+    public boolean containsPoint(final Point point) {
+        return Point.Exit.equals(point) || Point.Local.equals(point);
+    }
+
+    @Override
+    public void parseExit(final SpanObject span, final SegmentObject segmentObject) {
+        parseRefForEndpointDependency(span, segmentObject);
+    }
+
+    @Override
+    public void parseLocal(final SpanObject span, final SegmentObject segmentObject) {
+        parseRefForEndpointDependency(span, segmentObject);
+    }
+
+    private void parseRefForEndpointDependency(final SpanObject span, final SegmentObject segmentObject) {
+        if (span.getSkipAnalysis()) {
+            return;
+        }
+
+        if (span.getRefsCount() > 0) {
+            for (int i = 0; i < span.getRefsCount(); i++) {
+                SegmentReference reference = span.getRefs(i);
+                RPCTrafficSourceBuilder sourceBuilder = new RPCTrafficSourceBuilder(namingControl);
+
+                if (StringUtil.isEmpty(reference.getParentEndpoint())) {
+                    sourceBuilder.setSourceEndpointName(Const.USER_ENDPOINT_NAME);
+                } else {
+                    sourceBuilder.setSourceEndpointName(reference.getParentEndpoint());
+                }
+
+                final String networkAddressUsedAtPeer = reference.getNetworkAddressUsedAtPeer();
+                boolean isMQ = span.getSpanLayer().equals(SpanLayer.MQ);
+                if (isMQ || config.getUninstrumentedGatewaysConfig()
+                                  .isAddressConfiguredAsGateway(networkAddressUsedAtPeer)) {
+                    sourceBuilder.setSourceServiceName(networkAddressUsedAtPeer);
+                    sourceBuilder.setSourceEndpointOwnerServiceName(reference.getParentService());
+                    sourceBuilder.setSourceServiceInstanceName(networkAddressUsedAtPeer);
+                    if (isMQ) {
+                        sourceBuilder.setSourceLayer(Layer.VIRTUAL_MQ);
+                    } else {
+                        sourceBuilder.setSourceLayer(Layer.VIRTUAL_GATEWAY);
+                    }
+                } else {
+                    sourceBuilder.setSourceServiceName(reference.getParentService());
+                    sourceBuilder.setSourceServiceInstanceName(reference.getParentServiceInstance());
+                    sourceBuilder.setSourceLayer(Layer.GENERAL);
+                }
+                sourceBuilder.setDestEndpointName(span.getOperationName());
+                sourceBuilder.setDestServiceInstanceName(segmentObject.getServiceInstance());
+                sourceBuilder.setDestServiceName(segmentObject.getService());
+                sourceBuilder.setDestLayer(identifyServiceLayer(span.getSpanLayer()));
+                sourceBuilder.setDetectPoint(DetectPoint.SERVER);
+                sourceBuilder.setComponentId(span.getComponentId());
+                setPublicAttrs(sourceBuilder, span);
+                depBuilders.add(new EndpointDependencyBuilder(sourceBuilder));
+            }
+        }
+    }
+
+    private void setPublicAttrs(RPCTrafficSourceBuilder sourceBuilder, SpanObject span) {
+        long latency = span.getEndTime() - span.getStartTime();
+        sourceBuilder.setTimeBucket(TimeBucket.getMinuteTimeBucket(span.getStartTime()));
+        sourceBuilder.setLatency((int) latency);
+        sourceBuilder.setHttpResponseStatusCode(Const.NONE);
+        span.getTagsList().forEach(sourceBuilder::setTag);
+        sourceBuilder.setStatus(!span.getIsError());
+    }
+
+    @Override
+    public void build() {
+        depBuilders.forEach(endpointDep -> {
+            // Source endpoint meta could be generated duplicated if it belongs to an entry span of downstream.
+            // But if it belongs a local or exit span, then miss it in metadata.
+            // Consider OAP has the capability to remove duplicate, generate it anyway.
+            sourceReceiver.receive(endpointDep.toSourceEndpoint());
+            sourceReceiver.receive(endpointDep.toEndpoint());
+            sourceReceiver.receive(endpointDep.toEndpointRelation());
+        });
+    }
+
+    public static class Factory implements AnalysisListenerFactory {
+        private final SourceReceiver sourceReceiver;
+        private final NamingControl namingControl;
+
+        public Factory(ModuleManager moduleManager) {
+            this.sourceReceiver = moduleManager.find(CoreModule.NAME).provider().getService(SourceReceiver.class);
+            this.namingControl = moduleManager.find(CoreModule.NAME)
+                                              .provider()
+                                              .getService(NamingControl.class);
+        }
+
+        @Override
+        public AnalysisListener create(final ModuleManager moduleManager, final AnalyzerModuleConfig config) {
+            return new EndpointDepFromNotRPCAnalysisListener(sourceReceiver, config, namingControl);
+        }
+    }
+}
diff --git a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/EndpointDependencyBuilder.java b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/EndpointDependencyBuilder.java
new file mode 100644
index 0000000..d0531b1
--- /dev/null
+++ b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/EndpointDependencyBuilder.java
@@ -0,0 +1,52 @@
+/*
+ * 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.analyzer.provider.trace.parser.listener;
+
+import lombok.RequiredArgsConstructor;
+import org.apache.skywalking.oap.server.core.source.Endpoint;
+import org.apache.skywalking.oap.server.core.source.EndpointMeta;
+import org.apache.skywalking.oap.server.core.source.EndpointRelation;
+
+/**
+ * EndpointDependencyBuilder is a wrapper of {@link RPCTrafficSourceBuilder}, and only exposes to build endpoint
+ * relation relative sources.
+ *
+ * @since 9.0.0
+ */
+@RequiredArgsConstructor
+public class EndpointDependencyBuilder {
+    private final RPCTrafficSourceBuilder rpcTrafficSourceBuilder;
+
+    EndpointRelation toEndpointRelation() {
+        return rpcTrafficSourceBuilder.toEndpointRelation();
+    }
+
+    Endpoint toEndpoint() {
+        return rpcTrafficSourceBuilder.toEndpoint();
+    }
+
+    EndpointMeta toSourceEndpoint() {
+        EndpointMeta sourceEndpoint = new EndpointMeta();
+        sourceEndpoint.setServiceName(rpcTrafficSourceBuilder.getSourceServiceName());
+        sourceEndpoint.setServiceNormal(rpcTrafficSourceBuilder.getSourceLayer().isNormal());
+        sourceEndpoint.setEndpoint(rpcTrafficSourceBuilder.getSourceEndpointName());
+        sourceEndpoint.setTimeBucket(rpcTrafficSourceBuilder.getTimeBucket());
+        return sourceEndpoint;
+    }
+}
diff --git a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/EndpointSourceBuilder.java b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/EndpointSourceBuilder.java
new file mode 100644
index 0000000..9612336
--- /dev/null
+++ b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/EndpointSourceBuilder.java
@@ -0,0 +1,113 @@
+/*
+ * 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.analyzer.provider.trace.parser.listener;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import lombok.Setter;
+import org.apache.skywalking.apm.network.common.v3.KeyStringValuePair;
+import org.apache.skywalking.oap.server.core.analysis.Layer;
+import org.apache.skywalking.oap.server.core.config.NamingControl;
+import org.apache.skywalking.oap.server.core.source.DetectPoint;
+import org.apache.skywalking.oap.server.core.source.Endpoint;
+import org.apache.skywalking.oap.server.core.source.RequestType;
+
+/**
+ * Endpoint traffic source builder. Endpoint represents an entrance to expose logic.
+ * Typically, it could be HTTP URI, gRPC service name, etc. for RPC, or a local method is required to be analyzed.
+ *
+ * @since 9.0.0
+ */
+@RequiredArgsConstructor
+class EndpointSourceBuilder {
+    protected final NamingControl namingControl;
+
+    @Getter
+    @Setter
+    protected long timeBucket;
+    @Getter
+    @Setter
+    protected String destServiceName;
+    @Getter
+    @Setter
+    protected Layer destLayer;
+    @Getter
+    @Setter
+    protected String destServiceInstanceName;
+    @Getter
+    @Setter
+    protected String destEndpointName;
+    @Getter
+    @Setter
+    protected int latency;
+    @Getter
+    @Setter
+    protected boolean status;
+    @Getter
+    @Setter
+    protected int httpResponseStatusCode;
+    @Getter
+    @Setter
+    protected String rpcStatusCode;
+    @Getter
+    @Setter
+    protected RequestType type;
+    @Getter
+    @Setter
+    protected DetectPoint detectPoint;
+    @Getter
+    protected final List<String> tags = new ArrayList<>();
+    @Getter
+    protected final Map<String, String> originalTags = new HashMap<>();
+
+    void prepare() {
+        this.destServiceName = namingControl.formatServiceName(destServiceName);
+        this.destServiceInstanceName = namingControl.formatInstanceName(destServiceInstanceName);
+        this.destEndpointName = namingControl.formatEndpointName(destServiceName, destEndpointName);
+    }
+
+    /**
+     * Endpoint meta and metrics of {@link #destEndpointName} related source. The metrics base on the OAL scripts.
+     */
+    Endpoint toEndpoint() {
+        Endpoint endpoint = new Endpoint();
+        endpoint.setName(destEndpointName);
+        endpoint.setServiceName(destServiceName);
+        endpoint.setServiceLayer(destLayer);
+        endpoint.setServiceInstanceName(destServiceInstanceName);
+        endpoint.setLatency(latency);
+        endpoint.setStatus(status);
+        endpoint.setHttpResponseStatusCode(httpResponseStatusCode);
+        endpoint.setRpcStatusCode(rpcStatusCode);
+        endpoint.setType(type);
+        endpoint.setTags(tags);
+        endpoint.setOriginalTags(originalTags);
+        endpoint.setTimeBucket(timeBucket);
+        return endpoint;
+    }
+
+    void setTag(KeyStringValuePair tag) {
+        tags.add(tag.getKey().trim() + ":" + tag.getValue().trim());
+        originalTags.put(tag.getKey(), tag.getValue());
+    }
+}
diff --git a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/NetworkAddressAliasMappingListener.java b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/NetworkAddressAliasMappingListener.java
index b15b60d..4826673 100644
--- a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/NetworkAddressAliasMappingListener.java
+++ b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/NetworkAddressAliasMappingListener.java
@@ -35,7 +35,7 @@ import org.apache.skywalking.oap.server.analyzer.provider.AnalyzerModuleConfig;
 /**
  * NetworkAddressAliasMappingListener use the propagated data in the segment reference, set up the alias relationship
  * between network address and current service and instance. The alias relationship will be used in the {@link
- * MultiScopesAnalysisListener#parseExit(SpanObject, SegmentObject)} to setup the accurate target destination service
+ * RPCAnalysisListener#parseExit(SpanObject, SegmentObject)} to setup the accurate target destination service
  * and instance.
  *
  * This is a key point of SkyWalking header propagation protocol.
diff --git a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/MultiScopesAnalysisListener.java b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/RPCAnalysisListener.java
similarity index 86%
rename from oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/MultiScopesAnalysisListener.java
rename to oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/RPCAnalysisListener.java
index 4e3d4d2..8e56c6a 100644
--- a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/MultiScopesAnalysisListener.java
+++ b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/RPCAnalysisListener.java
@@ -18,8 +18,6 @@
 
 package org.apache.skywalking.oap.server.analyzer.provider.trace.parser.listener;
 
-import static org.apache.skywalking.oap.server.analyzer.provider.trace.parser.SpanTags.LOGIC_ENDPOINT;
-
 import com.google.gson.Gson;
 import com.google.gson.JsonObject;
 import java.util.ArrayList;
@@ -32,15 +30,14 @@ import org.apache.skywalking.apm.network.language.agent.v3.SegmentReference;
 import org.apache.skywalking.apm.network.language.agent.v3.SpanLayer;
 import org.apache.skywalking.apm.network.language.agent.v3.SpanObject;
 import org.apache.skywalking.apm.network.language.agent.v3.SpanType;
-import org.apache.skywalking.oap.server.core.UnexpectedException;
-import org.apache.skywalking.oap.server.core.analysis.Layer;
-import org.apache.skywalking.oap.server.library.util.StringUtil;
 import org.apache.skywalking.oap.server.analyzer.provider.AnalyzerModuleConfig;
 import org.apache.skywalking.oap.server.analyzer.provider.trace.DBLatencyThresholdsAndWatcher;
 import org.apache.skywalking.oap.server.analyzer.provider.trace.parser.SpanTags;
 import org.apache.skywalking.oap.server.core.Const;
 import org.apache.skywalking.oap.server.core.CoreModule;
+import org.apache.skywalking.oap.server.core.UnexpectedException;
 import org.apache.skywalking.oap.server.core.analysis.IDManager;
+import org.apache.skywalking.oap.server.core.analysis.Layer;
 import org.apache.skywalking.oap.server.core.analysis.TimeBucket;
 import org.apache.skywalking.oap.server.core.analysis.manual.networkalias.NetworkAddressAlias;
 import org.apache.skywalking.oap.server.core.cache.NetworkAddressAliasCache;
@@ -51,19 +48,20 @@ import org.apache.skywalking.oap.server.core.source.RequestType;
 import org.apache.skywalking.oap.server.core.source.ServiceInstanceRelation;
 import org.apache.skywalking.oap.server.core.source.SourceReceiver;
 import org.apache.skywalking.oap.server.library.module.ModuleManager;
+import org.apache.skywalking.oap.server.library.util.StringUtil;
+
+import static org.apache.skywalking.oap.server.analyzer.provider.trace.parser.SpanTags.LOGIC_ENDPOINT;
 
 /**
- * MultiScopesSpanListener includes the most segment to source(s) logic.
- *
- * This listener traverses the whole segment.
+ * RPCAnalysisListener detects all RPC relative statistics.
  */
 @Slf4j
 @RequiredArgsConstructor
-public class MultiScopesAnalysisListener implements EntryAnalysisListener, ExitAnalysisListener, LocalAnalysisListener {
-    private final List<SourceBuilder> entrySourceBuilders = new ArrayList<>(10);
-    private final List<SourceBuilder> exitSourceBuilders = new ArrayList<>(10);
+public class RPCAnalysisListener extends CommonAnalysisListener implements EntryAnalysisListener, ExitAnalysisListener, LocalAnalysisListener {
+    private final List<RPCTrafficSourceBuilder> callingInTraffic = new ArrayList<>(10);
+    private final List<RPCTrafficSourceBuilder> callingOutTraffic = new ArrayList<>(10);
     private final List<DatabaseSlowStatementBuilder> dbSlowStatementBuilders = new ArrayList<>(10);
-    private final List<SourceBuilder> logicEndpointBuilders = new ArrayList<>(10);
+    private final List<EndpointSourceBuilder> logicEndpointBuilders = new ArrayList<>(10);
     private final Gson gson = new Gson();
     private final SourceReceiver sourceReceiver;
     private final AnalyzerModuleConfig config;
@@ -94,7 +92,7 @@ public class MultiScopesAnalysisListener implements EntryAnalysisListener, ExitA
         if (span.getRefsCount() > 0) {
             for (int i = 0; i < span.getRefsCount(); i++) {
                 SegmentReference reference = span.getRefs(i);
-                SourceBuilder sourceBuilder = new SourceBuilder(namingControl);
+                RPCTrafficSourceBuilder sourceBuilder = new RPCTrafficSourceBuilder(namingControl);
 
                 if (StringUtil.isEmpty(reference.getParentEndpoint())) {
                     sourceBuilder.setSourceEndpointName(Const.USER_ENDPOINT_NAME);
@@ -114,6 +112,7 @@ public class MultiScopesAnalysisListener implements EntryAnalysisListener, ExitA
                     } else {
                         sourceBuilder.setSourceLayer(Layer.VIRTUAL_GATEWAY);
                     }
+                    sourceBuilder.setSourceEndpointOwnerServiceLayer(Layer.GENERAL);
                 } else {
                     sourceBuilder.setSourceServiceName(reference.getParentService());
                     sourceBuilder.setSourceServiceInstanceName(reference.getParentServiceInstance());
@@ -126,10 +125,10 @@ public class MultiScopesAnalysisListener implements EntryAnalysisListener, ExitA
                 sourceBuilder.setDetectPoint(DetectPoint.SERVER);
                 sourceBuilder.setComponentId(span.getComponentId());
                 setPublicAttrs(sourceBuilder, span);
-                entrySourceBuilders.add(sourceBuilder);
+                callingInTraffic.add(sourceBuilder);
             }
         } else {
-            SourceBuilder sourceBuilder = new SourceBuilder(namingControl);
+            RPCTrafficSourceBuilder sourceBuilder = new RPCTrafficSourceBuilder(namingControl);
             sourceBuilder.setSourceServiceName(Const.USER_SERVICE_NAME);
             sourceBuilder.setSourceServiceInstanceName(Const.USER_INSTANCE_NAME);
             sourceBuilder.setSourceEndpointName(Const.USER_ENDPOINT_NAME);
@@ -142,7 +141,7 @@ public class MultiScopesAnalysisListener implements EntryAnalysisListener, ExitA
             sourceBuilder.setComponentId(span.getComponentId());
 
             setPublicAttrs(sourceBuilder, span);
-            entrySourceBuilders.add(sourceBuilder);
+            callingInTraffic.add(sourceBuilder);
         }
 
         parseLogicEndpoints(span, segmentObject);
@@ -158,7 +157,7 @@ public class MultiScopesAnalysisListener implements EntryAnalysisListener, ExitA
             return;
         }
 
-        SourceBuilder sourceBuilder = new SourceBuilder(namingControl);
+        RPCTrafficSourceBuilder sourceBuilder = new RPCTrafficSourceBuilder(namingControl);
 
         final String networkAddress = span.getPeer();
         if (StringUtil.isEmpty(networkAddress)) {
@@ -185,7 +184,7 @@ public class MultiScopesAnalysisListener implements EntryAnalysisListener, ExitA
                     networkAddressAlias.getRepresentServiceInstanceId());
             sourceBuilder.setDestServiceName(serviceIDDefinition.getName());
             /*
-             * Some of the agent can not have the upstream real network address, such as https://github.com/apache/skywalking-nginx-lua.
+             * Some agents can not have the upstream real network address, such as https://github.com/apache/skywalking-nginx-lua.
              * Keeping dest instance name as NULL makes no instance relation generate from this exit span.
              */
             if (!config.shouldIgnorePeerIPDue2Virtual(span.getComponentId())) {
@@ -197,7 +196,7 @@ public class MultiScopesAnalysisListener implements EntryAnalysisListener, ExitA
         sourceBuilder.setDetectPoint(DetectPoint.CLIENT);
         sourceBuilder.setComponentId(span.getComponentId());
         setPublicAttrs(sourceBuilder, span);
-        exitSourceBuilders.add(sourceBuilder);
+        callingOutTraffic.add(sourceBuilder);
 
         if (RequestType.DATABASE.equals(sourceBuilder.getType())) {
             boolean isSlowDBAccess = false;
@@ -239,17 +238,15 @@ public class MultiScopesAnalysisListener implements EntryAnalysisListener, ExitA
         }
     }
 
-    private void setPublicAttrs(SourceBuilder sourceBuilder, SpanObject span) {
+    private void setPublicAttrs(RPCTrafficSourceBuilder sourceBuilder, SpanObject span) {
         long latency = span.getEndTime() - span.getStartTime();
         sourceBuilder.setTimeBucket(TimeBucket.getMinuteTimeBucket(span.getStartTime()));
         sourceBuilder.setLatency((int) latency);
-        sourceBuilder.setResponseCode(Const.NONE);
         sourceBuilder.setHttpResponseStatusCode(Const.NONE);
         span.getTagsList().forEach(tag -> {
             final String tagKey = tag.getKey();
             if (SpanTags.STATUS_CODE.equals(tagKey) || SpanTags.HTTP_RESPONSE_STATUS_CODE.equals(tagKey)) {
                 try {
-                    sourceBuilder.setResponseCode(Integer.parseInt(tag.getValue()));
                     sourceBuilder.setHttpResponseStatusCode(Integer.parseInt(tag.getValue()));
                 } catch (NumberFormatException e) {
                     log.warn("span {} has illegal status code {}", span, tag.getValue());
@@ -285,14 +282,14 @@ public class MultiScopesAnalysisListener implements EntryAnalysisListener, ExitA
 
     @Override
     public void build() {
-        entrySourceBuilders.forEach(entrySourceBuilder -> {
-            entrySourceBuilder.prepare();
-            sourceReceiver.receive(entrySourceBuilder.toService());
-            sourceReceiver.receive(entrySourceBuilder.toServiceInstance());
-            sourceReceiver.receive(entrySourceBuilder.toEndpoint());
-            sourceReceiver.receive(entrySourceBuilder.toServiceRelation());
-            sourceReceiver.receive(entrySourceBuilder.toServiceInstanceRelation());
-            EndpointRelation endpointRelation = entrySourceBuilder.toEndpointRelation();
+        callingInTraffic.forEach(callingIn -> {
+            callingIn.prepare();
+            sourceReceiver.receive(callingIn.toService());
+            sourceReceiver.receive(callingIn.toServiceInstance());
+            sourceReceiver.receive(callingIn.toEndpoint());
+            sourceReceiver.receive(callingIn.toServiceRelation());
+            sourceReceiver.receive(callingIn.toServiceInstanceRelation());
+            EndpointRelation endpointRelation = callingIn.toEndpointRelation();
             /*
              * Parent endpoint could be none, because in SkyWalking Cross Process Propagation Headers Protocol v2,
              * endpoint in ref could be empty, based on that, endpoint relation maybe can't be established.
@@ -306,20 +303,20 @@ public class MultiScopesAnalysisListener implements EntryAnalysisListener, ExitA
             }
         });
 
-        exitSourceBuilders.forEach(exitSourceBuilder -> {
-            exitSourceBuilder.prepare();
-            sourceReceiver.receive(exitSourceBuilder.toServiceRelation());
+        callingOutTraffic.forEach(callingOut -> {
+            callingOut.prepare();
+            sourceReceiver.receive(callingOut.toServiceRelation());
 
             /*
              * Some of the agent can not have the upstream real network address, such as https://github.com/apache/skywalking-nginx-lua.
              */
-            final ServiceInstanceRelation serviceInstanceRelation = exitSourceBuilder.toServiceInstanceRelation();
+            final ServiceInstanceRelation serviceInstanceRelation = callingOut.toServiceInstanceRelation();
             if (serviceInstanceRelation != null) {
                 sourceReceiver.receive(serviceInstanceRelation);
             }
-            if (RequestType.DATABASE.equals(exitSourceBuilder.getType())) {
-                sourceReceiver.receive(exitSourceBuilder.toServiceMeta());
-                sourceReceiver.receive(exitSourceBuilder.toDatabaseAccess());
+            if (RequestType.DATABASE.equals(callingOut.getType())) {
+                sourceReceiver.receive(callingOut.toServiceMeta());
+                sourceReceiver.receive(callingOut.toDatabaseAccess());
             }
         });
 
@@ -335,7 +332,7 @@ public class MultiScopesAnalysisListener implements EntryAnalysisListener, ExitA
     }
 
     /**
-     * Logic endpoint could be represent through an entry span or local span. It has special meaning from API
+     * Logic endpoint could represent through an entry span or local span. It has special meaning from API
      * perspective. But it is an actual RPC call.
      */
     private void parseLogicEndpoints(final SpanObject span, final SegmentObject segmentObject) {
@@ -358,7 +355,7 @@ public class MultiScopesAnalysisListener implements EntryAnalysisListener, ExitA
                     } else {
                         break;
                     }
-                    SourceBuilder sourceBuilder = new SourceBuilder(namingControl);
+                    EndpointSourceBuilder sourceBuilder = new EndpointSourceBuilder(namingControl);
                     sourceBuilder.setTimeBucket(TimeBucket.getMinuteTimeBucket(span.getStartTime()));
                     sourceBuilder.setDestServiceName(segmentObject.getService());
                     sourceBuilder.setDestServiceInstanceName(segmentObject.getServiceInstance());
@@ -368,7 +365,6 @@ public class MultiScopesAnalysisListener implements EntryAnalysisListener, ExitA
                     sourceBuilder.setLatency(latency);
                     sourceBuilder.setStatus(status);
                     sourceBuilder.setType(RequestType.LOGIC);
-                    sourceBuilder.setResponseCode(Const.NONE);
                     logicEndpointBuilders.add(sourceBuilder);
                 default:
                     break;
@@ -379,7 +375,7 @@ public class MultiScopesAnalysisListener implements EntryAnalysisListener, ExitA
     /**
      * Identify the layer of remote service. Such as  ${@link Layer#DATABASE} and ${@link Layer#CACHE}.
      */
-    private Layer identifyRemoteServiceLayer(SpanLayer spanLayer, String peer) {
+    protected Layer identifyRemoteServiceLayer(SpanLayer spanLayer, String peer) {
         switch (spanLayer) {
             case Unknown:
                 return Layer.UNDEFINED;
@@ -405,18 +401,6 @@ public class MultiScopesAnalysisListener implements EntryAnalysisListener, ExitA
         }
     }
 
-    /**
-     * Identify the layer of span's service/instance owner. Such as  ${@link Layer#FAAS} and ${@link Layer#GENERAL}.
-     */
-    private Layer identifyServiceLayer(SpanLayer spanLayer) {
-        if (SpanLayer.FAAS.equals(spanLayer)) {
-            // function as a Service
-            return Layer.FAAS;
-        } else {
-            return Layer.GENERAL;
-        }
-    }
-
     public static class Factory implements AnalysisListenerFactory {
         private final SourceReceiver sourceReceiver;
         private final NetworkAddressAliasCache networkAddressAliasCache;
@@ -434,7 +418,7 @@ public class MultiScopesAnalysisListener implements EntryAnalysisListener, ExitA
 
         @Override
         public AnalysisListener create(ModuleManager moduleManager, AnalyzerModuleConfig config) {
-            return new MultiScopesAnalysisListener(
+            return new RPCAnalysisListener(
                 sourceReceiver, config, networkAddressAliasCache, namingControl);
         }
     }
diff --git a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/SourceBuilder.java b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/RPCTrafficSourceBuilder.java
similarity index 75%
rename from oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/SourceBuilder.java
rename to oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/RPCTrafficSourceBuilder.java
index 67386d4..929dc9c 100644
--- a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/SourceBuilder.java
+++ b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/RPCTrafficSourceBuilder.java
@@ -18,20 +18,11 @@
 
 package org.apache.skywalking.oap.server.analyzer.provider.trace.parser.listener;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
 import lombok.Getter;
-import lombok.RequiredArgsConstructor;
 import lombok.Setter;
-import org.apache.skywalking.apm.network.common.v3.KeyStringValuePair;
 import org.apache.skywalking.oap.server.core.analysis.Layer;
-import org.apache.skywalking.oap.server.library.util.StringUtil;
 import org.apache.skywalking.oap.server.core.config.NamingControl;
 import org.apache.skywalking.oap.server.core.source.DatabaseAccess;
-import org.apache.skywalking.oap.server.core.source.DetectPoint;
-import org.apache.skywalking.oap.server.core.source.Endpoint;
 import org.apache.skywalking.oap.server.core.source.EndpointRelation;
 import org.apache.skywalking.oap.server.core.source.RequestType;
 import org.apache.skywalking.oap.server.core.source.Service;
@@ -39,11 +30,14 @@ import org.apache.skywalking.oap.server.core.source.ServiceInstance;
 import org.apache.skywalking.oap.server.core.source.ServiceInstanceRelation;
 import org.apache.skywalking.oap.server.core.source.ServiceMeta;
 import org.apache.skywalking.oap.server.core.source.ServiceRelation;
+import org.apache.skywalking.oap.server.library.util.StringUtil;
 
-@RequiredArgsConstructor
-class SourceBuilder {
-    private final NamingControl namingControl;
-
+/**
+ * @since 9.0.0 Rename "SourceBuilder` to this. Add {@link EndpointSourceBuilder} for making source builder more specific.
+ *
+ * RPC traffic could be detected by server side or client side according to agent tech stack.
+ */
+class RPCTrafficSourceBuilder extends EndpointSourceBuilder {
     @Getter
     @Setter
     private String sourceServiceName;
@@ -54,68 +48,39 @@ class SourceBuilder {
     @Setter
     private String sourceServiceInstanceName;
     /**
+     * Same as {@link #sourceEndpointOwnerServiceName}
      * Source endpoint could be not owned by {@link #sourceServiceName}, such as in the MQ or un-instrumented proxy
-     * cases. This service always comes from the span.ref, so it is always a normal service.
+     * cases. This service always comes from the span.ref, so it is always a general service.
+     *
+     * @since 9.0.0
      */
     @Getter
     @Setter
-    private String sourceEndpointOwnerServiceName;
-    @Getter
-    @Setter
-    private String sourceEndpointName;
-    @Getter
-    @Setter
-    private String destServiceName;
-    @Getter
-    @Setter
-    private Layer destLayer;
+    private Layer sourceEndpointOwnerServiceLayer;
+    /**
+     * Source endpoint could be not owned by {@link #sourceServiceName}, such as in the MQ or un-instrumented proxy
+     * cases. This service always comes from the span.ref, so it is always a general service.
+     */
     @Getter
     @Setter
-    private String destServiceInstanceName;
+    private String sourceEndpointOwnerServiceName;
     @Getter
     @Setter
-    private String destEndpointName;
+    private String sourceEndpointName;
     @Getter
     @Setter
     private int componentId;
-    @Getter
-    @Setter
-    private int latency;
-    @Getter
-    @Setter
-    private boolean status;
-    @Getter
-    @Setter
-    @Deprecated
-    private int responseCode;
-    @Getter
-    @Setter
-    private int httpResponseStatusCode;
-    @Getter
-    @Setter
-    private String rpcStatusCode;
-    @Getter
-    @Setter
-    private RequestType type;
-    @Getter
-    @Setter
-    private DetectPoint detectPoint;
-    @Getter
-    @Setter
-    private long timeBucket;
-    @Getter
-    private final List<String> tags = new ArrayList<>();
-    @Getter
-    private final Map<String, String> originalTags = new HashMap<>();
+
+    RPCTrafficSourceBuilder(final NamingControl namingControl) {
+        super(namingControl);
+    }
 
     void prepare() {
         this.sourceServiceName = namingControl.formatServiceName(sourceServiceName);
         this.sourceEndpointOwnerServiceName = namingControl.formatServiceName(sourceEndpointOwnerServiceName);
         this.sourceServiceInstanceName = namingControl.formatInstanceName(sourceServiceInstanceName);
         this.sourceEndpointName = namingControl.formatEndpointName(sourceServiceName, sourceEndpointName);
-        this.destServiceName = namingControl.formatServiceName(destServiceName);
-        this.destServiceInstanceName = namingControl.formatInstanceName(destServiceInstanceName);
-        this.destEndpointName = namingControl.formatEndpointName(destServiceName, destEndpointName);
+        super.prepare();
     }
 
     /**
@@ -129,7 +94,6 @@ class SourceBuilder {
         service.setLayer(destLayer);
         service.setLatency(latency);
         service.setStatus(status);
-        service.setResponseCode(responseCode);
         service.setHttpResponseStatusCode(httpResponseStatusCode);
         service.setRpcStatusCode(rpcStatusCode);
         service.setType(type);
@@ -154,7 +118,6 @@ class SourceBuilder {
         serviceRelation.setComponentId(componentId);
         serviceRelation.setLatency(latency);
         serviceRelation.setStatus(status);
-        serviceRelation.setResponseCode(responseCode);
         serviceRelation.setHttpResponseStatusCode(httpResponseStatusCode);
         serviceRelation.setRpcStatusCode(rpcStatusCode);
         serviceRelation.setType(type);
@@ -175,7 +138,6 @@ class SourceBuilder {
         serviceInstance.setEndpointName(destEndpointName);
         serviceInstance.setLatency(latency);
         serviceInstance.setStatus(status);
-        serviceInstance.setResponseCode(responseCode);
         serviceInstance.setHttpResponseStatusCode(httpResponseStatusCode);
         serviceInstance.setRpcStatusCode(rpcStatusCode);
         serviceInstance.setType(type);
@@ -203,7 +165,6 @@ class SourceBuilder {
         serviceInstanceRelation.setComponentId(componentId);
         serviceInstanceRelation.setLatency(latency);
         serviceInstanceRelation.setStatus(status);
-        serviceInstanceRelation.setResponseCode(responseCode);
         serviceInstanceRelation.setHttpResponseStatusCode(httpResponseStatusCode);
         serviceInstanceRelation.setRpcStatusCode(rpcStatusCode);
         serviceInstanceRelation.setType(type);
@@ -213,28 +174,7 @@ class SourceBuilder {
     }
 
     /**
-     * Endpoint meta and metrics of {@link #destEndpointName} related source. The metrics base on the OAL scripts.
-     */
-    Endpoint toEndpoint() {
-        Endpoint endpoint = new Endpoint();
-        endpoint.setName(destEndpointName);
-        endpoint.setServiceName(destServiceName);
-        endpoint.setServiceLayer(destLayer);
-        endpoint.setServiceInstanceName(destServiceInstanceName);
-        endpoint.setLatency(latency);
-        endpoint.setStatus(status);
-        endpoint.setResponseCode(responseCode);
-        endpoint.setHttpResponseStatusCode(httpResponseStatusCode);
-        endpoint.setRpcStatusCode(rpcStatusCode);
-        endpoint.setType(type);
-        endpoint.setTags(tags);
-        endpoint.setOriginalTags(originalTags);
-        endpoint.setTimeBucket(timeBucket);
-        return endpoint;
-    }
-
-    /**
-     * Endpoint depedency meta and metrics related source. The metrics base on the OAL scripts.
+     * Endpoint dependency meta and metrics related source. The metrics base on the OAL scripts.
      */
     EndpointRelation toEndpointRelation() {
         if (StringUtil.isEmpty(sourceEndpointName) || StringUtil.isEmpty(destEndpointName)) {
@@ -247,7 +187,7 @@ class SourceBuilder {
             endpointRelation.setServiceLayer(sourceLayer);
         } else {
             endpointRelation.setServiceName(sourceEndpointOwnerServiceName);
-            endpointRelation.setServiceLayer(Layer.GENERAL);
+            endpointRelation.setServiceLayer(sourceEndpointOwnerServiceLayer);
         }
         endpointRelation.setServiceInstanceName(sourceServiceInstanceName);
         endpointRelation.setChildEndpoint(destEndpointName);
@@ -257,7 +197,6 @@ class SourceBuilder {
         endpointRelation.setComponentId(componentId);
         endpointRelation.setRpcLatency(latency);
         endpointRelation.setStatus(status);
-        endpointRelation.setResponseCode(responseCode);
         endpointRelation.setHttpResponseStatusCode(httpResponseStatusCode);
         endpointRelation.setRpcStatusCode(rpcStatusCode);
         endpointRelation.setType(type);
@@ -294,9 +233,4 @@ class SourceBuilder {
         databaseAccess.setTimeBucket(timeBucket);
         return databaseAccess;
     }
-
-    public void setTag(KeyStringValuePair tag) {
-        tags.add(tag.getKey().trim() + ":" + tag.getValue().trim());
-        originalTags.put(tag.getKey(), tag.getValue());
-    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Endpoint.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Endpoint.java
index e2ca33b..ac42420 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Endpoint.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Endpoint.java
@@ -71,10 +71,6 @@ public class Endpoint extends Source {
     private boolean status;
     @Getter
     @Setter
-    @Deprecated
-    private int responseCode;
-    @Getter
-    @Setter
     private int httpResponseStatusCode;
     @Getter
     @Setter
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/EndpointRelation.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/EndpointRelation.java
index 3b10368..8436336 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/EndpointRelation.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/EndpointRelation.java
@@ -79,10 +79,6 @@ public class EndpointRelation extends Source {
     private boolean status;
     @Getter
     @Setter
-    @Deprecated
-    private int responseCode;
-    @Getter
-    @Setter
     private int httpResponseStatusCode;
     @Getter
     @Setter
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Service.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Service.java
index bb37874..e3322c1 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Service.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Service.java
@@ -67,10 +67,6 @@ public class Service extends Source {
     private boolean status;
     @Getter
     @Setter
-    @Deprecated
-    private int responseCode;
-    @Getter
-    @Setter
     private int httpResponseStatusCode;
     @Getter
     @Setter
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstance.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstance.java
index 5099fbf..0f85098 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstance.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstance.java
@@ -71,10 +71,6 @@ public class ServiceInstance extends Source {
     private boolean status;
     @Getter
     @Setter
-    @Deprecated
-    private int responseCode;
-    @Getter
-    @Setter
     private int httpResponseStatusCode;
     @Getter
     @Setter
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceRelation.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceRelation.java
index 9f12000..db3d98b 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceRelation.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceRelation.java
@@ -88,10 +88,6 @@ public class ServiceRelation extends Source {
     private boolean status;
     @Getter
     @Setter
-    @Deprecated
-    private int responseCode;
-    @Getter
-    @Setter
     private int httpResponseStatusCode;
     @Getter
     @Setter
diff --git a/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/TelemetryDataDispatcher.java b/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/TelemetryDataDispatcher.java
index d4fa9b0..50147e0 100644
--- a/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/TelemetryDataDispatcher.java
+++ b/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/TelemetryDataDispatcher.java
@@ -130,7 +130,6 @@ public class TelemetryDataDispatcher {
         service.setEndpointName(metrics.getEndpoint());
         service.setLatency(metrics.getLatency());
         service.setStatus(metrics.getStatus());
-        service.setResponseCode(metrics.getResponseCode());
         service.setHttpResponseStatusCode(metrics.getResponseCode());
         service.setType(protocol2Type(metrics.getProtocol()));
         service.getSideCar().setInternalErrorCode(metrics.getInternalErrorCode());
@@ -153,7 +152,6 @@ public class TelemetryDataDispatcher {
         serviceRelation.setLatency(metrics.getLatency());
         serviceRelation.setStatus(metrics.getStatus());
         serviceRelation.setType(protocol2Type(metrics.getProtocol()));
-        serviceRelation.setResponseCode(metrics.getResponseCode());
         serviceRelation.setHttpResponseStatusCode(metrics.getResponseCode());
         serviceRelation.setDetectPoint(detectPointMapping(metrics.getDetectPoint()));
         serviceRelation.setComponentId(protocol2Component(metrics.getProtocol()));
@@ -174,7 +172,6 @@ public class TelemetryDataDispatcher {
         serviceInstance.setEndpointName(metrics.getEndpoint());
         serviceInstance.setLatency(metrics.getLatency());
         serviceInstance.setStatus(metrics.getStatus());
-        serviceInstance.setResponseCode(metrics.getResponseCode());
         serviceInstance.setHttpResponseStatusCode(metrics.getResponseCode());
         serviceInstance.setType(protocol2Type(metrics.getProtocol()));
         serviceInstance.getSideCar().setInternalErrorCode(metrics.getInternalErrorCode());
@@ -221,7 +218,6 @@ public class TelemetryDataDispatcher {
         endpoint.setServiceInstanceName(metrics.getDestServiceInstance());
         endpoint.setLatency(metrics.getLatency());
         endpoint.setStatus(metrics.getStatus());
-        endpoint.setResponseCode(metrics.getResponseCode());
         endpoint.setHttpResponseStatusCode(metrics.getResponseCode());
         endpoint.setType(protocol2Type(metrics.getProtocol()));
         endpoint.getSideCar().setInternalErrorCode(metrics.getInternalErrorCode());
diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/MultiScopesAnalysisListenerTest.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/RPCAnalysisListenerTest.java
similarity index 96%
rename from oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/MultiScopesAnalysisListenerTest.java
rename to oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/RPCAnalysisListenerTest.java
index 7d6e6eb..6884430 100644
--- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/MultiScopesAnalysisListenerTest.java
+++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/RPCAnalysisListenerTest.java
@@ -31,7 +31,7 @@ import org.apache.skywalking.oap.server.analyzer.provider.AnalyzerModuleConfig;
 import org.apache.skywalking.oap.server.analyzer.provider.trace.UninstrumentedGatewaysConfig;
 import org.apache.skywalking.oap.server.analyzer.provider.trace.parser.SpanTags;
 import org.apache.skywalking.oap.server.analyzer.provider.trace.parser.listener.AnalysisListener;
-import org.apache.skywalking.oap.server.analyzer.provider.trace.parser.listener.MultiScopesAnalysisListener;
+import org.apache.skywalking.oap.server.analyzer.provider.trace.parser.listener.RPCAnalysisListener;
 import org.apache.skywalking.oap.server.core.Const;
 import org.apache.skywalking.oap.server.core.analysis.IDManager;
 import org.apache.skywalking.oap.server.core.analysis.Layer;
@@ -60,12 +60,12 @@ import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.when;
 
 /**
- * MultiScopesSpanListener includes the most segment to source(s) logic. This test covers most cases about the segment
+ * RPCAnalysisListenerTest includes the most segment to source(s) logic. This test covers most cases about the segment
  * to sources translation.
  *
  * This test is a good way to study about how OAP analysis trace segment.
  */
-public class MultiScopesAnalysisListenerTest {
+public class RPCAnalysisListenerTest {
     @Mock
     private static AnalyzerModuleConfig CONFIG;
     @Mock
@@ -98,7 +98,7 @@ public class MultiScopesAnalysisListenerTest {
 
     @Test
     public void testContainsPoint() {
-        MultiScopesAnalysisListener listener = new MultiScopesAnalysisListener(
+        RPCAnalysisListener listener = new RPCAnalysisListener(
             new MockReceiver(),
             CONFIG,
             CACHE,
@@ -117,7 +117,7 @@ public class MultiScopesAnalysisListenerTest {
     @Test
     public void testEntrySpanWithoutRef() {
         final MockReceiver mockReceiver = new MockReceiver();
-        MultiScopesAnalysisListener listener = new MultiScopesAnalysisListener(
+        RPCAnalysisListener listener = new RPCAnalysisListener(
             mockReceiver,
             CONFIG,
             CACHE,
@@ -160,7 +160,6 @@ public class MultiScopesAnalysisListenerTest {
         final ServiceInstanceRelation serviceInstanceRelation = (ServiceInstanceRelation) receivedSources.get(4);
         final EndpointRelation endpointRelation = (EndpointRelation) receivedSources.get(5);
         Assert.assertEquals("mock-service", service.getName());
-        Assert.assertEquals(500, service.getResponseCode());
         Assert.assertEquals(500, service.getHttpResponseStatusCode());
         Assert.assertEquals("OK", service.getRpcStatusCode());
         Assert.assertFalse(service.isStatus());
@@ -180,7 +179,7 @@ public class MultiScopesAnalysisListenerTest {
     @Test
     public void testEntrySpanRef() {
         final MockReceiver mockReceiver = new MockReceiver();
-        MultiScopesAnalysisListener listener = new MultiScopesAnalysisListener(
+        RPCAnalysisListener listener = new RPCAnalysisListener(
             mockReceiver,
             CONFIG,
             CACHE,
@@ -246,7 +245,7 @@ public class MultiScopesAnalysisListenerTest {
     @Test
     public void testEntrySpanMQRef() {
         final MockReceiver mockReceiver = new MockReceiver();
-        MultiScopesAnalysisListener listener = new MultiScopesAnalysisListener(
+        RPCAnalysisListener listener = new RPCAnalysisListener(
             mockReceiver,
             CONFIG,
             CACHE,
@@ -305,7 +304,7 @@ public class MultiScopesAnalysisListenerTest {
     @Test
     public void testParseLocalLogicSpan() {
         final MockReceiver mockReceiver = new MockReceiver();
-        MultiScopesAnalysisListener listener = new MultiScopesAnalysisListener(
+        RPCAnalysisListener listener = new RPCAnalysisListener(
             mockReceiver,
             CONFIG,
             CACHE,
@@ -348,7 +347,7 @@ public class MultiScopesAnalysisListenerTest {
     @Test
     public void testParseSpanWithLogicEndpointTag() {
         final MockReceiver mockReceiver = new MockReceiver();
-        MultiScopesAnalysisListener listener = new MultiScopesAnalysisListener(
+        RPCAnalysisListener listener = new RPCAnalysisListener(
             mockReceiver,
             CONFIG,
             CACHE,
@@ -393,7 +392,7 @@ public class MultiScopesAnalysisListenerTest {
     @Test
     public void testExitSpanWithoutAlias() {
         final MockReceiver mockReceiver = new MockReceiver();
-        MultiScopesAnalysisListener listener = new MultiScopesAnalysisListener(
+        RPCAnalysisListener listener = new RPCAnalysisListener(
             mockReceiver,
             CONFIG,
             CACHE,
@@ -439,7 +438,7 @@ public class MultiScopesAnalysisListenerTest {
     @Test
     public void testExitSpanWithAlias() {
         final MockReceiver mockReceiver = new MockReceiver();
-        MultiScopesAnalysisListener listener = new MultiScopesAnalysisListener(
+        RPCAnalysisListener listener = new RPCAnalysisListener(
             mockReceiver,
             CONFIG,
             CACHE2,
diff --git a/test/e2e-v2/script/env b/test/e2e-v2/script/env
index bf4d20d..294966a 100644
--- a/test/e2e-v2/script/env
+++ b/test/e2e-v2/script/env
@@ -13,7 +13,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-SW_AGENT_JAVA_COMMIT=5bd41ec0afd35f7345a9a51daf5d2e34b3e2e4b1
+SW_AGENT_JAVA_COMMIT=233cce5bb6341a62811807696bc172b2d340d566
 SW_AGENT_SATELLITE_COMMIT=1987e1d566ac90f6b58a45fd9bfa27bf8faad635
 SW_AGENT_NGINX_LUA_COMMIT=c3cee4841798a147d83b96a10914d4ac0e11d0aa
 SW_AGENT_NODEJS_COMMIT=2e7560518aff846befd4d6bc815fe5e38c704a11