You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by wu...@apache.org on 2020/05/10 16:28:28 UTC

[skywalking] branch master updated: Alarm support multiple scope (#4769)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 749af3e  Alarm support multiple scope (#4769)
749af3e is described below

commit 749af3e04efcf577ef8745fd09c15bbde3704d5c
Author: mrproliu <74...@qq.com>
AuthorDate: Mon May 11 00:28:10 2020 +0800

    Alarm support multiple scope (#4769)
    
    * Support service relation and database access alarm
    
    * support service instance relation alarm
    
    * support endpoint relation alarm
    
    * document and format the name
    
    * resolve issues
    
    * add database access and endpoint relation rule example
    
    * resolve code format
    
    * remove unnecessary getter and setter package declare
    
    * remove unnecessary fields
    
    Co-authored-by: Mrproliu <mr...@lagou.com>
---
 dist-material/alarm-settings.yml                   | 14 ++++
 docs/en/setup/backend/backend-alarm.md             | 40 ++++++----
 .../server/exporter/provider/MetricFormatter.java  | 33 ++++++++
 .../oal/rt/parser/ConditionExpression.java         |  5 +-
 .../skywalking/oal/rt/parser/DataColumn.java       |  5 +-
 .../skywalking/oal/rt/parser/EntryMethod.java      |  5 +-
 .../skywalking/oal/rt/parser/Expression.java       |  5 +-
 .../skywalking/oal/rt/parser/PersistenceField.java |  5 +-
 .../skywalking/oal/rt/parser/SourceColumn.java     |  5 +-
 .../oap/server/core/alarm/provider/AlarmRule.java  |  5 +-
 .../server/core/alarm/provider/NotifyHandler.java  | 57 +++++++++++++-
 .../oap/server/core/alarm/provider/Rules.java      |  5 +-
 .../core/alarm/provider/NotifyHandlerTest.java     | 90 ++++++++++++++++++++++
 .../oap/server/core/alarm/AlarmMessage.java        |  5 +-
 .../oap/server/core/alarm/EndpointMetaInAlarm.java |  7 +-
 ...Alarm.java => EndpointRelationMetaInAlarm.java} | 25 +++---
 .../core/alarm/ServiceInstanceMetaInAlarm.java     |  7 +-
 ...ava => ServiceInstanceRelationMetaInAlarm.java} | 25 +++---
 .../oap/server/core/alarm/ServiceMetaInAlarm.java  |  7 +-
 ...nAlarm.java => ServiceRelationMetaInAlarm.java} | 21 +++--
 .../oap/server/core/source/DatabaseAccess.java     |  3 +-
 .../oap/server/core/source/DefaultScopeDefine.java | 45 +++++++++++
 .../oap/server/core/source/EndpointRelation.java   |  3 +-
 .../oap/server/core/source/ScopeDefaultColumn.java |  3 +-
 .../core/source/ServiceInstanceRelation.java       |  3 +-
 .../oap/server/core/source/ServiceRelation.java    |  3 +-
 .../oap/query/graphql/GraphQLQueryConfig.java      |  2 +-
 27 files changed, 333 insertions(+), 100 deletions(-)

diff --git a/dist-material/alarm-settings.yml b/dist-material/alarm-settings.yml
index fc5e121..6402151 100644
--- a/dist-material/alarm-settings.yml
+++ b/dist-material/alarm-settings.yml
@@ -54,6 +54,20 @@ rules:
     count: 2
     silence-period: 5
     message: Response time of service instance {name} is more than 1000ms in 2 minutes of last 10 minutes
+  database_access_resp_time_rule:
+    metrics-name: database_access_resp_time
+    threshold: 1000
+    op: ">"
+    period: 10
+    count: 2
+    message: Response time of database access {name} is more than 1000ms in 2 minutes of last 10 minutes
+  endpoint_relation_resp_time_rule:
+    metrics-name: endpoint_relation_resp_time
+    threshold: 1000
+    op: ">"
+    period: 10
+    count: 2
+    message: Response time of endpoint relation {name} is more than 1000ms in 2 minutes of last 10 minutes
 #  Active endpoint related metrics alarm will cost more memory than service and service instance metrics alarm.
 #  Because the number of endpoint is much more than service and instance.
 #
