You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@skywalking.apache.org by wu...@apache.org on 2018/09/04 07:42:44 UTC

[incubator-skywalking] 01/01: Fix all sources and sourceDispatchers.

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

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

commit 4f2db733fe1400503be58a4c054a2afdda990a26
Author: Wu Sheng <wu...@foxmail.com>
AuthorDate: Tue Sep 4 15:42:31 2018 +0800

    Fix all sources and sourceDispatchers.
---
 .../server/core/analysis/DispatcherManager.java    | 12 ++++
 .../generated/endpoint/EndpointAvgIndicator.java   |  1 +
 .../endpoint/EndpointPercentIndicator.java         |  1 +
 .../EndpointRelationAvgIndicator.java}             | 66 ++++++++++++++--------
 .../EndpointRelationDispatcher.java                | 50 ++++++++++++++++
 .../generated/service/ServiceAvgIndicator.java     |  1 +
 .../serviceinstance/ServiceInstanceDispatcher.java | 46 +++++++++++++++
 .../ServiceInstanceRespTimeIndicator.java}         | 28 ++++-----
 .../InstanceJvmCpuIndicator.java                   |  1 +
 .../InstanceJvmYoungGcTimeIndicator.java           |  1 +
 .../InstanceJvmMemoryMaxIndicator.java             |  1 +
 .../InstanceJvmMemoryPoolMaxIndicator.java         |  1 +
 .../ServiceInstanceRelationAvgIndicator.java}      | 58 ++++++++++++-------
 .../ServiceInstanceRelationDispatcher.java         | 48 ++++++++++++++++
 .../ServiceRelationAvgIndicator.java}              | 49 ++++++++--------
 .../servicerelation/ServiceRelationDispatcher.java | 46 +++++++++++++++
 .../oap/server/core/source/EndpointRelation.java   | 10 ++++
 .../oap/server/core/source/ServiceInstance.java    |  1 +
 .../core/source/ServiceInstanceRelation.java       |  2 +
 .../listener/endpoint/MultiScopesSpanListener.java | 11 +++-
 .../parser/listener/endpoint/SourceBuilder.java    | 11 ++++
 21 files changed, 364 insertions(+), 81 deletions(-)

diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/DispatcherManager.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/DispatcherManager.java
index b8953c6..0d0b4c0 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/DispatcherManager.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/DispatcherManager.java
@@ -20,10 +20,15 @@ package org.apache.skywalking.oap.server.core.analysis;
 
 import java.util.*;
 import org.apache.skywalking.oap.server.core.analysis.generated.endpoint.EndpointDispatcher;
+import org.apache.skywalking.oap.server.core.analysis.generated.endpointrelation.EndpointRelationDispatcher;
+import org.apache.skywalking.oap.server.core.analysis.generated.service.ServiceDispatcher;
+import org.apache.skywalking.oap.server.core.analysis.generated.serviceinstance.ServiceInstanceDispatcher;
 import org.apache.skywalking.oap.server.core.analysis.generated.serviceinstancejvmcpu.ServiceInstanceJVMCPUDispatcher;
 import org.apache.skywalking.oap.server.core.analysis.generated.serviceinstancejvmgc.ServiceInstanceJVMGCDispatcher;
 import org.apache.skywalking.oap.server.core.analysis.generated.serviceinstancejvmmemory.ServiceInstanceJVMMemoryDispatcher;
 import org.apache.skywalking.oap.server.core.analysis.generated.serviceinstancejvmmemorypool.ServiceInstanceJVMMemoryPoolDispatcher;
+import org.apache.skywalking.oap.server.core.analysis.generated.serviceinstancerelation.ServiceInstanceRelationDispatcher;
+import org.apache.skywalking.oap.server.core.analysis.generated.servicerelation.ServiceRelationDispatcher;
 import org.apache.skywalking.oap.server.core.source.Scope;
 import org.slf4j.*;
 