diff --git a/docs/en/setup/backend/backend-alarm.md b/docs/en/setup/backend/backend-alarm.md
index b812036..c00817b 100644
--- a/docs/en/setup/backend/backend-alarm.md
+++ b/docs/en/setup/backend/backend-alarm.md
@@ -5,15 +5,23 @@ There are three parts in alarm rule definition.
 1. [Webhooks](#webhook). The list of web service endpoint, which should be called after the alarm is triggered.
 1. [gRPCHook](#gRPCHook). The host and port of remote gRPC method, which should be called after the alarm is triggered.
 
+## Entity name
+Define the relation between scope and entity name.
+- **Service**: Service name
+- **Instance**: {Instance name} of {Service name}
+- **Endpoint**: {Endpoint name} in {Service name}
+- **Database**: Database service name
+- **Service Relation**: {Source service name} to {Dest service name}
+- **Instance Relation**: {Source instance name} of {Source service name} to {Dest instance name} of {Dest service name}
+- **Endpoint Relation**: {Source endpoint name} in {Source Service name} to {Dest endpoint name} in {Dest service name}
+
 ## Rules
 Alarm rule is constituted by following keys
 - **Rule name**. Unique name, show in alarm message. Must end with `_rule`.
 - **Metrics name**. A.K.A. metrics name in oal script. Only long, double, int types are supported. See
 [List of all potential metrics name](#list-of-all-potential-metrics-name).
-- **Include names**. The following entity names are included in this rule. Such as Service name,
-endpoint name.
-- **Exclude names**. The following entity names are excluded in this rule. Such as Service name,
-  endpoint name.
+- **Include names**. The following entity names are included in this rule. Please follow [Entity name define](#entity-name).
+- **Exclude names**. The following entity names are excluded in this rule. Please follow [Entity name define](#entity-name).
 - **Threshold**. The target value. 
 For multiple values metrics, such as **percentile**, the threshold is an array. Described like  `value1, value2, value3, value4, value5`.
 Each value could the threshold for each value of the metrics. Set the value to `-` if don't want to trigger alarm by this or some of the values.  
@@ -74,19 +82,21 @@ We provided a default `alarm-setting.yml` in our distribution only for convenien
 1. Percentile of service response time is over 1s in last 3 minutes
 1. Service Instance average response time over 1s in last 2 minutes.
 1. Endpoint average response time over 1s in last 2 minutes.
+1. Database access average response time over 1s in last 2 minutes.
+1. Endpoint relation average response time over 1s in last 2 minutes.
 
 ### List of all potential metrics name
 The metrics names are defined in official [OAL scripts](../../guides/backend-oal-scripts.md), right now 
-metrics from **Service**, **Service Instance**, **Endpoint** scopes could be used in Alarm, we will extend in further versions. 
+metrics from **Service**, **Service Instance**, **Endpoint**, **Service Relation**, **Service Instance Relation**, **Endpoint Relation** scopes could be used in Alarm, and the **Database access** same with **Service** scope.
 
 Submit issue or pull request if you want to support any other scope in alarm.
 
 ## Webhook
-Webhook requires the peer is a web container. The alarm message will send through HTTP post by `application/json` content type. The JSON format is based on `List<org.apache.skywalking.oap.server.core.alarm.AlarmMessage` with following key information.
+Webhook requires the peer is a web container. The alarm message will send through HTTP post by `application/json` content type. The JSON format is based on `List<org.apache.skywalking.oap.server.core.alarm.AlarmMessage>` with following key information.
 - **scopeId**, **scope**. All scopes are defined in org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.
-- **name**. Target scope entity name.
-- **id0**. The ID of scope entity, matched the name.
-- **id1**. Not used today.
+- **name**. Target scope entity name. Please follow [Entity name define](#entity-name).
+- **id0**. The ID of the scope entity matched the name. When using relation scope, it is the source entity ID.
+- **id1**. When using relation scope, it will be the dest entity ID. Otherwise, it is empty.
 - **ruleName**. The rule name you configured in `alarm-settings.yml`.
 - **alarmMessage**. Alarm text message.
 - **startTime**. Alarm time measured in milliseconds, between the current time and midnight, January 1, 1970 UTC.
@@ -95,20 +105,20 @@ Example as following
 ```json
 [{
 	"scopeId": 1, 
-        "scope": "SERVICE",
-        "name": "serviceA", 
+	"scope": "SERVICE",
+	"name": "serviceA", 
 	"id0": "12",  
 	"id1": "",  
-        "ruleName": "service_resp_time_rule",
+    "ruleName": "service_resp_time_rule",
 	"alarmMessage": "alarmMessage xxxx",
 	"startTime": 1560524171000
 }, {
 	"scopeId": 1,
-        "scope": "SERVICE",
-        "name": "serviceB",
+	"scope": "SERVICE",
+	"name": "serviceB",
 	"id0": "23",
 	"id1": "",
-        "ruleName": "service_resp_time_rule",
+    "ruleName": "service_resp_time_rule",
 	"alarmMessage": "alarmMessage yyy",
 	"startTime": 1560524171000
 }]
diff --git a/oap-server/exporter/src/main/java/org/apache/skywalking/oap/server/exporter/provider/MetricFormatter.java b/oap-server/exporter/src/main/java/org/apache/skywalking/oap/server/exporter/provider/MetricFormatter.java
index ba320c6..bd281d9 100644
--- a/oap-server/exporter/src/main/java/org/apache/skywalking/oap/server/exporter/provider/MetricFormatter.java
+++ b/oap-server/exporter/src/main/java/org/apache/skywalking/oap/server/exporter/provider/MetricFormatter.java
@@ -42,6 +42,39 @@ public class MetricFormatter {
             final IDManager.EndpointID.EndpointIDDefinition endpointIDDefinition = IDManager.EndpointID.analysisId(
                 endpointId);
             return endpointIDDefinition.getEndpointName();
+        } else if (DefaultScopeDefine.inServiceRelationCatalog(scope)) {
+            final String serviceRelationId = meta.getId();
+            final IDManager.ServiceID.ServiceRelationDefine serviceRelationDefine = IDManager.ServiceID.analysisRelationId(
+                serviceRelationId);
+            final IDManager.ServiceID.ServiceIDDefinition sourceIdDefinition = IDManager.ServiceID.analysisId(
+                serviceRelationDefine.getSourceId());
+            final IDManager.ServiceID.ServiceIDDefinition destIdDefinition = IDManager.ServiceID.analysisId(
+                serviceRelationDefine.getDestId());
+            return sourceIdDefinition.getName() + " to " + destIdDefinition.getName();
+        } else if (DefaultScopeDefine.inServiceInstanceRelationCatalog(scope)) {
+            final String instanceRelationId = meta.getId();
+            final IDManager.ServiceInstanceID.ServiceInstanceRelationDefine serviceRelationDefine = IDManager.ServiceInstanceID.analysisRelationId(
+                instanceRelationId);
+            final IDManager.ServiceInstanceID.InstanceIDDefinition sourceIdDefinition = IDManager.ServiceInstanceID.analysisId(
+                serviceRelationDefine.getSourceId());
+            final IDManager.ServiceID.ServiceIDDefinition sourceServiceId = IDManager.ServiceID.analysisId(
+                sourceIdDefinition.getServiceId());
+            final IDManager.ServiceInstanceID.InstanceIDDefinition destIdDefinition = IDManager.ServiceInstanceID.analysisId(
+                serviceRelationDefine.getDestId());
+            final IDManager.ServiceID.ServiceIDDefinition destServiceId = IDManager.ServiceID.analysisId(
+                destIdDefinition.getServiceId());
+            return sourceIdDefinition.getName() + " of " + sourceServiceId.getName()
+                + " to " + destIdDefinition.getName() + " of " + destServiceId.getName();
+        } else if (DefaultScopeDefine.inEndpointRelationCatalog(scope)) {
+            final String endpointRelationId = meta.getId();
+            final IDManager.EndpointID.EndpointRelationDefine endpointRelationDefine = IDManager.EndpointID.analysisRelationId(
+                endpointRelationId);
+            final IDManager.ServiceID.ServiceIDDefinition sourceService = IDManager.ServiceID.analysisId(
+                endpointRelationDefine.getSourceServiceId());
+            final IDManager.ServiceID.ServiceIDDefinition destService = IDManager.ServiceID.analysisId(
+                endpointRelationDefine.getDestServiceId());
+            return endpointRelationDefine.getSource() + " in " + sourceService.getName()
+                + " to " + endpointRelationDefine.getDest() + " in " + destService.getName();
         } else if (scope == DefaultScopeDefine.ALL) {
             return "";
         } else {
diff --git a/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/ConditionExpression.java b/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/ConditionExpression.java
index cdcfe8a..c562a70 100644
--- a/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/ConditionExpression.java
+++ b/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/ConditionExpression.java
@@ -18,12 +18,11 @@
 
 package org.apache.skywalking.oal.rt.parser;
 
-import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.Setter;
 
-@Getter(AccessLevel.PUBLIC)
-@Setter(AccessLevel.PUBLIC)
+@Getter
+@Setter
 public class ConditionExpression {
     // original from script
     private String expressionType;
diff --git a/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/DataColumn.java b/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/DataColumn.java
index 02e71cb..8a43f9b 100644
--- a/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/DataColumn.java
+++ b/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/DataColumn.java
@@ -18,13 +18,12 @@
 
 package org.apache.skywalking.oal.rt.parser;
 
-import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.Setter;
 import org.apache.skywalking.oal.rt.util.ClassMethodUtil;
 
-@Getter(AccessLevel.PUBLIC)
-@Setter(AccessLevel.PUBLIC)
+@Getter
+@Setter
 public class DataColumn {
     private String fieldName;
     private String columnName;
diff --git a/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/EntryMethod.java b/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/EntryMethod.java
index f716a44..61f5605 100644
--- a/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/EntryMethod.java
+++ b/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/EntryMethod.java
@@ -20,13 +20,12 @@ package org.apache.skywalking.oal.rt.parser;
 
 import java.util.ArrayList;
 import java.util.List;
-import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.Setter;
 import org.apache.skywalking.oal.rt.util.ClassMethodUtil;
 
-@Getter(AccessLevel.PUBLIC)
-@Setter(AccessLevel.PUBLIC)
+@Getter
+@Setter
 public class EntryMethod {
     static final int LITERAL_TYPE = 1;
     static final int IDENTIFIER_TYPE = 2;
diff --git a/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/Expression.java b/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/Expression.java
index ccd1856..b911d34 100644
--- a/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/Expression.java
+++ b/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/Expression.java
@@ -18,12 +18,11 @@
 
 package org.apache.skywalking.oal.rt.parser;
 
-import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.Setter;
 
-@Getter(AccessLevel.PUBLIC)
-@Setter(AccessLevel.PUBLIC)
+@Getter
+@Setter
 public class Expression {
     private String expressionObject;
     private String left;
diff --git a/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/PersistenceField.java b/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/PersistenceField.java
index 622e7e8..45c5a10 100644
--- a/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/PersistenceField.java
+++ b/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/PersistenceField.java
@@ -18,13 +18,12 @@
 
 package org.apache.skywalking.oal.rt.parser;
 
-import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.Setter;
 import org.apache.skywalking.oal.rt.util.ClassMethodUtil;
 
-@Getter(AccessLevel.PUBLIC)
-@Setter(AccessLevel.PUBLIC)
+@Getter
+@Setter
 public class PersistenceField {
     private String fieldName;
     private String setter;
diff --git a/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/SourceColumn.java b/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/SourceColumn.java
index fc798a3..b1d6618 100644
--- a/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/SourceColumn.java
+++ b/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/SourceColumn.java
@@ -19,13 +19,12 @@
 package org.apache.skywalking.oal.rt.parser;
 
 import java.util.Objects;
-import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.Setter;
 import org.apache.skywalking.oal.rt.util.ClassMethodUtil;
 
-@Getter(AccessLevel.PUBLIC)
-@Setter(AccessLevel.PUBLIC)
+@Getter
+@Setter
 public class SourceColumn {
     private String fieldName;
     private String columnName;
diff --git a/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/AlarmRule.java b/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/AlarmRule.java
index df0cc96..ef6672b 100644
--- a/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/AlarmRule.java
+++ b/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/AlarmRule.java
@@ -20,7 +20,6 @@ package org.apache.skywalking.oap.server.core.alarm.provider;
 
 import java.util.ArrayList;
 import java.util.Objects;
-import lombok.AccessLevel;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Getter;
@@ -31,8 +30,8 @@ import lombok.ToString;
 @Builder
 @NoArgsConstructor
 @AllArgsConstructor
-@Setter(AccessLevel.PUBLIC)
-@Getter(AccessLevel.PUBLIC)
+@Setter
+@Getter
 @ToString
 public class AlarmRule {
     private String alarmRuleName;
diff --git a/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/NotifyHandler.java b/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/NotifyHandler.java
index d46fe39..bf77c38 100644
--- a/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/NotifyHandler.java
+++ b/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/NotifyHandler.java
@@ -23,6 +23,9 @@ import java.util.Arrays;
 import java.util.List;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.skywalking.oap.server.core.alarm.AlarmCallback;
+import org.apache.skywalking.oap.server.core.alarm.EndpointRelationMetaInAlarm;
+import org.apache.skywalking.oap.server.core.alarm.ServiceInstanceRelationMetaInAlarm;
+import org.apache.skywalking.oap.server.core.alarm.ServiceRelationMetaInAlarm;
 import org.apache.skywalking.oap.server.core.alarm.EndpointMetaInAlarm;
 import org.apache.skywalking.oap.server.core.alarm.MetaInAlarm;
 import org.apache.skywalking.oap.server.core.alarm.MetricsNotify;
@@ -51,9 +54,9 @@ public class NotifyHandler implements MetricsNotify {
         MetricsMetaInfo meta = withMetadata.getMeta();
         int scope = meta.getScope();
 
-        if (!DefaultScopeDefine.inServiceCatalog(scope) && !DefaultScopeDefine.inServiceInstanceCatalog(
-            scope) && !DefaultScopeDefine
-            .inEndpointCatalog(scope)) {
+        if (!DefaultScopeDefine.inServiceCatalog(scope) && !DefaultScopeDefine.inServiceInstanceCatalog(scope)
+            && !DefaultScopeDefine.inEndpointCatalog(scope) && !DefaultScopeDefine.inServiceRelationCatalog(scope)
+            && !DefaultScopeDefine.inServiceInstanceRelationCatalog(scope) && !DefaultScopeDefine.inEndpointRelationCatalog(scope)) {
             return;
         }
 
@@ -91,6 +94,54 @@ public class NotifyHandler implements MetricsNotify {
             endpointMetaInAlarm.setName(
                 endpointIDDefinition.getEndpointName() + " in " + serviceIDDefinition.getName());
             metaInAlarm = endpointMetaInAlarm;
+        } else if (DefaultScopeDefine.inServiceRelationCatalog(scope)) {
+            final String serviceRelationId = meta.getId();
+            final IDManager.ServiceID.ServiceRelationDefine serviceRelationDefine = IDManager.ServiceID.analysisRelationId(
+                serviceRelationId);
+            final IDManager.ServiceID.ServiceIDDefinition sourceIdDefinition = IDManager.ServiceID.analysisId(
+                serviceRelationDefine.getSourceId());
+            final IDManager.ServiceID.ServiceIDDefinition destIdDefinition = IDManager.ServiceID.analysisId(
+                serviceRelationDefine.getDestId());
+            ServiceRelationMetaInAlarm serviceRelationMetaInAlarm = new ServiceRelationMetaInAlarm();
+            serviceRelationMetaInAlarm.setMetricsName(meta.getMetricsName());
+            serviceRelationMetaInAlarm.setId(serviceRelationId);
+            serviceRelationMetaInAlarm.setName(sourceIdDefinition.getName() + " to " + destIdDefinition.getName());
+            metaInAlarm = serviceRelationMetaInAlarm;
+        } else if (DefaultScopeDefine.inServiceInstanceRelationCatalog(scope)) {
+            final String instanceRelationId = meta.getId();
+            final IDManager.ServiceInstanceID.ServiceInstanceRelationDefine serviceRelationDefine = IDManager.ServiceInstanceID.analysisRelationId(
+                instanceRelationId);
+
+            final IDManager.ServiceInstanceID.InstanceIDDefinition sourceIdDefinition = IDManager.ServiceInstanceID.analysisId(
+                serviceRelationDefine.getSourceId());
+            final IDManager.ServiceID.ServiceIDDefinition sourceServiceId = IDManager.ServiceID.analysisId(
+                sourceIdDefinition.getServiceId());
+            final IDManager.ServiceInstanceID.InstanceIDDefinition destIdDefinition = IDManager.ServiceInstanceID.analysisId(
+                serviceRelationDefine.getDestId());
+            final IDManager.ServiceID.ServiceIDDefinition destServiceId = IDManager.ServiceID.analysisId(
+                destIdDefinition.getServiceId());
+
+            ServiceInstanceRelationMetaInAlarm instanceRelationMetaInAlarm = new ServiceInstanceRelationMetaInAlarm();
+            instanceRelationMetaInAlarm.setMetricsName(meta.getMetricsName());
+            instanceRelationMetaInAlarm.setId(instanceRelationId);
+            instanceRelationMetaInAlarm.setName(sourceIdDefinition.getName() + " of " + sourceServiceId.getName()
+                + " to " + destIdDefinition.getName() + " of " + destServiceId.getName());
+            metaInAlarm = instanceRelationMetaInAlarm;
+        } else if (DefaultScopeDefine.inEndpointRelationCatalog(scope)) {
+            final String endpointRelationId = meta.getId();
+            final IDManager.EndpointID.EndpointRelationDefine endpointRelationDefine = IDManager.EndpointID.analysisRelationId(
+                endpointRelationId);
+            final IDManager.ServiceID.ServiceIDDefinition sourceService = IDManager.ServiceID.analysisId(
+                endpointRelationDefine.getSourceServiceId());
+            final IDManager.ServiceID.ServiceIDDefinition destService = IDManager.ServiceID.analysisId(
+                endpointRelationDefine.getDestServiceId());
+
+            EndpointRelationMetaInAlarm endpointRelationMetaInAlarm = new EndpointRelationMetaInAlarm();
+            endpointRelationMetaInAlarm.setMetricsName(meta.getMetricsName());
+            endpointRelationMetaInAlarm.setId(endpointRelationId);
+            endpointRelationMetaInAlarm.setName(endpointRelationDefine.getSource() + " in " + sourceService.getName()
+                + " to " + endpointRelationDefine.getDest() + " in " + destService.getName());
+            metaInAlarm = endpointRelationMetaInAlarm;
         } else {
             return;
         }
diff --git a/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/Rules.java b/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/Rules.java
index 4e2560c..87dd507 100644
--- a/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/Rules.java
+++ b/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/Rules.java
@@ -20,14 +20,13 @@ package org.apache.skywalking.oap.server.core.alarm.provider;
 
 import java.util.ArrayList;
 import java.util.List;
-import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.Setter;
 import lombok.ToString;
 import org.apache.skywalking.oap.server.core.alarm.provider.grpc.GRPCAlarmSetting;
 
-@Setter(AccessLevel.PUBLIC)
-@Getter(AccessLevel.PUBLIC)
+@Setter
+@Getter
 @ToString
 public class Rules {
     private List<AlarmRule> rules;
diff --git a/oap-server/server-alarm-plugin/src/test/java/org/apache/skywalking/oap/server/core/alarm/provider/NotifyHandlerTest.java b/oap-server/server-alarm-plugin/src/test/java/org/apache/skywalking/oap/server/core/alarm/provider/NotifyHandlerTest.java
index ba1d3c8..61c9669 100644
--- a/oap-server/server-alarm-plugin/src/test/java/org/apache/skywalking/oap/server/core/alarm/provider/NotifyHandlerTest.java
+++ b/oap-server/server-alarm-plugin/src/test/java/org/apache/skywalking/oap/server/core/alarm/provider/NotifyHandlerTest.java
@@ -21,6 +21,9 @@ package org.apache.skywalking.oap.server.core.alarm.provider;
 import com.google.common.collect.Lists;
 import org.apache.skywalking.oap.server.core.CoreModule;
 import org.apache.skywalking.oap.server.core.alarm.AlarmMessage;
+import org.apache.skywalking.oap.server.core.alarm.EndpointRelationMetaInAlarm;
+import org.apache.skywalking.oap.server.core.alarm.ServiceInstanceRelationMetaInAlarm;
+import org.apache.skywalking.oap.server.core.alarm.ServiceRelationMetaInAlarm;
 import org.apache.skywalking.oap.server.core.alarm.EndpointMetaInAlarm;
 import org.apache.skywalking.oap.server.core.alarm.MetaInAlarm;
 import org.apache.skywalking.oap.server.core.alarm.ServiceInstanceMetaInAlarm;
@@ -163,6 +166,93 @@ public class NotifyHandlerTest {
         assertEquals(DefaultScopeDefine.SERVICE, metaInAlarm.getScopeId());
     }
 
+    @Test
+    public void testNotifyWithServiceRelationCatalog() {
+        prepareNotify();
+
+        String metricsName = "service-relation-metrics";
+        when(metadata.getMetricsName()).thenReturn(metricsName);
+        when(DefaultScopeDefine.inServiceRelationCatalog(0)).thenReturn(true);
+        final String serviceRelationId = IDManager.ServiceID.buildRelationId(new IDManager.ServiceID.ServiceRelationDefine(
+            IDManager.ServiceID.buildId("from-service", true),
+            IDManager.ServiceID.buildId("dest-service", true)
+        ));
+        when(metadata.getId()).thenReturn(serviceRelationId);
+
+        ArgumentCaptor<MetaInAlarm> metaCaptor = ArgumentCaptor.forClass(MetaInAlarm.class);
+
+        notifyHandler.notify(metrics);
+        verify(rule).in(metaCaptor.capture(), any());
+
+        MetaInAlarm metaInAlarm = metaCaptor.getValue();
+
+        assertTrue(metaInAlarm instanceof ServiceRelationMetaInAlarm);
+        assertEquals(metricsName, metaInAlarm.getMetricsName());
+        assertEquals("ZnJvbS1zZXJ2aWNl.1", metaInAlarm.getId0());
+        assertEquals("ZGVzdC1zZXJ2aWNl.1", metaInAlarm.getId1());
+        assertEquals(DefaultScopeDefine.SERVICE_RELATION_CATALOG_NAME, metaInAlarm.getScope());
+        assertEquals("from-service to dest-service", metaInAlarm.getName());
+        assertEquals(DefaultScopeDefine.SERVICE_RELATION, metaInAlarm.getScopeId());
+    }
+
+    @Test
+    public void testNotifyWithServiceInstanceRelationCatalog() {
+        prepareNotify();
+
+        String metricsName = "service-instance-relation-metrics";
+        when(metadata.getMetricsName()).thenReturn(metricsName);
+        when(DefaultScopeDefine.inServiceInstanceRelationCatalog(0)).thenReturn(true);
+        final String serviceInstanceRelationId = IDManager.ServiceInstanceID.buildRelationId(new IDManager.ServiceInstanceID.ServiceInstanceRelationDefine(
+            IDManager.ServiceInstanceID.buildId(IDManager.ServiceID.buildId("from-service", true), "from-service-instance"),
+            IDManager.ServiceInstanceID.buildId(IDManager.ServiceID.buildId("dest-service", true), "dest-service-instance")
+        ));
+        when(metadata.getId()).thenReturn(serviceInstanceRelationId);
+
+        ArgumentCaptor<MetaInAlarm> metaCaptor = ArgumentCaptor.forClass(MetaInAlarm.class);
+
+        notifyHandler.notify(metrics);
+        verify(rule).in(metaCaptor.capture(), any());
+
+        MetaInAlarm metaInAlarm = metaCaptor.getValue();
+
+        assertTrue(metaInAlarm instanceof ServiceInstanceRelationMetaInAlarm);
+        assertEquals(metricsName, metaInAlarm.getMetricsName());
+        assertEquals("ZnJvbS1zZXJ2aWNl.1_ZnJvbS1zZXJ2aWNlLWluc3RhbmNl", metaInAlarm.getId0());
+        assertEquals("ZGVzdC1zZXJ2aWNl.1_ZGVzdC1zZXJ2aWNlLWluc3RhbmNl", metaInAlarm.getId1());
+        assertEquals(DefaultScopeDefine.SERVICE_INSTANCE_RELATION_CATALOG_NAME, metaInAlarm.getScope());
+        assertEquals("from-service-instance of from-service to dest-service-instance of dest-service", metaInAlarm.getName());
+        assertEquals(DefaultScopeDefine.SERVICE_INSTANCE_RELATION, metaInAlarm.getScopeId());
+    }
+
+    @Test
+    public void testNotifyWithEndpointRelationCatalog() {
+        prepareNotify();
+
+        String metricsName = "endpoint-relation-metrics";
+        when(metadata.getMetricsName()).thenReturn(metricsName);
+        when(DefaultScopeDefine.inEndpointRelationCatalog(0)).thenReturn(true);
+        final String serviceInstanceRelationId = IDManager.EndpointID.buildRelationId(new IDManager.EndpointID.EndpointRelationDefine(
+            IDManager.ServiceID.buildId("from-service", true), "/source-path",
+            IDManager.ServiceID.buildId("dest-service", true), "/dest-path"
+        ));
+        when(metadata.getId()).thenReturn(serviceInstanceRelationId);
+
+        ArgumentCaptor<MetaInAlarm> metaCaptor = ArgumentCaptor.forClass(MetaInAlarm.class);
+
+        notifyHandler.notify(metrics);
+        verify(rule).in(metaCaptor.capture(), any());
+
+        MetaInAlarm metaInAlarm = metaCaptor.getValue();
+
+        assertTrue(metaInAlarm instanceof EndpointRelationMetaInAlarm);
+        assertEquals(metricsName, metaInAlarm.getMetricsName());
+        assertEquals("ZnJvbS1zZXJ2aWNl.1_L3NvdXJjZS1wYXRo", metaInAlarm.getId0());
+        assertEquals("ZGVzdC1zZXJ2aWNl.1_L2Rlc3QtcGF0aA==", metaInAlarm.getId1());
+        assertEquals(DefaultScopeDefine.ENDPOINT_RELATION_CATALOG_NAME, metaInAlarm.getScope());
+        assertEquals("/source-path in from-service to /dest-path in dest-service", metaInAlarm.getName());
+        assertEquals(DefaultScopeDefine.ENDPOINT_RELATION, metaInAlarm.getScopeId());
+    }
+
     private void prepareNotify() {
         metadata = mock(MetricsMetaInfo.class);
         when(metadata.getScope()).thenReturn(DefaultScopeDefine.ALL);
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/AlarmMessage.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/AlarmMessage.java
index e47503a..401e023 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/AlarmMessage.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/AlarmMessage.java
@@ -18,15 +18,14 @@
 
 package org.apache.skywalking.oap.server.core.alarm;
 
-import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.Setter;
 
 /**
  * Alarm message represents the details of each alarm.
  */
-@Setter(AccessLevel.PUBLIC)
-@Getter(AccessLevel.PUBLIC)
+@Setter
+@Getter
 public class AlarmMessage {
 
     public static AlarmMessage NONE = new NoAlarm();
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/EndpointMetaInAlarm.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/EndpointMetaInAlarm.java
index cccd674..299c07f 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/EndpointMetaInAlarm.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/EndpointMetaInAlarm.java
@@ -18,21 +18,18 @@
 
 package org.apache.skywalking.oap.server.core.alarm;
 
-import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.Setter;
 import org.apache.skywalking.oap.server.core.Const;
 import org.apache.skywalking.oap.server.core.source.DefaultScopeDefine;
 
-@Getter(AccessLevel.PUBLIC)
-@Setter(AccessLevel.PUBLIC)
+@Getter
+@Setter
 public class EndpointMetaInAlarm extends MetaInAlarm {
     private String metricsName;
 
     private String id;
     private String name;
-    private String[] tags;
-    private String[] properties;
 
     @Override
     public String getScope() {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/ServiceInstanceMetaInAlarm.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/EndpointRelationMetaInAlarm.java
similarity index 61%
copy from oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/ServiceInstanceMetaInAlarm.java
copy to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/EndpointRelationMetaInAlarm.java
index e78d441..c4be140 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/ServiceInstanceMetaInAlarm.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/EndpointRelationMetaInAlarm.java
@@ -18,39 +18,42 @@
 
 package org.apache.skywalking.oap.server.core.alarm;
 
-import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.Setter;
-import org.apache.skywalking.oap.server.core.Const;
+import org.apache.skywalking.oap.server.core.analysis.IDManager;
 import org.apache.skywalking.oap.server.core.source.DefaultScopeDefine;
 
-@Getter(AccessLevel.PUBLIC)
-@Setter(AccessLevel.PUBLIC)
-public class ServiceInstanceMetaInAlarm extends MetaInAlarm {
+@Getter
+@Setter
+public class EndpointRelationMetaInAlarm extends MetaInAlarm {
     private String metricsName;
 
     private String id;
     private String name;
-    private String[] tags;
-    private String[] properties;
 
     @Override
     public String getScope() {
-        return DefaultScopeDefine.SERVICE_INSTANCE_CATALOG_NAME;
+        return DefaultScopeDefine.ENDPOINT_RELATION_CATALOG_NAME;
     }
 
     @Override
     public int getScopeId() {
-        return DefaultScopeDefine.SERVICE_INSTANCE;
+        return DefaultScopeDefine.ENDPOINT_RELATION;
     }
 
     @Override
     public String getId0() {
-        return id;
+        final IDManager.EndpointID.EndpointRelationDefine endpointRelationDefine =
+            IDManager.EndpointID.analysisRelationId(id);
+
+        return IDManager.EndpointID.buildId(endpointRelationDefine.getSourceServiceId(), endpointRelationDefine.getSource());
     }
 
     @Override
     public String getId1() {
-        return Const.EMPTY_STRING;
+        final IDManager.EndpointID.EndpointRelationDefine endpointRelationDefine =
+            IDManager.EndpointID.analysisRelationId(id);
+
+        return IDManager.EndpointID.buildId(endpointRelationDefine.getDestServiceId(), endpointRelationDefine.getDest());
     }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/ServiceInstanceMetaInAlarm.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/ServiceInstanceMetaInAlarm.java
index e78d441..0ec8940 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/ServiceInstanceMetaInAlarm.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/ServiceInstanceMetaInAlarm.java
@@ -18,21 +18,18 @@
 
 package org.apache.skywalking.oap.server.core.alarm;
 
-import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.Setter;
 import org.apache.skywalking.oap.server.core.Const;
 import org.apache.skywalking.oap.server.core.source.DefaultScopeDefine;
 
-@Getter(AccessLevel.PUBLIC)
-@Setter(AccessLevel.PUBLIC)
+@Getter
+@Setter
 public class ServiceInstanceMetaInAlarm extends MetaInAlarm {
     private String metricsName;
 
     private String id;
     private String name;
-    private String[] tags;
-    private String[] properties;
 
     @Override
     public String getScope() {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/ServiceInstanceMetaInAlarm.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/ServiceInstanceRelationMetaInAlarm.java
similarity index 63%
copy from oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/ServiceInstanceMetaInAlarm.java
copy to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/ServiceInstanceRelationMetaInAlarm.java
index e78d441..e3b1d73 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/ServiceInstanceMetaInAlarm.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/ServiceInstanceRelationMetaInAlarm.java
@@ -18,39 +18,42 @@
 
 package org.apache.skywalking.oap.server.core.alarm;
 
-import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.Setter;
-import org.apache.skywalking.oap.server.core.Const;
+import org.apache.skywalking.oap.server.core.analysis.IDManager;
 import org.apache.skywalking.oap.server.core.source.DefaultScopeDefine;
 
-@Getter(AccessLevel.PUBLIC)
-@Setter(AccessLevel.PUBLIC)
-public class ServiceInstanceMetaInAlarm extends MetaInAlarm {
+@Getter
+@Setter
+public class ServiceInstanceRelationMetaInAlarm extends MetaInAlarm {
     private String metricsName;
 
     private String id;
     private String name;
-    private String[] tags;
-    private String[] properties;
 
     @Override
     public String getScope() {
-        return DefaultScopeDefine.SERVICE_INSTANCE_CATALOG_NAME;
+        return DefaultScopeDefine.SERVICE_INSTANCE_RELATION_CATALOG_NAME;
     }
 
     @Override
     public int getScopeId() {
-        return DefaultScopeDefine.SERVICE_INSTANCE;
+        return DefaultScopeDefine.SERVICE_INSTANCE_RELATION;
     }
 
     @Override
     public String getId0() {
-        return id;
+        final IDManager.ServiceInstanceID.ServiceInstanceRelationDefine instanceRelationDefine =
+            IDManager.ServiceInstanceID.analysisRelationId(id);
+
+        return instanceRelationDefine.getSourceId();
     }
 
     @Override
     public String getId1() {
-        return Const.EMPTY_STRING;
+        final IDManager.ServiceInstanceID.ServiceInstanceRelationDefine instanceRelationDefine =
+            IDManager.ServiceInstanceID.analysisRelationId(id);
+
+        return instanceRelationDefine.getDestId();
     }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/ServiceMetaInAlarm.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/ServiceMetaInAlarm.java
index c5698a0..42fc900 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/ServiceMetaInAlarm.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/ServiceMetaInAlarm.java
@@ -18,21 +18,18 @@
 
 package org.apache.skywalking.oap.server.core.alarm;
 
-import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.Setter;
 import org.apache.skywalking.oap.server.core.Const;
 import org.apache.skywalking.oap.server.core.source.DefaultScopeDefine;
 
-@Getter(AccessLevel.PUBLIC)
-@Setter(AccessLevel.PUBLIC)
+@Getter
+@Setter
 public class ServiceMetaInAlarm extends MetaInAlarm {
     private String metricsName;
 
     private String id;
     private String name;
-    private String[] tags;
-    private String[] properties;
 
     @Override
     public String getScope() {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/ServiceInstanceMetaInAlarm.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/ServiceRelationMetaInAlarm.java
similarity index 68%
copy from oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/ServiceInstanceMetaInAlarm.java
copy to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/ServiceRelationMetaInAlarm.java
index e78d441..ce76355 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/ServiceInstanceMetaInAlarm.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/ServiceRelationMetaInAlarm.java
@@ -18,39 +18,38 @@
 
 package org.apache.skywalking.oap.server.core.alarm;
 
-import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.Setter;
-import org.apache.skywalking.oap.server.core.Const;
+import org.apache.skywalking.oap.server.core.analysis.IDManager;
 import org.apache.skywalking.oap.server.core.source.DefaultScopeDefine;
 
-@Getter(AccessLevel.PUBLIC)
-@Setter(AccessLevel.PUBLIC)
-public class ServiceInstanceMetaInAlarm extends MetaInAlarm {
+@Getter
+@Setter
+public class ServiceRelationMetaInAlarm extends MetaInAlarm {
     private String metricsName;
 
     private String id;
     private String name;
-    private String[] tags;
-    private String[] properties;
 
     @Override
     public String getScope() {
-        return DefaultScopeDefine.SERVICE_INSTANCE_CATALOG_NAME;
+        return DefaultScopeDefine.SERVICE_RELATION_CATALOG_NAME;
     }
 
     @Override
     public int getScopeId() {
-        return DefaultScopeDefine.SERVICE_INSTANCE;
+        return DefaultScopeDefine.SERVICE_RELATION;
     }
 
     @Override
     public String getId0() {
-        return id;
+        final IDManager.ServiceID.ServiceRelationDefine relationDefine = IDManager.ServiceID.analysisRelationId(id);
+        return relationDefine.getSourceId();
     }
 
     @Override
     public String getId1() {
-        return Const.EMPTY_STRING;
+        final IDManager.ServiceID.ServiceRelationDefine relationDefine = IDManager.ServiceID.analysisRelationId(id);
+        return relationDefine.getDestId();
     }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/DatabaseAccess.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/DatabaseAccess.java
index 5fd2d87..38b09c2 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/DatabaseAccess.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/DatabaseAccess.java
@@ -24,8 +24,9 @@ import org.apache.skywalking.oap.server.core.analysis.IDManager;
 import org.apache.skywalking.oap.server.core.analysis.NodeType;
 
 import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.DATABASE_ACCESS;
+import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.SERVICE_CATALOG_NAME;
 
-@ScopeDeclaration(id = DATABASE_ACCESS, name = "DatabaseAccess")
+@ScopeDeclaration(id = DATABASE_ACCESS, name = "DatabaseAccess", catalog = SERVICE_CATALOG_NAME)
 @ScopeDefaultColumn.VirtualColumnDefinition(fieldName = "entityId", columnName = "entity_id", isID = true, type = String.class)
 public class DatabaseAccess extends Source {
 
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/DefaultScopeDefine.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/DefaultScopeDefine.java
index b18061f..499d51f 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/DefaultScopeDefine.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/DefaultScopeDefine.java
@@ -73,10 +73,16 @@ public class DefaultScopeDefine {
     public static final String SERVICE_CATALOG_NAME = "SERVICE";
     public static final String SERVICE_INSTANCE_CATALOG_NAME = "SERVICE_INSTANCE";
     public static final String ENDPOINT_CATALOG_NAME = "ENDPOINT";
+    public static final String SERVICE_RELATION_CATALOG_NAME = "SERVICE_RELATION";
+    public static final String SERVICE_INSTANCE_RELATION_CATALOG_NAME = "SERVICE_INSTANCE_RELATION";
+    public static final String ENDPOINT_RELATION_CATALOG_NAME = "ENDPOINT_RELATION";
 
     private static final Map<Integer, Boolean> SERVICE_CATALOG = new HashMap<>();
     private static final Map<Integer, Boolean> SERVICE_INSTANCE_CATALOG = new HashMap<>();
     private static final Map<Integer, Boolean> ENDPOINT_CATALOG = new HashMap<>();
+    private static final Map<Integer, Boolean> SERVICE_RELATION_CATALOG = new HashMap<>();
+    private static final Map<Integer, Boolean> SERVICE_INSTANCE_RELATION_CATALOG = new HashMap<>();
+    private static final Map<Integer, Boolean> ENDPOINT_RELATION_CATALOG = new HashMap<>();
 
     @Setter
     private static boolean ACTIVE_EXTRA_MODEL_COLUMNS = false;
@@ -169,6 +175,15 @@ public class DefaultScopeDefine {
             case ENDPOINT_CATALOG_NAME:
                 ENDPOINT_CATALOG.put(id, Boolean.TRUE);
                 break;
+            case SERVICE_RELATION_CATALOG_NAME:
+                SERVICE_RELATION_CATALOG.put(id, Boolean.TRUE);
+                break;
+            case SERVICE_INSTANCE_RELATION_CATALOG_NAME:
+                SERVICE_INSTANCE_RELATION_CATALOG.put(id, Boolean.TRUE);
+                break;
+            case ENDPOINT_RELATION_CATALOG_NAME:
+                ENDPOINT_RELATION_CATALOG.put(id, Boolean.TRUE);
+                break;
         }
     }
 
@@ -240,6 +255,36 @@ public class DefaultScopeDefine {
     }
 
     /**
+     * Check whether current service belongs service relation catalog
+     *
+     * @param scopeId represents an existing scope id.
+     * @return true is current scope set {@link ScopeDeclaration#catalog()} == {@link #SERVICE_RELATION_CATALOG_NAME}
+     */
+    public static boolean inServiceRelationCatalog(int scopeId) {
+        return SERVICE_RELATION_CATALOG.containsKey(scopeId);
+    }
+
+    /**
+     * Check whether current service belongs service instance relation catalog
+     *
+     * @param scopeId represents an existing scope id.
+     * @return true is current scope set {@link ScopeDeclaration#catalog()} == {@link #SERVICE_INSTANCE_RELATION_CATALOG_NAME}
+     */
+    public static boolean inServiceInstanceRelationCatalog(int scopeId) {
+        return SERVICE_INSTANCE_RELATION_CATALOG.containsKey(scopeId);
+    }
+
+    /**
+     * Check whether current service belongs endpoint relation catalog
+     *
+     * @param scopeId represents an existing scope id.
+     * @return true is current scope set {@link ScopeDeclaration#catalog()} == {@link #ENDPOINT_RELATION_CATALOG_NAME}
+     */
+    public static boolean inEndpointRelationCatalog(int scopeId) {
+        return ENDPOINT_RELATION_CATALOG.containsKey(scopeId);
+    }
+
+    /**
      * Get the default columns defined in Scope. All those columns will forward to persistent entity.
      *
      * @param scopeName of the default columns
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 801b473..09bb693 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
@@ -24,8 +24,9 @@ import org.apache.skywalking.oap.server.core.analysis.IDManager;
 import org.apache.skywalking.oap.server.core.analysis.NodeType;
 
 import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.ENDPOINT_RELATION;
+import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.ENDPOINT_RELATION_CATALOG_NAME;
 
-@ScopeDeclaration(id = ENDPOINT_RELATION, name = "EndpointRelation")
+@ScopeDeclaration(id = ENDPOINT_RELATION, name = "EndpointRelation", catalog = ENDPOINT_RELATION_CATALOG_NAME)
 @ScopeDefaultColumn.VirtualColumnDefinition(fieldName = "entityId", columnName = "entity_id", isID = true, type = String.class)
 public class EndpointRelation extends Source {
 
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ScopeDefaultColumn.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ScopeDefaultColumn.java
index 67585ca..f2f9633 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ScopeDefaultColumn.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ScopeDefaultColumn.java
@@ -22,14 +22,13 @@ import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
-import lombok.AccessLevel;
 import lombok.Getter;
 
 /**
  * Define the default columns of source scope. These columns pass down into the persistent entity(OAL metrics entity)
  * automatically.
  */
-@Getter(AccessLevel.PUBLIC)
+@Getter
 public class ScopeDefaultColumn {
     private String fieldName;
     private String columnName;
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 83e2975..78ae627 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
@@ -25,8 +25,9 @@ import org.apache.skywalking.oap.server.core.analysis.IDManager;
 import org.apache.skywalking.oap.server.core.analysis.NodeType;
 
 import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.SERVICE_INSTANCE_RELATION;
+import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.SERVICE_INSTANCE_RELATION_CATALOG_NAME;
 
-@ScopeDeclaration(id = SERVICE_INSTANCE_RELATION, name = "ServiceInstanceRelation")
+@ScopeDeclaration(id = SERVICE_INSTANCE_RELATION, name = "ServiceInstanceRelation", catalog = SERVICE_INSTANCE_RELATION_CATALOG_NAME)
 @ScopeDefaultColumn.VirtualColumnDefinition(fieldName = "entityId", columnName = "entity_id", isID = true, type = String.class)
 public class ServiceInstanceRelation extends Source {
     private String entityId;
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 40ef19a..4fb40aa 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
@@ -25,8 +25,9 @@ import org.apache.skywalking.oap.server.core.analysis.IDManager;
 import org.apache.skywalking.oap.server.core.analysis.NodeType;
 
 import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.SERVICE_RELATION;
+import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.SERVICE_RELATION_CATALOG_NAME;
 
-@ScopeDeclaration(id = SERVICE_RELATION, name = "ServiceRelation")
+@ScopeDeclaration(id = SERVICE_RELATION, name = "ServiceRelation", catalog = SERVICE_RELATION_CATALOG_NAME)
 @ScopeDefaultColumn.VirtualColumnDefinition(fieldName = "entityId", columnName = "entity_id", isID = true, type = String.class)
 public class ServiceRelation extends Source {
     private String entityId;
diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/GraphQLQueryConfig.java b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/GraphQLQueryConfig.java
index dddfe80..8f89e6b 100644
--- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/GraphQLQueryConfig.java
+++ b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/GraphQLQueryConfig.java
@@ -27,7 +27,7 @@ import org.apache.skywalking.oap.server.library.module.ModuleConfig;
  * The config of {@code query.graphql}.
  */
 @Getter(AccessLevel.PACKAGE)
-@Setter(AccessLevel.PUBLIC)
+@Setter
 public class GraphQLQueryConfig extends ModuleConfig {
     private String path;
 }