@@ -38,8 +43,15 @@ public class DispatcherManager {
 
     public DispatcherManager() {
         this.dispatcherMap = new HashMap<>();
+
+        this.dispatcherMap.put(Scope.Service, new ServiceDispatcher());
+        this.dispatcherMap.put(Scope.ServiceInstance, new ServiceInstanceDispatcher());
         this.dispatcherMap.put(Scope.Endpoint, new EndpointDispatcher());
 
+        this.dispatcherMap.put(Scope.ServiceRelation, new ServiceRelationDispatcher());
+        this.dispatcherMap.put(Scope.ServiceInstanceRelation, new ServiceInstanceRelationDispatcher());
+        this.dispatcherMap.put(Scope.EndpointRelation, new EndpointRelationDispatcher());
+
         this.dispatcherMap.put(Scope.ServiceInstanceJVMCPU, new ServiceInstanceJVMCPUDispatcher());
         this.dispatcherMap.put(Scope.ServiceInstanceJVMGC, new ServiceInstanceJVMGCDispatcher());
         this.dispatcherMap.put(Scope.ServiceInstanceJVMMemory, new ServiceInstanceJVMMemoryDispatcher());
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/endpoint/EndpointAvgIndicator.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/endpoint/EndpointAvgIndicator.java
index 2826b05..9ec7a6d 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/endpoint/EndpointAvgIndicator.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/endpoint/EndpointAvgIndicator.java
@@ -69,6 +69,7 @@ public class EndpointAvgIndicator extends LongAvgIndicator implements AlarmSuppo
         EndpointAvgIndicator indicator = (EndpointAvgIndicator)obj;
         if (id != indicator.id)
             return false;
+
         if (getTimeBucket() != indicator.getTimeBucket())
             return false;
 
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/endpoint/EndpointPercentIndicator.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/endpoint/EndpointPercentIndicator.java
index 43bbf9f..afd5dbf 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/endpoint/EndpointPercentIndicator.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/endpoint/EndpointPercentIndicator.java
@@ -69,6 +69,7 @@ public class EndpointPercentIndicator extends PercentIndicator implements AlarmS
         EndpointPercentIndicator indicator = (EndpointPercentIndicator)obj;
         if (id != indicator.id)
             return false;
+
         if (getTimeBucket() != indicator.getTimeBucket())
             return false;
 
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/endpoint/EndpointAvgIndicator.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/endpointrelation/EndpointRelationAvgIndicator.java
similarity index 58%
copy from oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/endpoint/EndpointAvgIndicator.java
copy to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/endpointrelation/EndpointRelationAvgIndicator.java
index 2826b05..5b1f424 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/endpoint/EndpointAvgIndicator.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/endpointrelation/EndpointRelationAvgIndicator.java
@@ -16,7 +16,7 @@
  *
  */
 
-package org.apache.skywalking.oap.server.core.analysis.generated.endpoint;
+package org.apache.skywalking.oap.server.core.analysis.generated.endpointrelation;
 
 import java.util.*;
 import lombok.*;
@@ -38,22 +38,27 @@ import org.apache.skywalking.oap.server.core.source.Scope;
  */
 @IndicatorType
 @StreamData
-@StorageEntity(name = "endpoint_avg", builder = EndpointAvgIndicator.Builder.class)
-public class EndpointAvgIndicator extends LongAvgIndicator implements AlarmSupported {
+@StorageEntity(name = "endpointrelation_avg", builder = EndpointRelationAvgIndicator.Builder.class)
+public class EndpointRelationAvgIndicator extends LongAvgIndicator implements AlarmSupported {
 
-    @Setter @Getter @Column(columnName = "id") private int id;
+    @Setter @Getter @Column(columnName = "endpoint_id") private int endpointId;
+    @Setter @Getter @Column(columnName = "child_endpoint_id") private int childEndpointId;
     @Setter @Getter @Column(columnName = "service_id") private int serviceId;
+    @Setter @Getter @Column(columnName = "child_service_id") private int childServiceId;
     @Setter @Getter @Column(columnName = "service_instance_id") private int serviceInstanceId;
+    @Setter @Getter @Column(columnName = "child_service_instance_id") private int childServiceInstanceId;
 
     @Override public String id() {
         String splitJointId = String.valueOf(getTimeBucket());
-        splitJointId += Const.ID_SPLIT + String.valueOf(id);
+        splitJointId += Const.ID_SPLIT + String.valueOf(endpointId);
+        splitJointId += Const.ID_SPLIT + String.valueOf(childEndpointId);
         return splitJointId;
     }
 
     @Override public int hashCode() {
         int result = 17;
-        result = 31 * result + id;
+        result = 31 * result + endpointId;
+        result = 31 * result + childEndpointId;
         result = 31 * result + (int)getTimeBucket();
         return result;
     }
@@ -66,9 +71,12 @@ public class EndpointAvgIndicator extends LongAvgIndicator implements AlarmSuppo
         if (getClass() != obj.getClass())
             return false;
 
-        EndpointAvgIndicator indicator = (EndpointAvgIndicator)obj;
-        if (id != indicator.id)
+        EndpointRelationAvgIndicator indicator = (EndpointRelationAvgIndicator)obj;
+        if (endpointId != indicator.endpointId)
             return false;
+        if (childEndpointId != indicator.childEndpointId)
+            return false;
+
         if (getTimeBucket() != indicator.getTimeBucket())
             return false;
 
@@ -83,10 +91,13 @@ public class EndpointAvgIndicator extends LongAvgIndicator implements AlarmSuppo
         remoteBuilder.setDataLongs(2, getTimeBucket());
 
 
-        remoteBuilder.setDataIntegers(0, getId());
-        remoteBuilder.setDataIntegers(1, getServiceId());
-        remoteBuilder.setDataIntegers(2, getServiceInstanceId());
-        remoteBuilder.setDataIntegers(3, getCount());
+        remoteBuilder.setDataIntegers(0, getEndpointId());
+        remoteBuilder.setDataIntegers(1, getChildEndpointId());
+        remoteBuilder.setDataIntegers(2, getServiceId());
+        remoteBuilder.setDataIntegers(3, getChildServiceId());
+        remoteBuilder.setDataIntegers(4, getServiceInstanceId());
+        remoteBuilder.setDataIntegers(5, getChildServiceInstanceId());
+        remoteBuilder.setDataIntegers(6, getCount());
 
         return remoteBuilder;
     }
@@ -98,23 +109,29 @@ public class EndpointAvgIndicator extends LongAvgIndicator implements AlarmSuppo
         setTimeBucket(remoteData.getDataLongs(2));
 
 
-        setId(remoteData.getDataIntegers(0));
-        setServiceId(remoteData.getDataIntegers(1));
-        setServiceInstanceId(remoteData.getDataIntegers(2));
-        setCount(remoteData.getDataIntegers(3));
+        setEndpointId(remoteData.getDataIntegers(0));
+        setChildEndpointId(remoteData.getDataIntegers(1));
+        setServiceId(remoteData.getDataIntegers(2));
+        setChildServiceId(remoteData.getDataIntegers(3));
+        setServiceInstanceId(remoteData.getDataIntegers(4));
+        setChildServiceInstanceId(remoteData.getDataIntegers(5));
+        setCount(remoteData.getDataIntegers(6));
     }
 
     @Override public AlarmMeta getAlarmMeta() {
-        return new AlarmMeta("endpoint_Avg", Scope.Endpoint, id, serviceId, serviceInstanceId);
+        return new AlarmMeta("EndpointRelation_Avg", Scope.EndpointRelation, endpointId, childEndpointId, serviceId, childServiceId, serviceInstanceId, childServiceInstanceId);
     }
 
-    public static class Builder implements StorageBuilder<EndpointAvgIndicator> {
+    public static class Builder implements StorageBuilder<EndpointRelationAvgIndicator> {
 
-        @Override public Map<String, Object> data2Map(EndpointAvgIndicator storageData) {
+        @Override public Map<String, Object> data2Map(EndpointRelationAvgIndicator storageData) {
             Map<String, Object> map = new HashMap<>();
-            map.put("id", storageData.getId());
+            map.put("endpoint_id", storageData.getEndpointId());
+            map.put("child_endpoint_id", storageData.getChildEndpointId());
             map.put("service_id", storageData.getServiceId());
+            map.put("child_service_id", storageData.getChildServiceId());
             map.put("service_instance_id", storageData.getServiceInstanceId());
+            map.put("child_service_instance_id", storageData.getChildServiceInstanceId());
             map.put("summation", storageData.getSummation());
             map.put("count", storageData.getCount());
             map.put("value", storageData.getValue());
@@ -122,11 +139,14 @@ public class EndpointAvgIndicator extends LongAvgIndicator implements AlarmSuppo
             return map;
         }
 
-        @Override public EndpointAvgIndicator map2Data(Map<String, Object> dbMap) {
-            EndpointAvgIndicator indicator = new EndpointAvgIndicator();
-            indicator.setId(((Number)dbMap.get("id")).intValue());
+        @Override public EndpointRelationAvgIndicator map2Data(Map<String, Object> dbMap) {
+            EndpointRelationAvgIndicator indicator = new EndpointRelationAvgIndicator();
+            indicator.setEndpointId(((Number)dbMap.get("endpoint_id")).intValue());
+            indicator.setChildEndpointId(((Number)dbMap.get("child_endpoint_id")).intValue());
             indicator.setServiceId(((Number)dbMap.get("service_id")).intValue());
+            indicator.setChildServiceId(((Number)dbMap.get("child_service_id")).intValue());
             indicator.setServiceInstanceId(((Number)dbMap.get("service_instance_id")).intValue());
+            indicator.setChildServiceInstanceId(((Number)dbMap.get("child_service_instance_id")).intValue());
             indicator.setSummation(((Number)dbMap.get("summation")).longValue());
             indicator.setCount(((Number)dbMap.get("count")).intValue());
             indicator.setValue(((Number)dbMap.get("value")).longValue());
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/endpointrelation/EndpointRelationDispatcher.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/endpointrelation/EndpointRelationDispatcher.java
new file mode 100644
index 0000000..4d3d1ca
--- /dev/null
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/endpointrelation/EndpointRelationDispatcher.java
@@ -0,0 +1,50 @@
+/*
+ * 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.analysis.generated.endpointrelation;
+
+import org.apache.skywalking.oap.server.core.analysis.SourceDispatcher;
+import org.apache.skywalking.oap.server.core.analysis.worker.IndicatorProcess;
+import org.apache.skywalking.oap.server.core.source.*;
+
+/**
+ * This class is auto generated. Please don't change this class manually.
+ *
+ * @author Observability Analysis Language code generator
+ */
+public class EndpointRelationDispatcher implements SourceDispatcher<EndpointRelation> {
+
+    @Override public void dispatch(EndpointRelation source) {
+        doEndpointRelationAvg(source);
+    }
+
+    private void doEndpointRelationAvg(EndpointRelation source) {
+        EndpointRelationAvgIndicator indicator = new EndpointRelationAvgIndicator();
+
+
+        indicator.setTimeBucket(source.getTimeBucket());
+        indicator.setEndpointId(source.getEndpointId());
+        indicator.setChildEndpointId(source.getChildEndpointId());
+        indicator.setServiceId(source.getServiceId());
+        indicator.setChildServiceId(source.getChildServiceId());
+        indicator.setServiceInstanceId(source.getServiceInstanceId());
+        indicator.setChildServiceInstanceId(source.getChildServiceInstanceId());
+        indicator.combine(source.getRpcLatency(), 1);
+        IndicatorProcess.INSTANCE.in(indicator);
+    }
+}
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/service/ServiceAvgIndicator.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/service/ServiceAvgIndicator.java
index aef5f60..e84c439 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/service/ServiceAvgIndicator.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/service/ServiceAvgIndicator.java
@@ -67,6 +67,7 @@ public class ServiceAvgIndicator extends LongAvgIndicator implements AlarmSuppor
         ServiceAvgIndicator indicator = (ServiceAvgIndicator)obj;
         if (id != indicator.id)
             return false;
+
         if (getTimeBucket() != indicator.getTimeBucket())
             return false;
 
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/serviceinstance/ServiceInstanceDispatcher.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/serviceinstance/ServiceInstanceDispatcher.java
new file mode 100644
index 0000000..471351e
--- /dev/null
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/serviceinstance/ServiceInstanceDispatcher.java
@@ -0,0 +1,46 @@
+/*
+ * 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.analysis.generated.serviceinstance;
+
+import org.apache.skywalking.oap.server.core.analysis.SourceDispatcher;
+import org.apache.skywalking.oap.server.core.analysis.worker.IndicatorProcess;
+import org.apache.skywalking.oap.server.core.source.*;
+
+/**
+ * This class is auto generated. Please don't change this class manually.
+ *
+ * @author Observability Analysis Language code generator
+ */
+public class ServiceInstanceDispatcher implements SourceDispatcher<ServiceInstance> {
+    
+    @Override public void dispatch(ServiceInstance source) {
+        doServiceInstanceRespTime(source);
+    }
+
+    private void doServiceInstanceRespTime(ServiceInstance source) {
+        ServiceInstanceRespTimeIndicator indicator = new ServiceInstanceRespTimeIndicator();
+
+
+        indicator.setTimeBucket(source.getTimeBucket());
+        indicator.setId(source.getId());
+        indicator.setServiceId(source.getServiceId());
+        indicator.combine(source.getLatency(), 1);
+        IndicatorProcess.INSTANCE.in(indicator);
+    }
+}
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/endpoint/EndpointAvgIndicator.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/serviceinstance/ServiceInstanceRespTimeIndicator.java
similarity index 78%
copy from oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/endpoint/EndpointAvgIndicator.java
copy to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/serviceinstance/ServiceInstanceRespTimeIndicator.java
index 2826b05..ac68e5b 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/endpoint/EndpointAvgIndicator.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/serviceinstance/ServiceInstanceRespTimeIndicator.java
@@ -16,7 +16,7 @@
  *
  */
 
-package org.apache.skywalking.oap.server.core.analysis.generated.endpoint;
+package org.apache.skywalking.oap.server.core.analysis.generated.serviceinstance;
 
 import java.util.*;
 import lombok.*;
@@ -38,12 +38,11 @@ import org.apache.skywalking.oap.server.core.source.Scope;
  */
 @IndicatorType
 @StreamData
-@StorageEntity(name = "endpoint_avg", builder = EndpointAvgIndicator.Builder.class)
-public class EndpointAvgIndicator extends LongAvgIndicator implements AlarmSupported {
+@StorageEntity(name = "serviceinstance_resptime", builder = ServiceInstanceRespTimeIndicator.Builder.class)
+public class ServiceInstanceRespTimeIndicator extends LongAvgIndicator implements AlarmSupported {
 
     @Setter @Getter @Column(columnName = "id") private int id;
     @Setter @Getter @Column(columnName = "service_id") private int serviceId;
-    @Setter @Getter @Column(columnName = "service_instance_id") private int serviceInstanceId;
 
     @Override public String id() {
         String splitJointId = String.valueOf(getTimeBucket());
@@ -66,9 +65,10 @@ public class EndpointAvgIndicator extends LongAvgIndicator implements AlarmSuppo
         if (getClass() != obj.getClass())
             return false;
 
-        EndpointAvgIndicator indicator = (EndpointAvgIndicator)obj;
+        ServiceInstanceRespTimeIndicator indicator = (ServiceInstanceRespTimeIndicator)obj;
         if (id != indicator.id)
             return false;
+
         if (getTimeBucket() != indicator.getTimeBucket())
             return false;
 
@@ -85,8 +85,7 @@ public class EndpointAvgIndicator extends LongAvgIndicator implements AlarmSuppo
 
         remoteBuilder.setDataIntegers(0, getId());
         remoteBuilder.setDataIntegers(1, getServiceId());
-        remoteBuilder.setDataIntegers(2, getServiceInstanceId());
-        remoteBuilder.setDataIntegers(3, getCount());
+        remoteBuilder.setDataIntegers(2, getCount());
 
         return remoteBuilder;
     }
@@ -100,21 +99,19 @@ public class EndpointAvgIndicator extends LongAvgIndicator implements AlarmSuppo
 
         setId(remoteData.getDataIntegers(0));
         setServiceId(remoteData.getDataIntegers(1));
-        setServiceInstanceId(remoteData.getDataIntegers(2));
-        setCount(remoteData.getDataIntegers(3));
+        setCount(remoteData.getDataIntegers(2));
     }
 
     @Override public AlarmMeta getAlarmMeta() {
-        return new AlarmMeta("endpoint_Avg", Scope.Endpoint, id, serviceId, serviceInstanceId);
+        return new AlarmMeta("ServiceInstance_RespTime", Scope.ServiceInstance, id, serviceId);
     }
 
-    public static class Builder implements StorageBuilder<EndpointAvgIndicator> {
+    public static class Builder implements StorageBuilder<ServiceInstanceRespTimeIndicator> {
 
-        @Override public Map<String, Object> data2Map(EndpointAvgIndicator storageData) {
+        @Override public Map<String, Object> data2Map(ServiceInstanceRespTimeIndicator storageData) {
             Map<String, Object> map = new HashMap<>();
             map.put("id", storageData.getId());
             map.put("service_id", storageData.getServiceId());
-            map.put("service_instance_id", storageData.getServiceInstanceId());
             map.put("summation", storageData.getSummation());
             map.put("count", storageData.getCount());
             map.put("value", storageData.getValue());
@@ -122,11 +119,10 @@ public class EndpointAvgIndicator extends LongAvgIndicator implements AlarmSuppo
             return map;
         }
 
-        @Override public EndpointAvgIndicator map2Data(Map<String, Object> dbMap) {
-            EndpointAvgIndicator indicator = new EndpointAvgIndicator();
+        @Override public ServiceInstanceRespTimeIndicator map2Data(Map<String, Object> dbMap) {
+            ServiceInstanceRespTimeIndicator indicator = new ServiceInstanceRespTimeIndicator();
             indicator.setId(((Number)dbMap.get("id")).intValue());
             indicator.setServiceId(((Number)dbMap.get("service_id")).intValue());
-            indicator.setServiceInstanceId(((Number)dbMap.get("service_instance_id")).intValue());
             indicator.setSummation(((Number)dbMap.get("summation")).longValue());
             indicator.setCount(((Number)dbMap.get("count")).intValue());
             indicator.setValue(((Number)dbMap.get("value")).longValue());
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/serviceinstancejvmcpu/InstanceJvmCpuIndicator.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/serviceinstancejvmcpu/InstanceJvmCpuIndicator.java
index a2e3f9a..409051b 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/serviceinstancejvmcpu/InstanceJvmCpuIndicator.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/serviceinstancejvmcpu/InstanceJvmCpuIndicator.java
@@ -68,6 +68,7 @@ public class InstanceJvmCpuIndicator extends DoubleAvgIndicator implements Alarm
         InstanceJvmCpuIndicator indicator = (InstanceJvmCpuIndicator)obj;
         if (id != indicator.id)
             return false;
+
         if (getTimeBucket() != indicator.getTimeBucket())
             return false;
 
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/serviceinstancejvmgc/InstanceJvmYoungGcTimeIndicator.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/serviceinstancejvmgc/InstanceJvmYoungGcTimeIndicator.java
index 1c20889..ce27456 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/serviceinstancejvmgc/InstanceJvmYoungGcTimeIndicator.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/serviceinstancejvmgc/InstanceJvmYoungGcTimeIndicator.java
@@ -68,6 +68,7 @@ public class InstanceJvmYoungGcTimeIndicator extends LongAvgIndicator implements
         InstanceJvmYoungGcTimeIndicator indicator = (InstanceJvmYoungGcTimeIndicator)obj;
         if (id != indicator.id)
             return false;
+
         if (getTimeBucket() != indicator.getTimeBucket())
             return false;
 
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/serviceinstancejvmmemory/InstanceJvmMemoryMaxIndicator.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/serviceinstancejvmmemory/InstanceJvmMemoryMaxIndicator.java
index 643fee2..979b972 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/serviceinstancejvmmemory/InstanceJvmMemoryMaxIndicator.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/serviceinstancejvmmemory/InstanceJvmMemoryMaxIndicator.java
@@ -68,6 +68,7 @@ public class InstanceJvmMemoryMaxIndicator extends LongAvgIndicator implements A
         InstanceJvmMemoryMaxIndicator indicator = (InstanceJvmMemoryMaxIndicator)obj;
         if (id != indicator.id)
             return false;
+
         if (getTimeBucket() != indicator.getTimeBucket())
             return false;
 
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/serviceinstancejvmmemorypool/InstanceJvmMemoryPoolMaxIndicator.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/serviceinstancejvmmemorypool/InstanceJvmMemoryPoolMaxIndicator.java
index a92611c..294c707 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/serviceinstancejvmmemorypool/InstanceJvmMemoryPoolMaxIndicator.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/serviceinstancejvmmemorypool/InstanceJvmMemoryPoolMaxIndicator.java
@@ -68,6 +68,7 @@ public class InstanceJvmMemoryPoolMaxIndicator extends LongAvgIndicator implemen
         InstanceJvmMemoryPoolMaxIndicator indicator = (InstanceJvmMemoryPoolMaxIndicator)obj;
         if (id != indicator.id)
             return false;
+
         if (getTimeBucket() != indicator.getTimeBucket())
             return false;
 
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/service/ServiceAvgIndicator.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/serviceinstancerelation/ServiceInstanceRelationAvgIndicator.java
similarity index 55%
copy from oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/service/ServiceAvgIndicator.java
copy to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/serviceinstancerelation/ServiceInstanceRelationAvgIndicator.java
index aef5f60..aea745a 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/service/ServiceAvgIndicator.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/serviceinstancerelation/ServiceInstanceRelationAvgIndicator.java
@@ -16,7 +16,7 @@
  *
  */
 
-package org.apache.skywalking.oap.server.core.analysis.generated.service;
+package org.apache.skywalking.oap.server.core.analysis.generated.serviceinstancerelation;
 
 import java.util.*;
 import lombok.*;
@@ -38,20 +38,25 @@ import org.apache.skywalking.oap.server.core.source.Scope;
  */
 @IndicatorType
 @StreamData
-@StorageEntity(name = "service_avg", builder = ServiceAvgIndicator.Builder.class)
-public class ServiceAvgIndicator extends LongAvgIndicator implements AlarmSupported {
+@StorageEntity(name = "serviceinstancerelation_avg", builder = ServiceInstanceRelationAvgIndicator.Builder.class)
+public class ServiceInstanceRelationAvgIndicator extends LongAvgIndicator implements AlarmSupported {
 
-    @Setter @Getter @Column(columnName = "id") private int id;
+    @Setter @Getter @Column(columnName = "source_service_id") private int sourceServiceId;
+    @Setter @Getter @Column(columnName = "dest_service_id") private int destServiceId;
+    @Setter @Getter @Column(columnName = "source_service_instance_id") private int sourceServiceInstanceId;
+    @Setter @Getter @Column(columnName = "dest_service_instance_id") private int destServiceInstanceId;
 
     @Override public String id() {
         String splitJointId = String.valueOf(getTimeBucket());
-        splitJointId += Const.ID_SPLIT + String.valueOf(id);
+        splitJointId += Const.ID_SPLIT + String.valueOf(sourceServiceInstanceId);
+        splitJointId += Const.ID_SPLIT + String.valueOf(destServiceInstanceId);
         return splitJointId;
     }
 
     @Override public int hashCode() {
         int result = 17;
-        result = 31 * result + id;
+        result = 31 * result + sourceServiceInstanceId;
+        result = 31 * result + destServiceInstanceId;
         result = 31 * result + (int)getTimeBucket();
         return result;
     }
@@ -64,9 +69,12 @@ public class ServiceAvgIndicator extends LongAvgIndicator implements AlarmSuppor
         if (getClass() != obj.getClass())
             return false;
 
-        ServiceAvgIndicator indicator = (ServiceAvgIndicator)obj;
-        if (id != indicator.id)
+        ServiceInstanceRelationAvgIndicator indicator = (ServiceInstanceRelationAvgIndicator)obj;
+        if (sourceServiceInstanceId != indicator.sourceServiceInstanceId)
             return false;
+        if (destServiceInstanceId != indicator.destServiceInstanceId)
+            return false;
+
         if (getTimeBucket() != indicator.getTimeBucket())
             return false;
 
@@ -81,8 +89,11 @@ public class ServiceAvgIndicator extends LongAvgIndicator implements AlarmSuppor
         remoteBuilder.setDataLongs(2, getTimeBucket());
 
 
-        remoteBuilder.setDataIntegers(0, getId());
-        remoteBuilder.setDataIntegers(1, getCount());
+        remoteBuilder.setDataIntegers(0, getSourceServiceId());
+        remoteBuilder.setDataIntegers(1, getDestServiceId());
+        remoteBuilder.setDataIntegers(2, getSourceServiceInstanceId());
+        remoteBuilder.setDataIntegers(3, getDestServiceInstanceId());
+        remoteBuilder.setDataIntegers(4, getCount());
 
         return remoteBuilder;
     }
@@ -94,19 +105,25 @@ public class ServiceAvgIndicator extends LongAvgIndicator implements AlarmSuppor
         setTimeBucket(remoteData.getDataLongs(2));
 
 
-        setId(remoteData.getDataIntegers(0));
-        setCount(remoteData.getDataIntegers(1));
+        setSourceServiceId(remoteData.getDataIntegers(0));
+        setDestServiceId(remoteData.getDataIntegers(1));
+        setSourceServiceInstanceId(remoteData.getDataIntegers(2));
+        setDestServiceInstanceId(remoteData.getDataIntegers(3));
+        setCount(remoteData.getDataIntegers(4));
     }
 
     @Override public AlarmMeta getAlarmMeta() {
-        return new AlarmMeta("Service_Avg", Scope.Service, id);
+        return new AlarmMeta("ServiceInstanceRelation_Avg", Scope.ServiceInstanceRelation, sourceServiceId, destServiceId, sourceServiceInstanceId, destServiceInstanceId);
     }
 
-    public static class Builder implements StorageBuilder<ServiceAvgIndicator> {
+    public static class Builder implements StorageBuilder<ServiceInstanceRelationAvgIndicator> {
 
-        @Override public Map<String, Object> data2Map(ServiceAvgIndicator storageData) {
+        @Override public Map<String, Object> data2Map(ServiceInstanceRelationAvgIndicator storageData) {
             Map<String, Object> map = new HashMap<>();
-            map.put("id", storageData.getId());
+            map.put("source_service_id", storageData.getSourceServiceId());
+            map.put("dest_service_id", storageData.getDestServiceId());
+            map.put("source_service_instance_id", storageData.getSourceServiceInstanceId());
+            map.put("dest_service_instance_id", storageData.getDestServiceInstanceId());
             map.put("summation", storageData.getSummation());
             map.put("count", storageData.getCount());
             map.put("value", storageData.getValue());
@@ -114,9 +131,12 @@ public class ServiceAvgIndicator extends LongAvgIndicator implements AlarmSuppor
             return map;
         }
 
-        @Override public ServiceAvgIndicator map2Data(Map<String, Object> dbMap) {
-            ServiceAvgIndicator indicator = new ServiceAvgIndicator();
-            indicator.setId(((Number)dbMap.get("id")).intValue());
+        @Override public ServiceInstanceRelationAvgIndicator map2Data(Map<String, Object> dbMap) {
+            ServiceInstanceRelationAvgIndicator indicator = new ServiceInstanceRelationAvgIndicator();
+            indicator.setSourceServiceId(((Number)dbMap.get("source_service_id")).intValue());
+            indicator.setDestServiceId(((Number)dbMap.get("dest_service_id")).intValue());
+            indicator.setSourceServiceInstanceId(((Number)dbMap.get("source_service_instance_id")).intValue());
+            indicator.setDestServiceInstanceId(((Number)dbMap.get("dest_service_instance_id")).intValue());
             indicator.setSummation(((Number)dbMap.get("summation")).longValue());
             indicator.setCount(((Number)dbMap.get("count")).intValue());
             indicator.setValue(((Number)dbMap.get("value")).longValue());
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/serviceinstancerelation/ServiceInstanceRelationDispatcher.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/serviceinstancerelation/ServiceInstanceRelationDispatcher.java
new file mode 100644
index 0000000..adc6944
--- /dev/null
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/serviceinstancerelation/ServiceInstanceRelationDispatcher.java
@@ -0,0 +1,48 @@
+/*
+ * 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.analysis.generated.serviceinstancerelation;
+
+import org.apache.skywalking.oap.server.core.analysis.SourceDispatcher;
+import org.apache.skywalking.oap.server.core.analysis.worker.IndicatorProcess;
+import org.apache.skywalking.oap.server.core.source.*;
+
+/**
+ * This class is auto generated. Please don't change this class manually.
+ *
+ * @author Observability Analysis Language code generator
+ */
+public class ServiceInstanceRelationDispatcher implements SourceDispatcher<ServiceInstanceRelation> {
+
+    @Override public void dispatch(ServiceInstanceRelation source) {
+        doServiceInstanceRelationAvg(source);
+    }
+
+    private void doServiceInstanceRelationAvg(ServiceInstanceRelation source) {
+        ServiceInstanceRelationAvgIndicator indicator = new ServiceInstanceRelationAvgIndicator();
+
+
+        indicator.setTimeBucket(source.getTimeBucket());
+        indicator.setSourceServiceId(source.getSourceServiceId());
+        indicator.setDestServiceId(source.getDestServiceId());
+        indicator.setSourceServiceInstanceId(source.getSourceServiceInstanceId());
+        indicator.setDestServiceInstanceId(source.getDestServiceInstanceId());
+        indicator.combine(source.getLatency(), 1);
+        IndicatorProcess.INSTANCE.in(indicator);
+    }
+}
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/serviceinstancejvmmemory/InstanceJvmMemoryMaxIndicator.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/servicerelation/ServiceRelationAvgIndicator.java
similarity index 66%
copy from oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/serviceinstancejvmmemory/InstanceJvmMemoryMaxIndicator.java
copy to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/servicerelation/ServiceRelationAvgIndicator.java
index 643fee2..a5e1c36 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/serviceinstancejvmmemory/InstanceJvmMemoryMaxIndicator.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/servicerelation/ServiceRelationAvgIndicator.java
@@ -16,7 +16,7 @@
  *
  */
 
-package org.apache.skywalking.oap.server.core.analysis.generated.serviceinstancejvmmemory;
+package org.apache.skywalking.oap.server.core.analysis.generated.servicerelation;
 
 import java.util.*;
 import lombok.*;
@@ -38,21 +38,23 @@ import org.apache.skywalking.oap.server.core.source.Scope;
  */
 @IndicatorType
 @StreamData
-@StorageEntity(name = "instance_jvm_memory_max", builder = InstanceJvmMemoryMaxIndicator.Builder.class)
-public class InstanceJvmMemoryMaxIndicator extends LongAvgIndicator implements AlarmSupported {
+@StorageEntity(name = "servicerelation_avg", builder = ServiceRelationAvgIndicator.Builder.class)
+public class ServiceRelationAvgIndicator extends LongAvgIndicator implements AlarmSupported {
 
-    @Setter @Getter @Column(columnName = "id") private int id;
-    @Setter @Getter @Column(columnName = "service_instance_id") private int serviceInstanceId;
+    @Setter @Getter @Column(columnName = "source_service_id") private int sourceServiceId;
+    @Setter @Getter @Column(columnName = "dest_service_id") private int destServiceId;
 
     @Override public String id() {
         String splitJointId = String.valueOf(getTimeBucket());
-        splitJointId += Const.ID_SPLIT + String.valueOf(id);
+        splitJointId += Const.ID_SPLIT + String.valueOf(sourceServiceId);
+        splitJointId += Const.ID_SPLIT + String.valueOf(destServiceId);
         return splitJointId;
     }
 
     @Override public int hashCode() {
         int result = 17;
-        result = 31 * result + id;
+        result = 31 * result + sourceServiceId;
+        result = 31 * result + destServiceId;
         result = 31 * result + (int)getTimeBucket();
         return result;
     }
@@ -65,9 +67,12 @@ public class InstanceJvmMemoryMaxIndicator extends LongAvgIndicator implements A
         if (getClass() != obj.getClass())
             return false;
 
-        InstanceJvmMemoryMaxIndicator indicator = (InstanceJvmMemoryMaxIndicator)obj;
-        if (id != indicator.id)
+        ServiceRelationAvgIndicator indicator = (ServiceRelationAvgIndicator)obj;
+        if (sourceServiceId != indicator.sourceServiceId)
             return false;
+        if (destServiceId != indicator.destServiceId)
+            return false;
+
         if (getTimeBucket() != indicator.getTimeBucket())
             return false;
 
@@ -82,8 +87,8 @@ public class InstanceJvmMemoryMaxIndicator extends LongAvgIndicator implements A
         remoteBuilder.setDataLongs(2, getTimeBucket());
 
 
-        remoteBuilder.setDataIntegers(0, getId());
-        remoteBuilder.setDataIntegers(1, getServiceInstanceId());
+        remoteBuilder.setDataIntegers(0, getSourceServiceId());
+        remoteBuilder.setDataIntegers(1, getDestServiceId());
         remoteBuilder.setDataIntegers(2, getCount());
 
         return remoteBuilder;
@@ -96,21 +101,21 @@ public class InstanceJvmMemoryMaxIndicator extends LongAvgIndicator implements A
         setTimeBucket(remoteData.getDataLongs(2));
 
 
-        setId(remoteData.getDataIntegers(0));
-        setServiceInstanceId(remoteData.getDataIntegers(1));
+        setSourceServiceId(remoteData.getDataIntegers(0));
+        setDestServiceId(remoteData.getDataIntegers(1));
         setCount(remoteData.getDataIntegers(2));
     }
 
     @Override public AlarmMeta getAlarmMeta() {
-        return new AlarmMeta("instance_jvm_memory_max", Scope.ServiceInstanceJVMMemory, id, serviceInstanceId);
+        return new AlarmMeta("ServiceRelation_Avg", Scope.ServiceRelation, sourceServiceId, destServiceId);
     }
 
-    public static class Builder implements StorageBuilder<InstanceJvmMemoryMaxIndicator> {
+    public static class Builder implements StorageBuilder<ServiceRelationAvgIndicator> {
 
-        @Override public Map<String, Object> data2Map(InstanceJvmMemoryMaxIndicator storageData) {
+        @Override public Map<String, Object> data2Map(ServiceRelationAvgIndicator storageData) {
             Map<String, Object> map = new HashMap<>();
-            map.put("id", storageData.getId());
-            map.put("service_instance_id", storageData.getServiceInstanceId());
+            map.put("source_service_id", storageData.getSourceServiceId());
+            map.put("dest_service_id", storageData.getDestServiceId());
             map.put("summation", storageData.getSummation());
             map.put("count", storageData.getCount());
             map.put("value", storageData.getValue());
@@ -118,10 +123,10 @@ public class InstanceJvmMemoryMaxIndicator extends LongAvgIndicator implements A
             return map;
         }
 
-        @Override public InstanceJvmMemoryMaxIndicator map2Data(Map<String, Object> dbMap) {
-            InstanceJvmMemoryMaxIndicator indicator = new InstanceJvmMemoryMaxIndicator();
-            indicator.setId(((Number)dbMap.get("id")).intValue());
-            indicator.setServiceInstanceId(((Number)dbMap.get("service_instance_id")).intValue());
+        @Override public ServiceRelationAvgIndicator map2Data(Map<String, Object> dbMap) {
+            ServiceRelationAvgIndicator indicator = new ServiceRelationAvgIndicator();
+            indicator.setSourceServiceId(((Number)dbMap.get("source_service_id")).intValue());
+            indicator.setDestServiceId(((Number)dbMap.get("dest_service_id")).intValue());
             indicator.setSummation(((Number)dbMap.get("summation")).longValue());
             indicator.setCount(((Number)dbMap.get("count")).intValue());
             indicator.setValue(((Number)dbMap.get("value")).longValue());
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/servicerelation/ServiceRelationDispatcher.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/servicerelation/ServiceRelationDispatcher.java
new file mode 100644
index 0000000..1c7a52c
--- /dev/null
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/servicerelation/ServiceRelationDispatcher.java
@@ -0,0 +1,46 @@
+/*
+ * 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.analysis.generated.servicerelation;
+
+import org.apache.skywalking.oap.server.core.analysis.SourceDispatcher;
+import org.apache.skywalking.oap.server.core.analysis.worker.IndicatorProcess;
+import org.apache.skywalking.oap.server.core.source.*;
+
+/**
+ * This class is auto generated. Please don't change this class manually.
+ *
+ * @author Observability Analysis Language code generator
+ */
+public class ServiceRelationDispatcher implements SourceDispatcher<ServiceRelation> {
+
+    @Override public void dispatch(ServiceRelation source) {
+        doServiceRelationAvg(source);
+    }
+
+    private void doServiceRelationAvg(ServiceRelation source) {
+        ServiceRelationAvgIndicator indicator = new ServiceRelationAvgIndicator();
+
+
+        indicator.setTimeBucket(source.getTimeBucket());
+        indicator.setSourceServiceId(source.getSourceServiceId());
+        indicator.setDestServiceId(source.getDestServiceId());
+        indicator.combine(source.getLatency(), 1);
+        IndicatorProcess.INSTANCE.in(indicator);
+    }
+}
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 8c0ed3b..c33277c 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
@@ -31,8 +31,18 @@ public class EndpointRelation extends Source {
 
     @Getter @Setter private int endpointId;
     @Getter @Setter private String endpoint;
+    @Getter @Setter private int serviceId;
+    @Getter @Setter private String serviceName;
+    @Getter @Setter private int serviceInstanceId;
+    @Getter @Setter private String serviceInstanceName;
+
     @Getter @Setter private int childEndpointId;
     @Getter @Setter private String childEndpoint;
+    @Getter @Setter private int childServiceId;
+    @Getter @Setter private String childServiceName;
+    @Getter @Setter private int childServiceInstanceId;
+    @Getter @Setter private String childServiceInstanceName;
+
     @Getter @Setter private int rpcLatency;
     @Getter @Setter private boolean status;
     @Getter @Setter private int responseCode;
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 c1705a5..2d111d7 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
@@ -31,6 +31,7 @@ public class ServiceInstance extends Source {
     }
 
     @Getter @Setter private int id;
+    @Getter @Setter private int serviceId;
     @Getter @Setter private String name;
     @Getter @Setter private String serviceName;
     @Getter @Setter private String endpointName;
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceRelation.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceRelation.java
index 7c51b8e..bd227b3 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceRelation.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceRelation.java
@@ -30,9 +30,11 @@ public class ServiceInstanceRelation extends Source {
     }
 
     @Getter @Setter private int sourceServiceInstanceId;
+    @Getter @Setter private int sourceServiceId;
     @Getter @Setter private String sourceServiceName;
     @Getter @Setter private String sourceServiceInstanceName;
     @Getter @Setter private int destServiceInstanceId;
+    @Getter @Setter private int destServiceId;
     @Getter @Setter private String destServiceName;
     @Getter @Setter private String destServiceInstanceName;
     @Getter @Setter private String endpoint;
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/endpoint/MultiScopesSpanListener.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/endpoint/MultiScopesSpanListener.java
index 290390f..cbbf576 100644
--- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/endpoint/MultiScopesSpanListener.java
+++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/endpoint/MultiScopesSpanListener.java
@@ -31,7 +31,16 @@ import org.slf4j.*;
 import static java.util.Objects.nonNull;
 
 /**
- * @author peng-yongsheng
+ *
+ * Notice, in here, there are following concepts match
+ *
+ *       v5        |   v6
+ *
+ * 1. Application == Service
+ * 2. Server == Service Instance
+ * 3. Service == Endpoint
+ *
+ * @author peng-yongsheng, wusheng
  */
 public class MultiScopesSpanListener implements EntrySpanListener, ExitSpanListener {
 
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/endpoint/SourceBuilder.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/endpoint/SourceBuilder.java
index c138c5e..e5485fe 100644
--- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/endpoint/SourceBuilder.java
+++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/endpoint/SourceBuilder.java
@@ -80,6 +80,7 @@ class SourceBuilder {
     ServiceInstance toServiceInstance() {
         ServiceInstance serviceInstance = new ServiceInstance();
         serviceInstance.setId(destServiceInstanceId);
+        serviceInstance.setServiceId(destServiceId);
         serviceInstance.setName(destServiceInstanceName);
         serviceInstance.setServiceName(destServiceName);
         serviceInstance.setEndpointName(destEndpointName);
@@ -94,8 +95,10 @@ class SourceBuilder {
     ServiceInstanceRelation toServiceInstanceRelation() {
         ServiceInstanceRelation serviceInstanceRelation = new ServiceInstanceRelation();
         serviceInstanceRelation.setSourceServiceInstanceId(sourceServiceInstanceId);
+        serviceInstanceRelation.setSourceServiceId(sourceServiceId);
         serviceInstanceRelation.setSourceServiceName(sourceServiceName);
         serviceInstanceRelation.setSourceServiceInstanceName(sourceServiceInstanceName);
+        serviceInstanceRelation.setSourceServiceId(destServiceId);
         serviceInstanceRelation.setDestServiceInstanceId(destServiceInstanceId);
         serviceInstanceRelation.setDestServiceName(destServiceName);
         serviceInstanceRelation.setDestServiceInstanceName(destServiceInstanceName);
@@ -129,8 +132,16 @@ class SourceBuilder {
         EndpointRelation endpointRelation = new EndpointRelation();
         endpointRelation.setEndpointId(sourceEndpointId);
         endpointRelation.setEndpoint(sourceEndpointName);
+        endpointRelation.setServiceId(sourceServiceId);
+        endpointRelation.setServiceName(sourceServiceName);
+        endpointRelation.setServiceInstanceId(sourceServiceInstanceId);
+        endpointRelation.setServiceInstanceName(sourceServiceInstanceName);
         endpointRelation.setChildEndpointId(destEndpointId);
         endpointRelation.setChildEndpoint(destEndpointName);
+        endpointRelation.setChildServiceId(destServiceId);
+        endpointRelation.setChildServiceName(destServiceName);
+        endpointRelation.setChildServiceInstanceId(destServiceInstanceId);
+        endpointRelation.setChildServiceInstanceName(destServiceInstanceName);
         endpointRelation.setRpcLatency(latency);
         endpointRelation.setStatus(status);
         endpointRelation.setResponseCode(responseCode);