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 2019/02/26 05:43:21 UTC

[incubator-skywalking] branch master updated: Improve OAP extendibility (#2288)

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/incubator-skywalking.git


The following commit(s) were added to refs/heads/master by this push:
     new fb62025  Improve OAP extendibility (#2288)
fb62025 is described below

commit fb62025da832ba04a83b45a5437fe9728ecfe8e3
Author: 吴晟 Wu Sheng <wu...@foxmail.com>
AuthorDate: Tue Feb 26 13:43:14 2019 +0800

    Improve OAP extendibility (#2288)
    
    * Make scope meta configurable.
    
    * Fix test cases in ci.
    
    * Change step 1
    
    * Refactor step 2
    
    * Other compile issue done. Prepare the generator changes.
    
    * Revert some wrong changes to Istio receiver.
    
    * Step 3, make compile pass.
    
    * Try to make CI passed.
    
    * Add a check.
    
    * Fix generated code style
    
    * Provide new and extendable dispatcher generator tool
    
    * Fix startup.
    
    * Can't guarantee the dispatchers are always existing. Put explicit comments at there to avoid confusion, since this is different with old version.
    
    * Fix a H2 query for endpoint search.
    
    * Fix a wrong mysql alarm query.
    
    * Provide new document and `generate-tool-grammer` module.
    
    * Add missing last section of document.
    
    * Fix typo
    
    * Relocate the @ScopeDeclaration annotation, make it more sense. Also remove the useless @SourceType annotation. And adjust document for these changes
    
    * ScopeDeclaration can be used once for each class only, now.
---
 docs/en/guides/How-to-build.md                     |   2 +-
 docs/en/guides/README.md                           |   7 +-
 docs/en/guides/source-extension.md                 |  63 ++++++++
 docs/others/cn/guides/How-to-build.md              |   2 +-
 .../pom.xml                                        |  26 +---
 .../apache/skywalking/oal/tool/grammar/OALLexer.g4 |   0
 .../skywalking/oal/tool/grammar/OALParser.g4       |   0
 oap-server/generate-tool/pom.xml                   |  23 +--
 .../java/org/apache/skywalking/oal/tool/Main.java  |  17 +++
 .../skywalking/oal/tool/meta/MetaReader.java}      |  18 +--
 .../skywalking/oal/tool/meta/MetaSettings.java}    |  14 +-
 .../skywalking/oal/tool/meta/ScopeMeta.java}       |  17 +--
 .../oal/tool/output/AllDispatcherContext.java}     |  15 +-
 .../oal/tool/output/DispatcherContext.java         |  19 +--
 .../skywalking/oal/tool/output/FileGenerator.java  | 160 +++------------------
 .../skywalking/oal/tool/parser/AnalysisResult.java |   2 +
 .../skywalking/oal/tool/parser/OALListener.java    |   2 +
 .../skywalking/oal/tool/parser/SourceColumn.java   |  52 +++++++
 .../oal/tool/parser/SourceColumnsFactory.java      |  91 ++----------
 .../DatabaseAccessDispatcherTemplate.ftl           |  66 ---------
 ...spatcherTemplate.ftl => DispatcherTemplate.ftl} |  16 +--
 .../code-templates/EndpointDispatcherTemplate.ftl  |  67 ---------
 .../EndpointRelationDispatcherTemplate.ftl         |  66 ---------
 .../code-templates/IndicatorImplementor.ftl        |   5 +-
 .../code-templates/ServiceDispatcherTemplate.ftl   |  66 ---------
 .../ServiceInstanceDispatcherTemplate.ftl          |  66 ---------
 .../ServiceInstanceJVMCPUDispatcherTemplate.ftl    |  66 ---------
 .../ServiceInstanceJVMGCDispatcherTemplate.ftl     |  66 ---------
 .../ServiceInstanceJVMMemoryDispatcherTemplate.ftl |  66 ---------
 ...viceInstanceJVMMemoryPoolDispatcherTemplate.ftl |  66 ---------
 .../ServiceInstanceRelationDispatcherTemplate.ftl  |  66 ---------
 .../ServiceRelationDispatcherTemplate.ftl          |  66 ---------
 .../skywalking/oal/tool/meta/MetaReaderTest.java   |  43 ++++++
 .../oal/tool/meta/MockSourceColumnsFactory.java}   |   9 +-
 .../oal/tool/output/FileGeneratorTest.java         |  12 +-
 .../oal/tool/parser/DeepAnalysisTest.java          |   7 +-
 .../oal/tool/parser/ScriptParserTest.java          |  18 ++-
 .../IndicatorImplementorExpected.java              |   5 +-
 .../src/test/resources/scope-meta.yml              | 136 ++++++++++++++++++
 .../src/main/resources/generator-scope-meta.yml    | 136 ++++++++++++++++++
 oap-server/pom.xml                                 |   1 +
 .../server/core/alarm/provider/NotifyHandler.java  |  10 +-
 .../server/core/alarm/provider/RunningRule.java    |   7 +-
 .../alarm/provider/AlarmMessageFormatterTest.java  |  12 +-
 .../core/alarm/provider/RunningRuleTest.java       |  26 ++--
 .../core/alarm/provider/WebhookCallbackTest.java   |  37 ++---
 .../oap/server/core/CoreModuleProvider.java        |  10 +-
 .../oap/server/core/alarm/AlarmEntrance.java       |  16 +--
 .../oap/server/core/alarm/AlarmMessage.java        |   3 +-
 .../oap/server/core/alarm/AlarmMeta.java           |  10 +-
 .../oap/server/core/alarm/AlarmRecord.java         |   7 +-
 .../core/alarm/AlarmStandardPersistence.java       |   2 +-
 .../oap/server/core/alarm/EndpointMetaInAlarm.java |   6 +-
 .../oap/server/core/alarm/MetaInAlarm.java         |   5 +-
 .../core/alarm/ServiceInstanceMetaInAlarm.java     |   6 +-
 .../oap/server/core/alarm/ServiceMetaInAlarm.java  |   6 +-
 .../server/core/analysis/DispatcherManager.java    |  35 ++---
 .../manual/database/TopNDatabaseStatement.java     |   5 +-
 .../EndpointRelationServerSideIndicator.java       |   4 +-
 .../analysis/manual/segment/SegmentRecord.java     |   4 +-
 .../ServiceRelationClientSideIndicator.java        |   4 +-
 .../ServiceRelationServerSideIndicator.java        |   4 +-
 .../oap/server/core/annotation/AnnotationScan.java |   4 +-
 .../oap/server/core/query/AlarmQueryService.java   |   5 +-
 .../oap/server/core/query/entity/AlarmMessage.java |   2 +-
 .../oap/server/core/query/entity/Scope.java        |  57 ++++++++
 .../server/core/register/EndpointInventory.java    |   7 +-
 .../core/register/NetworkAddressInventory.java     |   7 +-
 .../core/register/ServiceInstanceInventory.java    |   7 +-
 .../oap/server/core/register/ServiceInventory.java |   7 +-
 .../core/register/worker/InventoryProcess.java     |  20 +--
 .../register/worker/RegisterPersistentWorker.java  |  12 +-
 .../skywalking/oap/server/core/source/All.java     |  13 +-
 .../oap/server/core/source/DatabaseAccess.java     |  10 +-
 .../server/core/source/DatabaseSlowStatement.java  |   9 +-
 .../oap/server/core/source/DefaultScopeDefine.java | 100 +++++++++++++
 .../oap/server/core/source/Endpoint.java           |   9 +-
 .../oap/server/core/source/EndpointRelation.java   |   7 +-
 .../skywalking/oap/server/core/source/Scope.java   |  35 -----
 .../source/{Source.java => ScopeDeclaration.java}  |  17 +--
 .../skywalking/oap/server/core/source/Segment.java |   9 +-
 .../skywalking/oap/server/core/source/Service.java |   9 +-
 .../oap/server/core/source/ServiceInstance.java    |   9 +-
 .../server/core/source/ServiceInstanceJVMCPU.java  |   9 +-
 .../server/core/source/ServiceInstanceJVMGC.java   |   9 +-
 .../core/source/ServiceInstanceJVMMemory.java      |   7 +-
 .../core/source/ServiceInstanceJVMMemoryPool.java  |   7 +-
 .../core/source/ServiceInstanceRelation.java       |   7 +-
 .../oap/server/core/source/ServiceRelation.java    |   7 +-
 .../skywalking/oap/server/core/source/Source.java  |   2 +-
 .../oap/server/core/storage/IRegisterLockDAO.java  |   5 +-
 .../annotation/StorageAnnotationListener.java      |  21 ++-
 .../core/storage/annotation/StorageEntity.java     |   6 +-
 .../annotation/StorageEntityAnnotationUtils.java   |   5 +-
 .../oap/server/core/storage/model/Model.java       |  10 +-
 .../server/core/storage/query/IAlarmQueryDAO.java  |   5 +-
 .../oap/query/graphql/resolver/AlarmQuery.java     |   5 +-
 .../elasticsearch/lock/RegisterLockDAOImpl.java    |   5 +-
 .../elasticsearch/lock/RegisterLockInstaller.java  |   5 +-
 .../elasticsearch/query/AlarmQueryEsDAO.java       |  11 +-
 .../plugin/jdbc/h2/dao/H2AlarmQueryDAO.java        |   8 +-
 .../plugin/jdbc/h2/dao/H2MetadataQueryDAO.java     |   2 +-
 .../plugin/jdbc/h2/dao/H2RegisterLockDAO.java      |   9 +-
 .../jdbc/h2/dao/H2RegisterLockInstaller.java       |   6 +-
 .../plugin/jdbc/mysql/MySQLAlarmQueryDAO.java      |  11 +-
 .../plugin/jdbc/mysql/MySQLTableInstaller.java     |  20 +--
 .../PreventRedistributionMySQLDriverTest.java      |   2 +-
 107 files changed, 1041 insertions(+), 1362 deletions(-)

diff --git a/docs/en/guides/How-to-build.md b/docs/en/guides/How-to-build.md
index 27f8612..80c8ccb 100644
--- a/docs/en/guides/How-to-build.md
+++ b/docs/en/guides/How-to-build.md
@@ -30,7 +30,7 @@ For each official Apache release, there is a complete and independent source cod
     * `grpc-java` and `java` folders in **apm-protocol/apm-network/target/generated-sources/protobuf**
     * `grpc-java` and `java` folders in **oap-server/server-core/target/generated-sources/protobuf**
     * `grpc-java` and `java` folders in **oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/target/generated-sources/protobuf**
-    * `antlr4` folder in **oap-server/generate-tool/target/generated-sources**
+    * `antlr4` folder in **oap-server/generate-tool-grammar/target/generated-sources**
     * `oal` folder in **oap-server/generated-analysis/target/generated-sources**
     
 ## Setup your Eclipse IDE
diff --git a/docs/en/guides/README.md b/docs/en/guides/README.md
index af3c192..7d406e8 100644
--- a/docs/en/guides/README.md
+++ b/docs/en/guides/README.md
@@ -27,7 +27,7 @@ All the following channels are open to the community, you could choose the way y
 As a develop, first step, read [Compiling Guide](How-to-build.md). It teaches developer how to build the project in local.
 
 ### Project Extensions
-SkyWalking project supports many ways to extends existing features. If you are interesting in these ways,
+SkyWalking project supports many ways to extend existing features. If you are interesting in these ways,
 read the following guides.
 
 - [Java agent plugin development guide](Java-Plugin-Development-Guide.md).
@@ -37,6 +37,11 @@ and private plugin developer should read this.
 - [Storage extension development guide](storage-extention.md). Help potential contributors to build a new 
 storage implementor besides the official.
 - [Customize analysis by oal script](write-oal.md). Guide you to use oal script to make your own metric available.
+- [Source and scope extension for new metric](source-extension.md). If you want to analysis a new metric, which SkyWalking
+haven't provide. You need to 
+add a new receiver rather than choosing [existed receiver](../setup/backend/backend-receivers.md).
+At that moment, 
+you most likely need to add a new source and scope. This document will teach you how to do.
 - [Backend Inventory entity extension](inventory-extension.md). If you want to extend SkyWalking inventory entities, and
 want to push upstream back to our Apache OSS repo, please read these principles.
 
diff --git a/docs/en/guides/source-extension.md b/docs/en/guides/source-extension.md
new file mode 100644
index 0000000..8338b5e
--- /dev/null
+++ b/docs/en/guides/source-extension.md
@@ -0,0 +1,63 @@
+# Source and Scope extension for new metric
+From [OAL scope introduction](../concepts-and-designs/oal.md#scope), you should already have understood what the scope is.
+At here, as you want to do more extension, you need understand deeper, which is the **Source**. 
+
+**Source** and **Scope** are binding concepts. **Scope** declare the id(int) and name, **Source** declare the attributes.
+Please follow these steps to create a new Source and Scope.
+
+1. In the OAP core module, it provide **SourceReceiver** internal service.
+```java
+public interface SourceReceiver extends Service {
+    void receive(Source source);
+}
+```
+
+2. All analysis data must be a **org.apache.skywalking.oap.server.core.source.Source** sub class,
+tagged by `@SourceType` annotation, and in `org.apache.skywalking` package.
+Then it could be supported by OAL script and OAP core.
+
+Such as existed source, **Service**.
+```java
+@ScopeDeclaration(id = SERVICE, name = "Service")
+public class Service extends Source {
+    @Override public int scope() {
+        return DefaultScopeDefine.SERVICE;
+    }
+
+    @Override public String getEntityId() {
+        return String.valueOf(id);
+    }
+
+    @Getter @Setter private int id;
+    @Getter @Setter private String name;
+    @Getter @Setter private String serviceInstanceName;
+    @Getter @Setter private String endpointName;
+    @Getter @Setter private int latency;
+    @Getter @Setter private boolean status;
+    @Getter @Setter private int responseCode;
+    @Getter @Setter private RequestType type;
+}
+```
+
+3. The `scope()` method in Source, returns an ID, which is not a random number. This ID need to be declared through 
+`@ScopeDeclaration` annotation too. The ID in `@ScopeDeclaration` and ID in `scope()` method should be same for this Source.
+
+4. The `String getEntityId()` method in Source, requests the return value representing unique entity which the scope related. 
+Such as,
+in this Service scope, the id is service id, representing a particular service, like `Order` service.
+This value is used in [OAL group mechanism](../concepts-and-designs/oal.md#group).
+
+5. Add scope name as keyword to oal grammar definition file, `OALLexer.g4`, which is at `antlr4` folder of `generate-tool-grammar` module.
+
+6. Add scope name keyword as source in parser definition file, `OALParser.g4`, which is at same fold of `OALLexer.g4`.
+
+7. Set the default columns for new scope, at `generator-scope-meta.yml` file in `generated-analysis/src/main/resources`.
+If you want to understand why need these columns, you have to understand all existing query(s). But there is an easy way, 
+follow other existing scopes. Such as, if you are adding metric, connection number for service instance, follow existing `ServiceInstance`. 
+
+___
+After you done all of these, you could build a receiver, which do
+1. Get the original data of the metric,
+1. Build the source, send into `SourceReceiver`.
+1. Write your whole OAL scripts.
+1. Repackage the project.
\ No newline at end of file
diff --git a/docs/others/cn/guides/How-to-build.md b/docs/others/cn/guides/How-to-build.md
index 65cb6e0..b501e69 100644
--- a/docs/others/cn/guides/How-to-build.md
+++ b/docs/others/cn/guides/How-to-build.md
@@ -30,7 +30,7 @@
     * **apm-protocol/apm-network/target/generated-sources/protobuf** 文件夹下的`grpc-java` 和 `java`
     * **oap-server/server-core/target/generated-sources/protobuf** 文件夹下的`grpc-java` 和 `java`
     * **oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/target/generated-sources/protobuf** 文件夹下的`grpc-java` 和 `java`
-    * **oap-server/generate-tool/target/generated-sources** 文件夹下的 `antlr4`
+    * **oap-server/generate-tool-grammar/target/generated-sources** 文件夹下的 `antlr4`
     * **oap-server/generated-analysis/target/generated-sources** 文件夹下的 `oal`
     
 ## 设置Eclipse IDE
diff --git a/oap-server/generate-tool/pom.xml b/oap-server/generate-tool-grammar/pom.xml
similarity index 64%
copy from oap-server/generate-tool/pom.xml
copy to oap-server/generate-tool-grammar/pom.xml
index e562a41..72a3537 100644
--- a/oap-server/generate-tool/pom.xml
+++ b/oap-server/generate-tool-grammar/pom.xml
@@ -17,7 +17,9 @@
   ~
   -->
 
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
         <artifactId>oap-server</artifactId>
         <groupId>org.apache.skywalking</groupId>
@@ -25,34 +27,14 @@
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>generate-tool</artifactId>
+    <artifactId>generate-tool-grammar</artifactId>
 
     <dependencies>
         <dependency>
-            <groupId>org.apache.skywalking</groupId>
-            <artifactId>server-core</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
             <groupId>org.antlr</groupId>
             <artifactId>antlr4</artifactId>
             <version>4.7.1</version>
         </dependency>
-        <dependency>
-            <groupId>commons-cli</groupId>
-            <artifactId>commons-cli</artifactId>
-            <version>1.4</version>
-        </dependency>
-        <dependency>
-            <groupId>org.projectlombok</groupId>
-            <artifactId>lombok</artifactId>
-            <version>1.18.0</version>
-        </dependency>
-        <dependency>
-            <groupId>org.freemarker</groupId>
-            <artifactId>freemarker</artifactId>
-            <version>2.3.28</version>
-        </dependency>
     </dependencies>
 
     <build>
diff --git a/oap-server/generate-tool/src/main/antlr4/org/apache/skywalking/oal/tool/grammar/OALLexer.g4 b/oap-server/generate-tool-grammar/src/main/antlr4/org/apache/skywalking/oal/tool/grammar/OALLexer.g4
similarity index 100%
rename from oap-server/generate-tool/src/main/antlr4/org/apache/skywalking/oal/tool/grammar/OALLexer.g4
rename to oap-server/generate-tool-grammar/src/main/antlr4/org/apache/skywalking/oal/tool/grammar/OALLexer.g4
diff --git a/oap-server/generate-tool/src/main/antlr4/org/apache/skywalking/oal/tool/grammar/OALParser.g4 b/oap-server/generate-tool-grammar/src/main/antlr4/org/apache/skywalking/oal/tool/grammar/OALParser.g4
similarity index 100%
rename from oap-server/generate-tool/src/main/antlr4/org/apache/skywalking/oal/tool/grammar/OALParser.g4
rename to oap-server/generate-tool-grammar/src/main/antlr4/org/apache/skywalking/oal/tool/grammar/OALParser.g4
diff --git a/oap-server/generate-tool/pom.xml b/oap-server/generate-tool/pom.xml
index e562a41..538c296 100644
--- a/oap-server/generate-tool/pom.xml
+++ b/oap-server/generate-tool/pom.xml
@@ -34,6 +34,11 @@
             <version>${project.version}</version>
         </dependency>
         <dependency>
+            <groupId>org.apache.skywalking</groupId>
+            <artifactId>generate-tool-grammar</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
             <groupId>org.antlr</groupId>
             <artifactId>antlr4</artifactId>
             <version>4.7.1</version>
@@ -54,22 +59,4 @@
             <version>2.3.28</version>
         </dependency>
     </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.antlr</groupId>
-                <artifactId>antlr4-maven-plugin</artifactId>
-                <version>4.7.1</version>
-                <executions>
-                    <execution>
-                        <id>antlr</id>
-                        <goals>
-                            <goal>antlr4</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
 </project>
\ No newline at end of file
diff --git a/oap-server/generate-tool/src/main/java/org/apache/skywalking/oal/tool/Main.java b/oap-server/generate-tool/src/main/java/org/apache/skywalking/oal/tool/Main.java
index 68d99b4..3c960d7 100644
--- a/oap-server/generate-tool/src/main/java/org/apache/skywalking/oal/tool/Main.java
+++ b/oap-server/generate-tool/src/main/java/org/apache/skywalking/oal/tool/Main.java
@@ -22,17 +22,25 @@ import freemarker.template.TemplateException;
 import java.io.*;
 import java.util.List;
 import org.apache.skywalking.apm.util.StringUtil;
+import org.apache.skywalking.oal.tool.meta.*;
 import org.apache.skywalking.oal.tool.output.FileGenerator;
 import org.apache.skywalking.oal.tool.parser.*;
+import org.apache.skywalking.oap.server.core.annotation.AnnotationScan;
+import org.apache.skywalking.oap.server.core.source.DefaultScopeDefine;
 
 public class Main {
 
     public static void main(String[] args) throws IOException, TemplateException {
+        AnnotationScan scopeScan = new AnnotationScan();
+        scopeScan.registerListener(new DefaultScopeDefine.Listener());
+        scopeScan.scan(null);
+
         String modulePath = args[0];
 
         String scriptFilePath = StringUtil.join(File.separatorChar, modulePath, "src", "main", "resources", "official_analysis.oal");
         String outputPath = StringUtil.join(File.separatorChar, modulePath, "..", "generated-analysis", "target", "generated-sources", "oal",
             "org", "apache", "skywalking", "oap", "server", "core", "analysis");
+        String metaFilePath = StringUtil.join(File.separatorChar, modulePath, "src", "main", "resources", "generator-scope-meta.yml");
 
         Indicators.init();
 
@@ -41,6 +49,15 @@ public class Main {
             throw new IllegalArgumentException("OAL script file [" + scriptFilePath + "] doesn't exist");
         }
 
+        File metaFile = new File(metaFilePath);
+        if (!metaFile.exists()) {
+            throw new IllegalArgumentException("Generator meta file [" + metaFilePath + "] doesn't exist");
+        }
+
+        MetaReader reader = new MetaReader();
+        MetaSettings metaSettings = reader.read(new FileInputStream(metaFile));
+        SourceColumnsFactory.setSettings(metaSettings);
+
         ScriptParser scriptParser = ScriptParser.createFromFile(scriptFilePath);
         List<AnalysisResult> analysisResults = scriptParser.parse();
 
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Source.java b/oap-server/generate-tool/src/main/java/org/apache/skywalking/oal/tool/meta/MetaReader.java
similarity index 69%
copy from oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Source.java
copy to oap-server/generate-tool/src/main/java/org/apache/skywalking/oal/tool/meta/MetaReader.java
index 5e6ab35..8a0f9de 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Source.java
+++ b/oap-server/generate-tool/src/main/java/org/apache/skywalking/oal/tool/meta/MetaReader.java
@@ -16,17 +16,19 @@
  *
  */
 
-package org.apache.skywalking.oap.server.core.source;
+package org.apache.skywalking.oal.tool.meta;
 
-import lombok.*;
+import java.io.InputStream;
+import org.yaml.snakeyaml.Yaml;
 
 /**
- * @author peng-yongsheng
+ * @author wusheng
  */
-public abstract class Source {
-    public abstract Scope scope();
+public class MetaReader {
+    public MetaSettings read(InputStream settingFileStream) {
+        Yaml yaml = new Yaml();
+        MetaSettings settings = yaml.loadAs(settingFileStream, MetaSettings.class);
 
-    @Getter @Setter private long timeBucket;
-
-    public abstract String getEntityId();
+        return settings;
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/annotation/SourceType.java b/oap-server/generate-tool/src/main/java/org/apache/skywalking/oal/tool/meta/MetaSettings.java
similarity index 79%
copy from oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/annotation/SourceType.java
copy to oap-server/generate-tool/src/main/java/org/apache/skywalking/oal/tool/meta/MetaSettings.java
index e91854d..7e5ea0a 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/annotation/SourceType.java
+++ b/oap-server/generate-tool/src/main/java/org/apache/skywalking/oal/tool/meta/MetaSettings.java
@@ -16,14 +16,16 @@
  *
  */
 
-package org.apache.skywalking.oap.server.core.source.annotation;
+package org.apache.skywalking.oal.tool.meta;
 
-import java.lang.annotation.*;
+import java.util.List;
+import lombok.*;
 
 /**
- * @author peng-yongsheng
+ * @author wusheng
  */
-@Target(ElementType.TYPE)
-@Retention(RetentionPolicy.SOURCE)
-public @interface SourceType {
+@Setter
+@Getter
+public class MetaSettings {
+    private List<ScopeMeta> scopes;
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Source.java b/oap-server/generate-tool/src/main/java/org/apache/skywalking/oal/tool/meta/ScopeMeta.java
similarity index 75%
copy from oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Source.java
copy to oap-server/generate-tool/src/main/java/org/apache/skywalking/oal/tool/meta/ScopeMeta.java
index 5e6ab35..f027d43 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Source.java
+++ b/oap-server/generate-tool/src/main/java/org/apache/skywalking/oal/tool/meta/ScopeMeta.java
@@ -16,17 +16,18 @@
  *
  */
 
-package org.apache.skywalking.oap.server.core.source;
+package org.apache.skywalking.oal.tool.meta;
 
+import java.util.*;
 import lombok.*;
+import org.apache.skywalking.oal.tool.parser.SourceColumn;
 
 /**
- * @author peng-yongsheng
+ * @author wusheng
  */
-public abstract class Source {
-    public abstract Scope scope();
-
-    @Getter @Setter private long timeBucket;
-
-    public abstract String getEntityId();
+@Setter
+@Getter
+public class ScopeMeta {
+    private String name;
+    private List<SourceColumn> columns = new ArrayList<>();
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/annotation/SourceType.java b/oap-server/generate-tool/src/main/java/org/apache/skywalking/oal/tool/output/AllDispatcherContext.java
similarity index 78%
rename from oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/annotation/SourceType.java
rename to oap-server/generate-tool/src/main/java/org/apache/skywalking/oal/tool/output/AllDispatcherContext.java
index e91854d..ac11fe7 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/annotation/SourceType.java
+++ b/oap-server/generate-tool/src/main/java/org/apache/skywalking/oal/tool/output/AllDispatcherContext.java
@@ -16,14 +16,13 @@
  *
  */
 
-package org.apache.skywalking.oap.server.core.source.annotation;
+package org.apache.skywalking.oal.tool.output;
 
-import java.lang.annotation.*;
+import java.util.*;
+import lombok.*;
 
-/**
- * @author peng-yongsheng
- */
-@Target(ElementType.TYPE)
-@Retention(RetentionPolicy.SOURCE)
-public @interface SourceType {
+@Getter
+@Setter
+public class AllDispatcherContext {
+    private Map<String, DispatcherContext> allContext = new HashMap<>();
 }
diff --git a/oap-server/generate-tool/src/main/java/org/apache/skywalking/oal/tool/output/DispatcherContext.java b/oap-server/generate-tool/src/main/java/org/apache/skywalking/oal/tool/output/DispatcherContext.java
index 9a160f8..8c83610 100644
--- a/oap-server/generate-tool/src/main/java/org/apache/skywalking/oal/tool/output/DispatcherContext.java
+++ b/oap-server/generate-tool/src/main/java/org/apache/skywalking/oal/tool/output/DispatcherContext.java
@@ -22,19 +22,10 @@ import java.util.*;
 import lombok.*;
 import org.apache.skywalking.oal.tool.parser.AnalysisResult;
 
-@Getter(AccessLevel.PUBLIC)
-@Setter(AccessLevel.PUBLIC)
+@Getter
+@Setter
 public class DispatcherContext {
-    private List<AnalysisResult> allIndicators = new LinkedList<>();
-    private List<AnalysisResult> serviceIndicators = new LinkedList<>();
-    private List<AnalysisResult> serviceInstanceIndicators = new LinkedList<>();
-    private List<AnalysisResult> endpointIndicators = new LinkedList<>();
-    private List<AnalysisResult> serviceRelationIndicators = new LinkedList<>();
-    private List<AnalysisResult> serviceInstanceRelationIndicators = new LinkedList<>();
-    private List<AnalysisResult> endpointRelationIndicators = new LinkedList<>();
-    private List<AnalysisResult> serviceInstanceJVMCPUIndicators = new LinkedList<>();
-    private List<AnalysisResult> serviceInstanceJVMMemoryIndicators = new LinkedList<>();
-    private List<AnalysisResult> serviceInstanceJVMMemoryPoolIndicators = new LinkedList<>();
-    private List<AnalysisResult> serviceInstanceJVMGCIndicators = new LinkedList<>();
-    private List<AnalysisResult> databaseAccessIndicators = new LinkedList<>();
+    private String source;
+    private String packageName;
+    private List<AnalysisResult> indicators = new ArrayList<>();
 }
diff --git a/oap-server/generate-tool/src/main/java/org/apache/skywalking/oal/tool/output/FileGenerator.java b/oap-server/generate-tool/src/main/java/org/apache/skywalking/oal/tool/output/FileGenerator.java
index 19bb941..469eb97 100644
--- a/oap-server/generate-tool/src/main/java/org/apache/skywalking/oal/tool/output/FileGenerator.java
+++ b/oap-server/generate-tool/src/main/java/org/apache/skywalking/oal/tool/output/FileGenerator.java
@@ -27,7 +27,7 @@ public class FileGenerator {
     private List<AnalysisResult> results;
     private String outputPath;
     private Configuration configuration;
-    private DispatcherContext dispatcherContext;
+    private AllDispatcherContext allDispatcherContext;
 
     public FileGenerator(List<AnalysisResult> results, String outputPath) {
         this.results = results;
@@ -35,61 +35,19 @@ public class FileGenerator {
         configuration = new Configuration(new Version("2.3.28"));
         configuration.setEncoding(Locale.ENGLISH, "UTF-8");
         configuration.setClassLoaderForTemplateLoading(FileGenerator.class.getClassLoader(), "/code-templates");
-        this.toDispatchers();
+        allDispatcherContext = new AllDispatcherContext();
+        buildDispatcherContext();
     }
 
     public void generate() throws IOException, TemplateException {
         for (AnalysisResult result : results) {
             generate(result, "Indicator.java", writer -> generateIndicatorImplementor(result, writer));
-        }
-
-        File file = new File(outputPath, "generated/all/AllDispatcher.java");
-        createFile(file);
-        this.generateAllDispatcher(new FileWriter(file));
-
-        file = new File(outputPath, "generated/service/ServiceDispatcher.java");
-        createFile(file);
-        this.generateServiceDispatcher(new FileWriter(file));
-
-        file = new File(outputPath, "generated/databaseaccess/DatabaseAccessDispatcher.java");
-        createFile(file);
-        this.generateDatabaseAccessDispatcher(new FileWriter(file));
-
-        file = new File(outputPath, "generated/servicerelation/ServiceRelationDispatcher.java");
-        createFile(file);
-        this.generateServiceRelationDispatcher(new FileWriter(file));
-
-        file = new File(outputPath, "generated/endpoint/EndpointDispatcher.java");
-        createFile(file);
-        this.generateEndpointDispatcher(new FileWriter(file));
-
-        file = new File(outputPath, "generated/endpointrelation/EndpointRelationDispatcher.java");
-        createFile(file);
-        this.generateEndpointRelationDispatcher(new FileWriter(file));
 
-        file = new File(outputPath, "generated/serviceinstance/ServiceInstanceDispatcher.java");
-        createFile(file);
-        this.generateServiceInstanceDispatcher(new FileWriter(file));
-
-        file = new File(outputPath, "generated/serviceinstancerelation/ServiceInstanceRelationDispatcher.java");
-        createFile(file);
-        this.generateServiceInstanceRelationDispatcher(new FileWriter(file));
-
-        file = new File(outputPath, "generated/serviceinstancejvmcpu/ServiceInstanceJVMCPUDispatcher.java");
-        createFile(file);
-        this.generateServiceInstanceJVMCPUDispatcher(new FileWriter(file));
-
-        file = new File(outputPath, "generated/serviceinstancejvmmemory/ServiceInstanceJVMMemoryDispatcher.java");
-        createFile(file);
-        this.generateServiceInstanceJVMMemoryDispatcher(new FileWriter(file));
-
-        file = new File(outputPath, "generated/serviceinstancejvmmemorypool/ServiceInstanceJVMMemoryPoolDispatcher.java");
-        createFile(file);
-        this.generateServiceInstanceJVMMemoryPoolDispatcher(new FileWriter(file));
-
-        file = new File(outputPath, "generated/serviceinstancejvmgc/ServiceInstanceJVMGCDispatcher.java");
-        createFile(file);
-        this.generateServiceInstanceJVMGCDispatcher(new FileWriter(file));
+            String scopeName = result.getSourceName();
+            File file = new File(outputPath, "generated/" + scopeName.toLowerCase() + "/" + scopeName + "Dispatcher.java");
+            createFile(file);
+            generateDispatcher(result, new FileWriter(file));
+        }
     }
 
     private void generate(AnalysisResult result, String fileSuffix,
@@ -123,98 +81,26 @@ public class FileGenerator {
         configuration.getTemplate("IndicatorImplementor.ftl").process(result, output);
     }
 
-    void generateAllDispatcher(Writer output) throws IOException, TemplateException {
-        configuration.getTemplate("AllDispatcherTemplate.ftl").process(dispatcherContext, output);
-    }
-
-    void generateServiceDispatcher(Writer output) throws IOException, TemplateException {
-        configuration.getTemplate("ServiceDispatcherTemplate.ftl").process(dispatcherContext, output);
-    }
-
-    void generateDatabaseAccessDispatcher(Writer output) throws IOException, TemplateException {
-        configuration.getTemplate("DatabaseAccessDispatcherTemplate.ftl").process(dispatcherContext, output);
-    }
-
-    void generateServiceRelationDispatcher(Writer output) throws IOException, TemplateException {
-        configuration.getTemplate("ServiceRelationDispatcherTemplate.ftl").process(dispatcherContext, output);
-    }
-
-    void generateEndpointDispatcher(Writer output) throws IOException, TemplateException {
-        configuration.getTemplate("EndpointDispatcherTemplate.ftl").process(dispatcherContext, output);
-    }
-
-    void generateEndpointRelationDispatcher(Writer output) throws IOException, TemplateException {
-        configuration.getTemplate("EndpointRelationDispatcherTemplate.ftl").process(dispatcherContext, output);
-    }
-
-    void generateServiceInstanceDispatcher(Writer output) throws IOException, TemplateException {
-        configuration.getTemplate("ServiceInstanceDispatcherTemplate.ftl").process(dispatcherContext, output);
-    }
-
-    void generateServiceInstanceRelationDispatcher(Writer output) throws IOException, TemplateException {
-        configuration.getTemplate("ServiceInstanceRelationDispatcherTemplate.ftl").process(dispatcherContext, output);
-    }
-
-    void generateServiceInstanceJVMCPUDispatcher(Writer output) throws IOException, TemplateException {
-        configuration.getTemplate("ServiceInstanceJVMCPUDispatcherTemplate.ftl").process(dispatcherContext, output);
-    }
-
-    void generateServiceInstanceJVMMemoryDispatcher(Writer output) throws IOException, TemplateException {
-        configuration.getTemplate("ServiceInstanceJVMMemoryDispatcherTemplate.ftl").process(dispatcherContext, output);
-    }
-
-    void generateServiceInstanceJVMMemoryPoolDispatcher(Writer output) throws IOException, TemplateException {
-        configuration.getTemplate("ServiceInstanceJVMMemoryPoolDispatcherTemplate.ftl").process(dispatcherContext, output);
-    }
-
-    void generateServiceInstanceJVMGCDispatcher(Writer output) throws IOException, TemplateException {
-        configuration.getTemplate("ServiceInstanceJVMGCDispatcherTemplate.ftl").process(dispatcherContext, output);
+    void generateDispatcher(AnalysisResult result, Writer output) throws IOException, TemplateException {
+        String scopeName = result.getSourceName();
+        DispatcherContext context = allDispatcherContext.getAllContext().get(scopeName);
+        if (context != null) {
+            configuration.getTemplate("DispatcherTemplate.ftl").process(context, output);
+        }
     }
 
-    private void toDispatchers() {
-        dispatcherContext = new DispatcherContext();
+    private void buildDispatcherContext() {
         for (AnalysisResult result : results) {
             String sourceName = result.getSourceName();
-            switch (sourceName) {
-                case "All":
-                    dispatcherContext.getAllIndicators().add(result);
-                    break;
-                case "Service":
-                    dispatcherContext.getServiceIndicators().add(result);
-                    break;
-                case "ServiceRelation":
-                    dispatcherContext.getServiceRelationIndicators().add(result);
-                    break;
-                case "ServiceInstance":
-                    dispatcherContext.getServiceInstanceIndicators().add(result);
-                    break;
-                case "ServiceInstanceRelation":
-                    dispatcherContext.getServiceInstanceRelationIndicators().add(result);
-                    break;
-                case "Endpoint":
-                    dispatcherContext.getEndpointIndicators().add(result);
-                    break;
-                case "EndpointRelation":
-                    dispatcherContext.getEndpointRelationIndicators().add(result);
-                    break;
-                case "ServiceInstanceJVMCPU":
-                    dispatcherContext.getServiceInstanceJVMCPUIndicators().add(result);
-                    break;
-                case "ServiceInstanceJVMMemory":
-                    dispatcherContext.getServiceInstanceJVMMemoryIndicators().add(result);
-                    break;
-                case "ServiceInstanceJVMMemoryPool":
-                    dispatcherContext.getServiceInstanceJVMMemoryPoolIndicators().add(result);
-                    break;
-                case "ServiceInstanceJVMGC":
-                    dispatcherContext.getServiceInstanceJVMGCIndicators().add(result);
-                    break;
-                case "DatabaseAccess":
-                    dispatcherContext.getDatabaseAccessIndicators().add(result);
-                    break;
-                default:
-                    throw new RuntimeException("Unexpected dispatcher");
+
+            DispatcherContext context = allDispatcherContext.getAllContext().get(sourceName);
+            if (context == null) {
+                context = new DispatcherContext();
+                context.setSource(sourceName);
+                context.setPackageName(sourceName.toLowerCase());
+                allDispatcherContext.getAllContext().put(sourceName, context);
             }
+            context.getIndicators().add(result);
         }
     }
 }
diff --git a/oap-server/generate-tool/src/main/java/org/apache/skywalking/oal/tool/parser/AnalysisResult.java b/oap-server/generate-tool/src/main/java/org/apache/skywalking/oal/tool/parser/AnalysisResult.java
index 3711513..716594c 100644
--- a/oap-server/generate-tool/src/main/java/org/apache/skywalking/oal/tool/parser/AnalysisResult.java
+++ b/oap-server/generate-tool/src/main/java/org/apache/skywalking/oal/tool/parser/AnalysisResult.java
@@ -34,6 +34,8 @@ public class AnalysisResult {
 
     private String sourceName;
 
+    private int sourceScopeId;
+
     private String sourceAttribute;
 
     private String aggregationFunctionName;
diff --git a/oap-server/generate-tool/src/main/java/org/apache/skywalking/oal/tool/parser/OALListener.java b/oap-server/generate-tool/src/main/java/org/apache/skywalking/oal/tool/parser/OALListener.java
index 590ecd6..2e585a3 100644
--- a/oap-server/generate-tool/src/main/java/org/apache/skywalking/oal/tool/parser/OALListener.java
+++ b/oap-server/generate-tool/src/main/java/org/apache/skywalking/oal/tool/parser/OALListener.java
@@ -21,6 +21,7 @@ package org.apache.skywalking.oal.tool.parser;
 import java.util.List;
 import org.antlr.v4.runtime.misc.NotNull;
 import org.apache.skywalking.oal.tool.grammar.*;
+import org.apache.skywalking.oap.server.core.source.DefaultScopeDefine;
 
 public class OALListener extends OALParserBaseListener {
     private List<AnalysisResult> results;
@@ -46,6 +47,7 @@ public class OALListener extends OALParserBaseListener {
 
     @Override public void enterSource(OALParser.SourceContext ctx) {
         current.setSourceName(ctx.getText());
+        current.setSourceScopeId(DefaultScopeDefine.valueOf(metricNameFormat(ctx.getText())));
     }
 
     @Override
diff --git a/oap-server/generate-tool/src/main/java/org/apache/skywalking/oal/tool/parser/SourceColumn.java b/oap-server/generate-tool/src/main/java/org/apache/skywalking/oal/tool/parser/SourceColumn.java
index 095147f..74a7706 100644
--- a/oap-server/generate-tool/src/main/java/org/apache/skywalking/oal/tool/parser/SourceColumn.java
+++ b/oap-server/generate-tool/src/main/java/org/apache/skywalking/oal/tool/parser/SourceColumn.java
@@ -18,6 +18,7 @@
 
 package org.apache.skywalking.oal.tool.parser;
 
+import java.util.Objects;
 import lombok.*;
 import org.apache.skywalking.oal.tool.util.ClassMethodUtil;
 
@@ -32,6 +33,9 @@ public class SourceColumn {
     private String fieldSetter;
     private String fieldGetter;
 
+    public SourceColumn() {
+    }
+
     public SourceColumn(String fieldName, String columnName, Class<?> type, boolean isID) {
         this.fieldName = fieldName;
         this.columnName = columnName;
@@ -43,6 +47,35 @@ public class SourceColumn {
         this.fieldSetter = ClassMethodUtil.toSetMethod(fieldName);
     }
 
+    public void setFieldName(String fieldName) {
+        this.fieldName = fieldName;
+        this.fieldGetter = ClassMethodUtil.toGetMethod(fieldName);
+        this.fieldSetter = ClassMethodUtil.toSetMethod(fieldName);
+    }
+
+    public void setTypeName(String typeName) {
+        switch (typeName) {
+            case "int":
+                this.type = int.class;
+                break;
+            case "long":
+                this.type = long.class;
+                break;
+            case "string":
+            case "String":
+                this.type = String.class;
+                typeName = "String";
+            default:
+                try {
+                    this.type = Class.forName(typeName);
+                } catch (ClassNotFoundException e) {
+                    throw new RuntimeException(e);
+                }
+        }
+
+        this.typeName = typeName;
+    }
+
     @Override public String toString() {
         return "SourceColumn{" +
             "fieldName='" + fieldName + '\'' +
@@ -51,4 +84,23 @@ public class SourceColumn {
             ", isID=" + isID +
             '}';
     }
+
+    @Override public boolean equals(Object o) {
+        if (this == o)
+            return true;
+        if (o == null || getClass() != o.getClass())
+            return false;
+        SourceColumn column = (SourceColumn)o;
+        return isID == column.isID &&
+            Objects.equals(fieldName, column.fieldName) &&
+            Objects.equals(columnName, column.columnName) &&
+            Objects.equals(type, column.type) &&
+            Objects.equals(typeName, column.typeName) &&
+            Objects.equals(fieldSetter, column.fieldSetter) &&
+            Objects.equals(fieldGetter, column.fieldGetter);
+    }
+
+    @Override public int hashCode() {
+        return Objects.hash(fieldName, columnName, type, typeName, isID, fieldSetter, fieldGetter);
+    }
 }
diff --git a/oap-server/generate-tool/src/main/java/org/apache/skywalking/oal/tool/parser/SourceColumnsFactory.java b/oap-server/generate-tool/src/main/java/org/apache/skywalking/oal/tool/parser/SourceColumnsFactory.java
index 070e554..7be457c 100644
--- a/oap-server/generate-tool/src/main/java/org/apache/skywalking/oal/tool/parser/SourceColumnsFactory.java
+++ b/oap-server/generate-tool/src/main/java/org/apache/skywalking/oal/tool/parser/SourceColumnsFactory.java
@@ -19,85 +19,22 @@
 package org.apache.skywalking.oal.tool.parser;
 
 import java.util.*;
+import org.apache.skywalking.oal.tool.meta.*;
 
+/**
+ * @author wusheng
+ */
 public class SourceColumnsFactory {
-    public static List<SourceColumn> getColumns(String source) {
-        List<SourceColumn> columnList;
-        SourceColumn idColumn;
-        switch (source) {
-            case "All":
-                return new LinkedList<>();
-            case "Service":
-                columnList = new LinkedList<>();
-                // Service id;
-                idColumn = new SourceColumn("entityId", "entity_id", String.class, true);
-                columnList.add(idColumn);
-                return columnList;
-            case "ServiceInstance":
-                columnList = new LinkedList<>();
-                // Service instance id;
-                idColumn = new SourceColumn("entityId", "entity_id", String.class, true);
-                columnList.add(idColumn);
-                SourceColumn serviceIdColumn = new SourceColumn("serviceId", "service_id", int.class, false);
-                columnList.add(serviceIdColumn);
-                return columnList;
-            case "Endpoint":
-                columnList = new LinkedList<>();
-                // Endpoint id;
-                idColumn = new SourceColumn("entityId", "entity_id", String.class, true);
-                columnList.add(idColumn);
-                serviceIdColumn = new SourceColumn("serviceId", "service_id", int.class, false);
-                columnList.add(serviceIdColumn);
-                SourceColumn serviceInstanceIdColumn = new SourceColumn("serviceInstanceId", "service_instance_id", int.class, false);
-                columnList.add(serviceInstanceIdColumn);
-                return columnList;
-            case "ServiceInstanceJVMCPU":
-            case "ServiceInstanceJVMMemory":
-            case "ServiceInstanceJVMMemoryPool":
-            case "ServiceInstanceJVMGC":
-                columnList = new LinkedList<>();
-                // Service instance id;
-                idColumn = new SourceColumn("entityId", "entity_id", String.class, true);
-                columnList.add(idColumn);
-                serviceInstanceIdColumn = new SourceColumn("serviceInstanceId", "service_instance_id", int.class, false);
-                columnList.add(serviceInstanceIdColumn);
-                return columnList;
-            case "ServiceRelation":
-                columnList = new LinkedList<>();
-                SourceColumn sourceService = new SourceColumn("entityId", "entity_id", String.class, true);
-                columnList.add(sourceService);
-                return columnList;
-            case "ServiceInstanceRelation":
-                columnList = new LinkedList<>();
-                sourceService = new SourceColumn("entityId", "entity_id", String.class, true);
-                columnList.add(sourceService);
-                sourceService = new SourceColumn("sourceServiceId", "source_service_id", int.class, false);
-                columnList.add(sourceService);
-                SourceColumn destService = new SourceColumn("destServiceId", "destServiceId", int.class, false);
-                columnList.add(destService);
+    private static Map<String, ScopeMeta> SETTINGS;
 
-                return columnList;
-            case "EndpointRelation":
-                columnList = new LinkedList<>();
-                SourceColumn sourceEndpointColumn = new SourceColumn("entityId", "entity_id", String.class, true);
-                columnList.add(sourceEndpointColumn);
-                sourceService = new SourceColumn("serviceId", "service_id", int.class, false);
-                columnList.add(sourceService);
-                destService = new SourceColumn("childServiceId", "child_service_id", int.class, false);
-                columnList.add(destService);
-                SourceColumn sourceServiceInstance = new SourceColumn("serviceInstanceId", "service_instance_id", int.class, false);
-                columnList.add(sourceServiceInstance);
-                SourceColumn destServiceInstance = new SourceColumn("childServiceInstanceId", "child_service_instance_id", int.class, false);
-                columnList.add(destServiceInstance);
-                return columnList;
-            case "DatabaseAccess":
-                columnList = new LinkedList<>();
-                // Service id;
-                idColumn = new SourceColumn("entityId", "entity_id", String.class, true);
-                columnList.add(idColumn);
-                return columnList;
-            default:
-                throw new IllegalArgumentException("Illegal source :" + source);
-        }
+    public static void setSettings(MetaSettings settings) {
+        SourceColumnsFactory.SETTINGS = new HashMap<>();
+        settings.getScopes().forEach(scope -> {
+            SourceColumnsFactory.SETTINGS.put(scope.getName(), scope);
+        });
+    }
+
+    public static List<SourceColumn> getColumns(String source) {
+        return SETTINGS.get(source).getColumns();
     }
 }
diff --git a/oap-server/generate-tool/src/main/resources/code-templates/DatabaseAccessDispatcherTemplate.ftl b/oap-server/generate-tool/src/main/resources/code-templates/DatabaseAccessDispatcherTemplate.ftl
deleted file mode 100644
index 7bfb7b3..0000000
--- a/oap-server/generate-tool/src/main/resources/code-templates/DatabaseAccessDispatcherTemplate.ftl
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
-* Licensed to the Apache Software Foundation (ASF) under one or more
-* contributor license agreements.  See the NOTICE file distributed with
-* this work for additional information regarding copyright ownership.
-* The ASF licenses this file to You under the Apache License, Version 2.0
-* (the "License"); you may not use this file except in compliance with
-* the License.  You may obtain a copy of the License at
-*
-*     http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*
-*/
-
-package org.apache.skywalking.oap.server.core.analysis.generated.databaseaccess;
-
-import org.apache.skywalking.oap.server.core.analysis.SourceDispatcher;
-<#if (databaseAccessIndicators?size>0)>
-import org.apache.skywalking.oap.server.core.analysis.worker.IndicatorProcess;
-    <#list databaseAccessIndicators as indicator>
-        <#if indicator.filterExpressions??>
-            import org.apache.skywalking.oap.server.core.analysis.indicator.expression.*;
-            <#break>
-        </#if>
-    </#list>
-</#if>
-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 DatabaseAccessDispatcher implements SourceDispatcher<DatabaseAccess> {
-
-    @Override public void dispatch(DatabaseAccess source) {
-    <#list databaseAccessIndicators as indicator>
-        do${indicator.metricName}(source);
-    </#list>
-    }
-
-    <#list databaseAccessIndicators as indicator>
-    private void do${indicator.metricName}(DatabaseAccess source) {
-        ${indicator.metricName}Indicator indicator = new ${indicator.metricName}Indicator();
-
-        <#if indicator.filterExpressions??>
-            <#list indicator.filterExpressions as filterExpression>
-                if (!new ${filterExpression.expressionObject}().setLeft(${filterExpression.left}).setRight(${filterExpression.right}).match()) {
-                return;
-                }
-            </#list>
-        </#if>
-
-        indicator.setTimeBucket(source.getTimeBucket());
-        <#list indicator.fieldsFromSource as field>
-        indicator.${field.fieldSetter}(source.${field.fieldGetter}());
-        </#list>
-        indicator.${indicator.entryMethod.methodName}(<#list indicator.entryMethod.argsExpressions as arg>${arg}<#if arg_has_next>, </#if></#list>);
-        IndicatorProcess.INSTANCE.in(indicator);
-    }
-    </#list>
-}
diff --git a/oap-server/generate-tool/src/main/resources/code-templates/AllDispatcherTemplate.ftl b/oap-server/generate-tool/src/main/resources/code-templates/DispatcherTemplate.ftl
similarity index 87%
rename from oap-server/generate-tool/src/main/resources/code-templates/AllDispatcherTemplate.ftl
rename to oap-server/generate-tool/src/main/resources/code-templates/DispatcherTemplate.ftl
index 95ff276..b6068ca 100644
--- a/oap-server/generate-tool/src/main/resources/code-templates/AllDispatcherTemplate.ftl
+++ b/oap-server/generate-tool/src/main/resources/code-templates/DispatcherTemplate.ftl
@@ -16,12 +16,12 @@
  *
  */
 
-package org.apache.skywalking.oap.server.core.analysis.generated.all;
+package org.apache.skywalking.oap.server.core.analysis.generated.${packageName};
 
 import org.apache.skywalking.oap.server.core.analysis.SourceDispatcher;
-<#if (allIndicators?size>0)>
+<#if (indicators?size>0)>
 import org.apache.skywalking.oap.server.core.analysis.worker.IndicatorProcess;
-    <#list allIndicators as indicator>
+    <#list indicators as indicator>
         <#if indicator.filterExpressions??>
 import org.apache.skywalking.oap.server.core.analysis.indicator.expression.*;
             <#break>
@@ -35,16 +35,16 @@ import org.apache.skywalking.oap.server.core.source.*;
  *
  * @author Observability Analysis Language code generator
  */
-public class AllDispatcher implements SourceDispatcher<All> {
+public class ${source}Dispatcher implements SourceDispatcher<${source}> {
 
-    @Override public void dispatch(All source) {
-<#list allIndicators as indicator>
+    @Override public void dispatch(${source} source) {
+<#list indicators as indicator>
         do${indicator.metricName}(source);
 </#list>
     }
 
-<#list allIndicators as indicator>
-    private void do${indicator.metricName}(All source) {
+<#list indicators as indicator>
+    private void do${indicator.metricName}(${source} source) {
         ${indicator.metricName}Indicator indicator = new ${indicator.metricName}Indicator();
 
     <#if indicator.filterExpressions??>
diff --git a/oap-server/generate-tool/src/main/resources/code-templates/EndpointDispatcherTemplate.ftl b/oap-server/generate-tool/src/main/resources/code-templates/EndpointDispatcherTemplate.ftl
deleted file mode 100644
index 468100a..0000000
--- a/oap-server/generate-tool/src/main/resources/code-templates/EndpointDispatcherTemplate.ftl
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-package org.apache.skywalking.oap.server.core.analysis.generated.endpoint;
-
-import org.apache.skywalking.oap.server.core.analysis.SourceDispatcher;
-<#if (endpointIndicators?size>0)>
-import org.apache.skywalking.oap.server.core.analysis.worker.IndicatorProcess;
-    <#list endpointIndicators as indicator>
-        <#if indicator.filterExpressions??>
-import org.apache.skywalking.oap.server.core.analysis.indicator.expression.*;
-            <#break>
-        </#if>
-    </#list>
-</#if>
-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 EndpointDispatcher implements SourceDispatcher<Endpoint> {
-
-    @Override public void dispatch(Endpoint source) {
-<#list endpointIndicators as indicator>
-        do${indicator.metricName}(source);
-</#list>
-    }
-
-<#list endpointIndicators as indicator>
-    private void do${indicator.metricName}(Endpoint source) {
-        ${indicator.metricName}Indicator indicator = new ${indicator.metricName}Indicator();
-
-    <#if indicator.filterExpressions??>
-        <#list indicator.filterExpressions as filterExpression>
-        if (!new ${filterExpression.expressionObject}().setLeft(${filterExpression.left}).setRight(${filterExpression.right}).match()) {
-            return;
-        }
-        </#list>
-    </#if>
-
-        indicator.setTimeBucket(source.getTimeBucket());
-    <#list indicator.fieldsFromSource as field>
-        indicator.${field.fieldSetter}(source.${field.fieldGetter}());
-    </#list>
-        indicator.${indicator.entryMethod.methodName}(<#list indicator.entryMethod.argsExpressions as arg>${arg}<#if arg_has_next>, </#if></#list>);
-        IndicatorProcess.INSTANCE.in(indicator);
-    }
-
-</#list>
-}
diff --git a/oap-server/generate-tool/src/main/resources/code-templates/EndpointRelationDispatcherTemplate.ftl b/oap-server/generate-tool/src/main/resources/code-templates/EndpointRelationDispatcherTemplate.ftl
deleted file mode 100644
index 5b68f81..0000000
--- a/oap-server/generate-tool/src/main/resources/code-templates/EndpointRelationDispatcherTemplate.ftl
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-package org.apache.skywalking.oap.server.core.analysis.generated.endpointrelation;
-
-import org.apache.skywalking.oap.server.core.analysis.SourceDispatcher;
-<#if (endpointRelationIndicators?size>0)>
-import org.apache.skywalking.oap.server.core.analysis.worker.IndicatorProcess;
-    <#list endpointRelationIndicators as indicator>
-        <#if indicator.filterExpressions??>
-import org.apache.skywalking.oap.server.core.analysis.indicator.expression.*;
-            <#break>
-        </#if>
-    </#list>
-</#if>
-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) {
-<#list endpointRelationIndicators as indicator>
-        do${indicator.metricName}(source);
-</#list>
-    }
-
-<#list endpointRelationIndicators as indicator>
-    private void do${indicator.metricName}(EndpointRelation source) {
-        ${indicator.metricName}Indicator indicator = new ${indicator.metricName}Indicator();
-
-    <#if indicator.filterExpressions??>
-        <#list indicator.filterExpressions as filterExpression>
-        if (!new ${filterExpression.expressionObject}().setLeft(${filterExpression.left}).setRight(${filterExpression.right}).match()) {
-            return;
-        }
-        </#list>
-    </#if>
-
-        indicator.setTimeBucket(source.getTimeBucket());
-    <#list indicator.fieldsFromSource as field>
-        indicator.${field.fieldSetter}(source.${field.fieldGetter}());
-    </#list>
-        indicator.${indicator.entryMethod.methodName}(<#list indicator.entryMethod.argsExpressions as arg>${arg}<#if arg_has_next>, </#if></#list>);
-        IndicatorProcess.INSTANCE.in(indicator);
-    }
-</#list>
-}
diff --git a/oap-server/generate-tool/src/main/resources/code-templates/IndicatorImplementor.ftl b/oap-server/generate-tool/src/main/resources/code-templates/IndicatorImplementor.ftl
index 2562b22..8fe2b5a 100644
--- a/oap-server/generate-tool/src/main/resources/code-templates/IndicatorImplementor.ftl
+++ b/oap-server/generate-tool/src/main/resources/code-templates/IndicatorImplementor.ftl
@@ -36,7 +36,6 @@ import org.apache.skywalking.oap.server.core.remote.annotation.StreamData;
 import org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData;
 import org.apache.skywalking.oap.server.core.storage.annotation.*;
 import org.apache.skywalking.oap.server.core.storage.StorageBuilder;
-import org.apache.skywalking.oap.server.core.source.Scope;
 
 /**
  * This class is auto generated. Please don't change this class manually.
@@ -45,7 +44,7 @@ import org.apache.skywalking.oap.server.core.source.Scope;
  */
 @IndicatorType
 @StreamData
-@StorageEntity(name = "${tableName}", builder = ${metricName}Indicator.Builder.class, source = Scope.${sourceName})
+@StorageEntity(name = "${tableName}", builder = ${metricName}Indicator.Builder.class, sourceScopeId = ${sourceScopeId})
 public class ${metricName}Indicator extends ${indicatorClassName} implements AlarmSupported {
 
 <#list fieldsFromSource as sourceField>
@@ -172,7 +171,7 @@ public class ${metricName}Indicator extends ${indicatorClassName} implements Ala
     }
 
     @Override public AlarmMeta getAlarmMeta() {
-        return new AlarmMeta("${varName}", Scope.${sourceName}<#if (fieldsFromSource?size>0) ><#list fieldsFromSource as field><#if field.isID()>, ${field.fieldName}</#if></#list></#if>);
+        return new AlarmMeta("${varName}", ${sourceScopeId}<#if (fieldsFromSource?size>0) ><#list fieldsFromSource as field><#if field.isID()>, ${field.fieldName}</#if></#list></#if>);
     }
 
     @Override
diff --git a/oap-server/generate-tool/src/main/resources/code-templates/ServiceDispatcherTemplate.ftl b/oap-server/generate-tool/src/main/resources/code-templates/ServiceDispatcherTemplate.ftl
deleted file mode 100644
index 78b908d..0000000
--- a/oap-server/generate-tool/src/main/resources/code-templates/ServiceDispatcherTemplate.ftl
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-package org.apache.skywalking.oap.server.core.analysis.generated.service;
-
-import org.apache.skywalking.oap.server.core.analysis.SourceDispatcher;
-<#if (serviceIndicators?size>0)>
-import org.apache.skywalking.oap.server.core.analysis.worker.IndicatorProcess;
-    <#list serviceIndicators as indicator>
-        <#if indicator.filterExpressions??>
-import org.apache.skywalking.oap.server.core.analysis.indicator.expression.*;
-            <#break>
-        </#if>
-    </#list>
-</#if>
-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 ServiceDispatcher implements SourceDispatcher<Service> {
-
-    @Override public void dispatch(Service source) {
-<#list serviceIndicators as indicator>
-        do${indicator.metricName}(source);
-</#list>
-    }
-
-<#list serviceIndicators as indicator>
-    private void do${indicator.metricName}(Service source) {
-        ${indicator.metricName}Indicator indicator = new ${indicator.metricName}Indicator();
-
-    <#if indicator.filterExpressions??>
-        <#list indicator.filterExpressions as filterExpression>
-        if (!new ${filterExpression.expressionObject}().setLeft(${filterExpression.left}).setRight(${filterExpression.right}).match()) {
-            return;
-        }
-        </#list>
-    </#if>
-
-        indicator.setTimeBucket(source.getTimeBucket());
-    <#list indicator.fieldsFromSource as field>
-        indicator.${field.fieldSetter}(source.${field.fieldGetter}());
-    </#list>
-        indicator.${indicator.entryMethod.methodName}(<#list indicator.entryMethod.argsExpressions as arg>${arg}<#if arg_has_next>, </#if></#list>);
-        IndicatorProcess.INSTANCE.in(indicator);
-    }
-</#list>
-}
diff --git a/oap-server/generate-tool/src/main/resources/code-templates/ServiceInstanceDispatcherTemplate.ftl b/oap-server/generate-tool/src/main/resources/code-templates/ServiceInstanceDispatcherTemplate.ftl
deleted file mode 100644
index 9ea53a4..0000000
--- a/oap-server/generate-tool/src/main/resources/code-templates/ServiceInstanceDispatcherTemplate.ftl
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-package org.apache.skywalking.oap.server.core.analysis.generated.serviceinstance;
-
-import org.apache.skywalking.oap.server.core.analysis.SourceDispatcher;
-<#if (serviceInstanceIndicators?size>0)>
-import org.apache.skywalking.oap.server.core.analysis.worker.IndicatorProcess;
-    <#list serviceInstanceIndicators as indicator>
-        <#if indicator.filterExpressions??>
-import org.apache.skywalking.oap.server.core.analysis.indicator.expression.*;
-            <#break>
-        </#if>
-    </#list>
-</#if>
-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) {
-<#list serviceInstanceIndicators as indicator>
-        do${indicator.metricName}(source);
-</#list>
-    }
-
-<#list serviceInstanceIndicators as indicator>
-    private void do${indicator.metricName}(ServiceInstance source) {
-        ${indicator.metricName}Indicator indicator = new ${indicator.metricName}Indicator();
-
-    <#if indicator.filterExpressions??>
-        <#list indicator.filterExpressions as filterExpression>
-        if (!new ${filterExpression.expressionObject}().setLeft(${filterExpression.left}).setRight(${filterExpression.right}).match()) {
-            return;
-        }
-        </#list>
-    </#if>
-
-        indicator.setTimeBucket(source.getTimeBucket());
-    <#list indicator.fieldsFromSource as field>
-        indicator.${field.fieldSetter}(source.${field.fieldGetter}());
-    </#list>
-        indicator.${indicator.entryMethod.methodName}(<#list indicator.entryMethod.argsExpressions as arg>${arg}<#if arg_has_next>, </#if></#list>);
-        IndicatorProcess.INSTANCE.in(indicator);
-    }
-</#list>
-}
diff --git a/oap-server/generate-tool/src/main/resources/code-templates/ServiceInstanceJVMCPUDispatcherTemplate.ftl b/oap-server/generate-tool/src/main/resources/code-templates/ServiceInstanceJVMCPUDispatcherTemplate.ftl
deleted file mode 100644
index d1d4913..0000000
--- a/oap-server/generate-tool/src/main/resources/code-templates/ServiceInstanceJVMCPUDispatcherTemplate.ftl
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-package org.apache.skywalking.oap.server.core.analysis.generated.serviceinstancejvmcpu;
-
-import org.apache.skywalking.oap.server.core.analysis.SourceDispatcher;
-<#if (serviceInstanceJVMCPUIndicators?size>0)>
-import org.apache.skywalking.oap.server.core.analysis.worker.IndicatorProcess;
-    <#list serviceInstanceJVMCPUIndicators as indicator>
-        <#if indicator.filterExpressions??>
-import org.apache.skywalking.oap.server.core.analysis.indicator.expression.*;
-            <#break>
-        </#if>
-    </#list>
-</#if>
-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 ServiceInstanceJVMCPUDispatcher implements SourceDispatcher<ServiceInstanceJVMCPU> {
-    
-    @Override public void dispatch(ServiceInstanceJVMCPU source) {
-<#list serviceInstanceJVMCPUIndicators as indicator>
-        do${indicator.metricName}(source);
-</#list>
-    }
-
-<#list serviceInstanceJVMCPUIndicators as indicator>
-    private void do${indicator.metricName}(ServiceInstanceJVMCPU source) {
-        ${indicator.metricName}Indicator indicator = new ${indicator.metricName}Indicator();
-
-    <#if indicator.filterExpressions??>
-        <#list indicator.filterExpressions as filterExpression>
-        if (!new ${filterExpression.expressionObject}().setLeft(${filterExpression.left}).setRight(${filterExpression.right}).match()) {
-            return;
-        }
-        </#list>
-    </#if>
-
-        indicator.setTimeBucket(source.getTimeBucket());
-    <#list indicator.fieldsFromSource as field>
-        indicator.${field.fieldSetter}(source.${field.fieldGetter}());
-    </#list>
-        indicator.${indicator.entryMethod.methodName}(<#list indicator.entryMethod.argsExpressions as arg>${arg}<#if arg_has_next>, </#if></#list>);
-        IndicatorProcess.INSTANCE.in(indicator);
-    }
-</#list>
-}
diff --git a/oap-server/generate-tool/src/main/resources/code-templates/ServiceInstanceJVMGCDispatcherTemplate.ftl b/oap-server/generate-tool/src/main/resources/code-templates/ServiceInstanceJVMGCDispatcherTemplate.ftl
deleted file mode 100644
index 7ffb0b3..0000000
--- a/oap-server/generate-tool/src/main/resources/code-templates/ServiceInstanceJVMGCDispatcherTemplate.ftl
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-package org.apache.skywalking.oap.server.core.analysis.generated.serviceinstancejvmgc;
-
-import org.apache.skywalking.oap.server.core.analysis.SourceDispatcher;
-<#if (serviceInstanceJVMGCIndicators?size>0)>
-import org.apache.skywalking.oap.server.core.analysis.worker.IndicatorProcess;
-    <#list serviceInstanceJVMGCIndicators as indicator>
-        <#if indicator.filterExpressions??>
-import org.apache.skywalking.oap.server.core.analysis.indicator.expression.*;
-            <#break>
-        </#if>
-    </#list>
-</#if>
-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 ServiceInstanceJVMGCDispatcher implements SourceDispatcher<ServiceInstanceJVMGC> {
-
-    @Override public void dispatch(ServiceInstanceJVMGC source) {
-<#list serviceInstanceJVMGCIndicators as indicator>
-        do${indicator.metricName}(source);
-</#list>
-    }
-
-<#list serviceInstanceJVMGCIndicators as indicator>
-    private void do${indicator.metricName}(ServiceInstanceJVMGC source) {
-        ${indicator.metricName}Indicator indicator = new ${indicator.metricName}Indicator();
-
-    <#if indicator.filterExpressions??>
-        <#list indicator.filterExpressions as filterExpression>
-        if (!new ${filterExpression.expressionObject}().setLeft(${filterExpression.left}).setRight(${filterExpression.right}).match()) {
-            return;
-        }
-        </#list>
-    </#if>
-
-        indicator.setTimeBucket(source.getTimeBucket());
-    <#list indicator.fieldsFromSource as field>
-        indicator.${field.fieldSetter}(source.${field.fieldGetter}());
-    </#list>
-        indicator.${indicator.entryMethod.methodName}(<#list indicator.entryMethod.argsExpressions as arg>${arg}<#if arg_has_next>, </#if></#list>);
-        IndicatorProcess.INSTANCE.in(indicator);
-    }
-</#list>
-}
diff --git a/oap-server/generate-tool/src/main/resources/code-templates/ServiceInstanceJVMMemoryDispatcherTemplate.ftl b/oap-server/generate-tool/src/main/resources/code-templates/ServiceInstanceJVMMemoryDispatcherTemplate.ftl
deleted file mode 100644
index 3df4b88..0000000
--- a/oap-server/generate-tool/src/main/resources/code-templates/ServiceInstanceJVMMemoryDispatcherTemplate.ftl
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-package org.apache.skywalking.oap.server.core.analysis.generated.serviceinstancejvmmemory;
-
-import org.apache.skywalking.oap.server.core.analysis.SourceDispatcher;
-<#if (serviceInstanceJVMMemoryIndicators?size>0)>
-import org.apache.skywalking.oap.server.core.analysis.worker.IndicatorProcess;
-    <#list serviceInstanceJVMMemoryIndicators as indicator>
-        <#if indicator.filterExpressions??>
-import org.apache.skywalking.oap.server.core.analysis.indicator.expression.*;
-            <#break>
-        </#if>
-    </#list>
-</#if>
-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 ServiceInstanceJVMMemoryDispatcher implements SourceDispatcher<ServiceInstanceJVMMemory> {
-
-    @Override public void dispatch(ServiceInstanceJVMMemory source) {
-<#list serviceInstanceJVMMemoryIndicators as indicator>
-        do${indicator.metricName}(source);
-</#list>
-    }
-
-<#list serviceInstanceJVMMemoryIndicators as indicator>
-    private void do${indicator.metricName}(ServiceInstanceJVMMemory source) {
-        ${indicator.metricName}Indicator indicator = new ${indicator.metricName}Indicator();
-
-    <#if indicator.filterExpressions??>
-        <#list indicator.filterExpressions as filterExpression>
-        if (!new ${filterExpression.expressionObject}().setLeft(${filterExpression.left}).setRight(${filterExpression.right}).match()) {
-            return;
-        }
-        </#list>
-    </#if>
-
-        indicator.setTimeBucket(source.getTimeBucket());
-    <#list indicator.fieldsFromSource as field>
-        indicator.${field.fieldSetter}(source.${field.fieldGetter}());
-    </#list>
-        indicator.${indicator.entryMethod.methodName}(<#list indicator.entryMethod.argsExpressions as arg>${arg}<#if arg_has_next>, </#if></#list>);
-        IndicatorProcess.INSTANCE.in(indicator);
-    }
-</#list>
-}
diff --git a/oap-server/generate-tool/src/main/resources/code-templates/ServiceInstanceJVMMemoryPoolDispatcherTemplate.ftl b/oap-server/generate-tool/src/main/resources/code-templates/ServiceInstanceJVMMemoryPoolDispatcherTemplate.ftl
deleted file mode 100644
index 505e35e..0000000
--- a/oap-server/generate-tool/src/main/resources/code-templates/ServiceInstanceJVMMemoryPoolDispatcherTemplate.ftl
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-package org.apache.skywalking.oap.server.core.analysis.generated.serviceinstancejvmmemorypool;
-
-import org.apache.skywalking.oap.server.core.analysis.SourceDispatcher;
-<#if (serviceInstanceJVMMemoryPoolIndicators?size>0)>
-import org.apache.skywalking.oap.server.core.analysis.worker.IndicatorProcess;
-    <#list serviceInstanceJVMMemoryPoolIndicators as indicator>
-        <#if indicator.filterExpressions??>
-import org.apache.skywalking.oap.server.core.analysis.indicator.expression.*;
-            <#break>
-        </#if>
-    </#list>
-</#if>
-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 ServiceInstanceJVMMemoryPoolDispatcher implements SourceDispatcher<ServiceInstanceJVMMemoryPool> {
-
-    @Override public void dispatch(ServiceInstanceJVMMemoryPool source) {
-<#list serviceInstanceJVMMemoryPoolIndicators as indicator>
-        do${indicator.metricName}(source);
-</#list>
-    }
-
-<#list serviceInstanceJVMMemoryPoolIndicators as indicator>
-    private void do${indicator.metricName}(ServiceInstanceJVMMemoryPool source) {
-        ${indicator.metricName}Indicator indicator = new ${indicator.metricName}Indicator();
-
-    <#if indicator.filterExpressions??>
-        <#list indicator.filterExpressions as filterExpression>
-        if (!new ${filterExpression.expressionObject}().setLeft(${filterExpression.left}).setRight(${filterExpression.right}).match()) {
-            return;
-        }
-        </#list>
-    </#if>
-
-        indicator.setTimeBucket(source.getTimeBucket());
-    <#list indicator.fieldsFromSource as field>
-        indicator.${field.fieldSetter}(source.${field.fieldGetter}());
-    </#list>
-        indicator.${indicator.entryMethod.methodName}(<#list indicator.entryMethod.argsExpressions as arg>${arg}<#if arg_has_next>, </#if></#list>);
-        IndicatorProcess.INSTANCE.in(indicator);
-    }
-</#list>
-}
diff --git a/oap-server/generate-tool/src/main/resources/code-templates/ServiceInstanceRelationDispatcherTemplate.ftl b/oap-server/generate-tool/src/main/resources/code-templates/ServiceInstanceRelationDispatcherTemplate.ftl
deleted file mode 100644
index c7a485a..0000000
--- a/oap-server/generate-tool/src/main/resources/code-templates/ServiceInstanceRelationDispatcherTemplate.ftl
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-package org.apache.skywalking.oap.server.core.analysis.generated.serviceinstancerelation;
-
-import org.apache.skywalking.oap.server.core.analysis.SourceDispatcher;
-<#if (serviceInstanceRelationIndicators?size>0)>
-import org.apache.skywalking.oap.server.core.analysis.worker.IndicatorProcess;
-    <#list serviceInstanceRelationIndicators as indicator>
-        <#if indicator.filterExpressions??>
-import org.apache.skywalking.oap.server.core.analysis.indicator.expression.*;
-            <#break>
-        </#if>
-    </#list>
-</#if>
-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) {
-<#list serviceInstanceRelationIndicators as indicator>
-        do${indicator.metricName}(source);
-</#list>
-    }
-
-<#list serviceInstanceRelationIndicators as indicator>
-    private void do${indicator.metricName}(ServiceInstanceRelation source) {
-        ${indicator.metricName}Indicator indicator = new ${indicator.metricName}Indicator();
-
-    <#if indicator.filterExpressions??>
-        <#list indicator.filterExpressions as filterExpression>
-        if (!new ${filterExpression.expressionObject}().setLeft(${filterExpression.left}).setRight(${filterExpression.right}).match()) {
-            return;
-        }
-        </#list>
-    </#if>
-
-        indicator.setTimeBucket(source.getTimeBucket());
-    <#list indicator.fieldsFromSource as field>
-        indicator.${field.fieldSetter}(source.${field.fieldGetter}());
-    </#list>
-        indicator.${indicator.entryMethod.methodName}(<#list indicator.entryMethod.argsExpressions as arg>${arg}<#if arg_has_next>, </#if></#list>);
-        IndicatorProcess.INSTANCE.in(indicator);
-    }
-</#list>
-}
diff --git a/oap-server/generate-tool/src/main/resources/code-templates/ServiceRelationDispatcherTemplate.ftl b/oap-server/generate-tool/src/main/resources/code-templates/ServiceRelationDispatcherTemplate.ftl
deleted file mode 100644
index 42fd47e..0000000
--- a/oap-server/generate-tool/src/main/resources/code-templates/ServiceRelationDispatcherTemplate.ftl
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-package org.apache.skywalking.oap.server.core.analysis.generated.servicerelation;
-
-import org.apache.skywalking.oap.server.core.analysis.SourceDispatcher;
-<#if (serviceRelationIndicators?size>0)>
-import org.apache.skywalking.oap.server.core.analysis.worker.IndicatorProcess;
-    <#list serviceRelationIndicators as indicator>
-        <#if indicator.filterExpressions??>
-import org.apache.skywalking.oap.server.core.analysis.indicator.expression.*;
-            <#break>
-        </#if>
-    </#list>
-</#if>
-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) {
-<#list serviceRelationIndicators as indicator>
-        do${indicator.metricName}(source);
-</#list>
-    }
-
-<#list serviceRelationIndicators as indicator>
-    private void do${indicator.metricName}(ServiceRelation source) {
-        ${indicator.metricName}Indicator indicator = new ${indicator.metricName}Indicator();
-
-    <#if indicator.filterExpressions??>
-        <#list indicator.filterExpressions as filterExpression>
-        if (!new ${filterExpression.expressionObject}().setLeft(${filterExpression.left}).setRight(${filterExpression.right}).match()) {
-            return;
-        }
-        </#list>
-    </#if>
-
-        indicator.setTimeBucket(source.getTimeBucket());
-    <#list indicator.fieldsFromSource as field>
-        indicator.${field.fieldSetter}(source.${field.fieldGetter}());
-    </#list>
-        indicator.${indicator.entryMethod.methodName}(<#list indicator.entryMethod.argsExpressions as arg>${arg}<#if arg_has_next>, </#if></#list>);
-        IndicatorProcess.INSTANCE.in(indicator);
-    }
-</#list>
-}
diff --git a/oap-server/generate-tool/src/test/java/org/apache/skywalking/oal/tool/meta/MetaReaderTest.java b/oap-server/generate-tool/src/test/java/org/apache/skywalking/oal/tool/meta/MetaReaderTest.java
new file mode 100644
index 0000000..bb1ac4c
--- /dev/null
+++ b/oap-server/generate-tool/src/test/java/org/apache/skywalking/oal/tool/meta/MetaReaderTest.java
@@ -0,0 +1,43 @@
+/*
+ * 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.oal.tool.meta;
+
+import java.io.InputStream;
+import java.util.List;
+import org.apache.skywalking.oal.tool.parser.SourceColumn;
+import org.junit.*;
+
+public class MetaReaderTest {
+    @Test
+    public void testFileParser() {
+        MetaReader reader = new MetaReader();
+        InputStream stream = MetaReaderTest.class.getResourceAsStream("/scope-meta.yml");
+        MetaSettings metaSettings = reader.read(stream);
+        Assert.assertNotEquals(0, metaSettings.getScopes().size());
+
+        metaSettings.getScopes().forEach(scopeMeta -> {
+            List<SourceColumn> sourceColumns = MockSourceColumnsFactory.getColumns(scopeMeta.getName());
+            for (int i = 0; i < sourceColumns.size(); i++) {
+                SourceColumn column = scopeMeta.getColumns().get(i);
+                SourceColumn expected = sourceColumns.get(i);
+                Assert.assertEquals(expected, column);
+            }
+        });
+    }
+}
diff --git a/oap-server/generate-tool/src/main/java/org/apache/skywalking/oal/tool/parser/SourceColumnsFactory.java b/oap-server/generate-tool/src/test/java/org/apache/skywalking/oal/tool/meta/MockSourceColumnsFactory.java
similarity index 95%
copy from oap-server/generate-tool/src/main/java/org/apache/skywalking/oal/tool/parser/SourceColumnsFactory.java
copy to oap-server/generate-tool/src/test/java/org/apache/skywalking/oal/tool/meta/MockSourceColumnsFactory.java
index 070e554..5930907 100644
--- a/oap-server/generate-tool/src/main/java/org/apache/skywalking/oal/tool/parser/SourceColumnsFactory.java
+++ b/oap-server/generate-tool/src/test/java/org/apache/skywalking/oal/tool/meta/MockSourceColumnsFactory.java
@@ -16,11 +16,12 @@
  *
  */
 
-package org.apache.skywalking.oal.tool.parser;
+package org.apache.skywalking.oal.tool.meta;
 
 import java.util.*;
+import org.apache.skywalking.oal.tool.parser.SourceColumn;
 
-public class SourceColumnsFactory {
+public class MockSourceColumnsFactory {
     public static List<SourceColumn> getColumns(String source) {
         List<SourceColumn> columnList;
         SourceColumn idColumn;
@@ -73,7 +74,7 @@ public class SourceColumnsFactory {
                 columnList.add(sourceService);
                 sourceService = new SourceColumn("sourceServiceId", "source_service_id", int.class, false);
                 columnList.add(sourceService);
-                SourceColumn destService = new SourceColumn("destServiceId", "destServiceId", int.class, false);
+                SourceColumn destService = new SourceColumn("destServiceId", "dest_service_id", int.class, false);
                 columnList.add(destService);
 
                 return columnList;
@@ -97,7 +98,7 @@ public class SourceColumnsFactory {
                 columnList.add(idColumn);
                 return columnList;
             default:
-                throw new IllegalArgumentException("Illegal source :" + source);
+                throw new IllegalArgumentException("Illegal sourceScopeId :" + source);
         }
     }
 }
diff --git a/oap-server/generate-tool/src/test/java/org/apache/skywalking/oal/tool/output/FileGeneratorTest.java b/oap-server/generate-tool/src/test/java/org/apache/skywalking/oal/tool/output/FileGeneratorTest.java
index 435de82..1740a1d 100644
--- a/oap-server/generate-tool/src/test/java/org/apache/skywalking/oal/tool/output/FileGeneratorTest.java
+++ b/oap-server/generate-tool/src/test/java/org/apache/skywalking/oal/tool/output/FileGeneratorTest.java
@@ -21,14 +21,24 @@ package org.apache.skywalking.oal.tool.output;
 import freemarker.template.TemplateException;
 import java.io.*;
 import java.util.*;
+import org.apache.skywalking.oal.tool.meta.*;
 import org.apache.skywalking.oal.tool.parser.*;
 import org.junit.*;
 
 public class FileGeneratorTest {
+    @BeforeClass
+    public static void init() {
+        MetaReader reader = new MetaReader();
+        InputStream stream = MetaReaderTest.class.getResourceAsStream("/scope-meta.yml");
+        MetaSettings metaSettings = reader.read(stream);
+        SourceColumnsFactory.setSettings(metaSettings);
+    }
+
     private AnalysisResult buildResult() {
         AnalysisResult result = new AnalysisResult();
         result.setVarName("generate_indicator");
         result.setSourceName("Service");
+        result.setSourceScopeId(1);
         result.setPackageName("service.serviceavg");
         result.setTableName("service_avg");
         result.setSourceAttribute("latency");
@@ -83,7 +93,7 @@ public class FileGeneratorTest {
 
         FileGenerator fileGenerator = new FileGenerator(results, ".");
         StringWriter writer = new StringWriter();
-        fileGenerator.generateServiceDispatcher(writer);
+        fileGenerator.generateDispatcher(result, writer);
         Assert.assertEquals(readExpectedFile("ServiceDispatcherExpected.java"), writer.toString());
 
         //fileGenerator.generateServiceDispatcher(new OutputStreamWriter(System.out));
diff --git a/oap-server/generate-tool/src/test/java/org/apache/skywalking/oal/tool/parser/DeepAnalysisTest.java b/oap-server/generate-tool/src/test/java/org/apache/skywalking/oal/tool/parser/DeepAnalysisTest.java
index 837eec9..1482617 100644
--- a/oap-server/generate-tool/src/test/java/org/apache/skywalking/oal/tool/parser/DeepAnalysisTest.java
+++ b/oap-server/generate-tool/src/test/java/org/apache/skywalking/oal/tool/parser/DeepAnalysisTest.java
@@ -18,13 +18,18 @@
 
 package org.apache.skywalking.oal.tool.parser;
 
-import java.io.IOException;
+import java.io.*;
 import java.util.List;
+import org.apache.skywalking.oal.tool.meta.*;
 import org.junit.*;
 
 public class DeepAnalysisTest {
     @BeforeClass
     public static void init() throws IOException {
+        MetaReader reader = new MetaReader();
+        InputStream stream = MetaReaderTest.class.getResourceAsStream("/scope-meta.yml");
+        MetaSettings metaSettings = reader.read(stream);
+        SourceColumnsFactory.setSettings(metaSettings);
         Indicators.init();
     }
 
diff --git a/oap-server/generate-tool/src/test/java/org/apache/skywalking/oal/tool/parser/ScriptParserTest.java b/oap-server/generate-tool/src/test/java/org/apache/skywalking/oal/tool/parser/ScriptParserTest.java
index a62c79b..58cb838 100644
--- a/oap-server/generate-tool/src/test/java/org/apache/skywalking/oal/tool/parser/ScriptParserTest.java
+++ b/oap-server/generate-tool/src/test/java/org/apache/skywalking/oal/tool/parser/ScriptParserTest.java
@@ -18,14 +18,30 @@
 
 package org.apache.skywalking.oal.tool.parser;
 
-import java.io.IOException;
+import java.io.*;
 import java.util.List;
+import org.apache.skywalking.oal.tool.meta.*;
+import org.apache.skywalking.oap.server.core.annotation.AnnotationScan;
+import org.apache.skywalking.oap.server.core.source.DefaultScopeDefine;
 import org.junit.*;
 
 public class ScriptParserTest {
     @BeforeClass
     public static void init() throws IOException {
+        MetaReader reader = new MetaReader();
+        InputStream stream = MetaReaderTest.class.getResourceAsStream("/scope-meta.yml");
+        MetaSettings metaSettings = reader.read(stream);
+        SourceColumnsFactory.setSettings(metaSettings);
         Indicators.init();
+
+        AnnotationScan scopeScan = new AnnotationScan();
+        scopeScan.registerListener(new DefaultScopeDefine.Listener());
+        scopeScan.scan(null);
+    }
+
+    @AfterClass
+    public static void clear() {
+        DefaultScopeDefine.reset();
     }
 
     @Test
diff --git a/oap-server/generate-tool/src/test/resources/expectedFiles/IndicatorImplementorExpected.java b/oap-server/generate-tool/src/test/resources/expectedFiles/IndicatorImplementorExpected.java
index 5395803..461553b 100644
--- a/oap-server/generate-tool/src/test/resources/expectedFiles/IndicatorImplementorExpected.java
+++ b/oap-server/generate-tool/src/test/resources/expectedFiles/IndicatorImplementorExpected.java
@@ -29,7 +29,6 @@ import org.apache.skywalking.oap.server.core.remote.annotation.StreamData;
 import org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData;
 import org.apache.skywalking.oap.server.core.storage.annotation.*;
 import org.apache.skywalking.oap.server.core.storage.StorageBuilder;
-import org.apache.skywalking.oap.server.core.source.Scope;
 
 /**
  * This class is auto generated. Please don't change this class manually.
@@ -38,7 +37,7 @@ import org.apache.skywalking.oap.server.core.source.Scope;
  */
 @IndicatorType
 @StreamData
-@StorageEntity(name = "service_avg", builder = ServiceAvgIndicator.Builder.class, source = Scope.Service)
+@StorageEntity(name = "service_avg", builder = ServiceAvgIndicator.Builder.class, sourceScopeId = 1)
 public class ServiceAvgIndicator extends LongAvgIndicator implements AlarmSupported {
 
     @Setter @Getter @Column(columnName = "entity_id") @IDColumn private java.lang.String entityId;
@@ -110,7 +109,7 @@ public class ServiceAvgIndicator extends LongAvgIndicator implements AlarmSuppor
     }
 
     @Override public AlarmMeta getAlarmMeta() {
-        return new AlarmMeta("generate_indicator", Scope.Service, entityId);
+        return new AlarmMeta("generate_indicator", 1, entityId);
     }
 
     @Override
diff --git a/oap-server/generate-tool/src/test/resources/scope-meta.yml b/oap-server/generate-tool/src/test/resources/scope-meta.yml
new file mode 100644
index 0000000..004a400
--- /dev/null
+++ b/oap-server/generate-tool/src/test/resources/scope-meta.yml
@@ -0,0 +1,136 @@
+# 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.
+
+scopes:
+  - name: All
+  - name: Service
+    columns:
+      - fieldName: entityId
+        columnName: entity_id
+        typeName: java.lang.String
+        ID: true
+  - name: ServiceInstance
+    columns:
+    - fieldName: entityId
+      columnName: entity_id
+      typeName: java.lang.String
+      ID: true
+    - fieldName: serviceId
+      columnName: service_id
+      typeName: int
+      ID: false
+  - name: Endpoint
+    columns:
+    - fieldName: entityId
+      columnName: entity_id
+      typeName: java.lang.String
+      ID: true
+    - fieldName: serviceId
+      columnName: service_id
+      typeName: int
+      ID: false
+    - fieldName: serviceInstanceId
+      columnName: service_instance_id
+      typeName: int
+      ID: false
+  - name: ServiceInstanceJVMCPU
+    columns:
+    - fieldName: entityId
+      columnName: entity_id
+      typeName: java.lang.String
+      ID: true
+    - fieldName: serviceInstanceId
+      columnName: service_instance_id
+      typeName: int
+      ID: false
+  - name: ServiceInstanceJVMMemory
+    columns:
+    - fieldName: entityId
+      columnName: entity_id
+      typeName: java.lang.String
+      ID: true
+    - fieldName: serviceInstanceId
+      columnName: service_instance_id
+      typeName: int
+      ID: false
+  - name: ServiceInstanceJVMMemoryPool
+    columns:
+    - fieldName: entityId
+      columnName: entity_id
+      typeName: java.lang.String
+      ID: true
+    - fieldName: serviceInstanceId
+      columnName: service_instance_id
+      typeName: int
+      ID: false
+  - name: ServiceInstanceJVMGC
+    columns:
+    - fieldName: entityId
+      columnName: entity_id
+      typeName: java.lang.String
+      ID: true
+    - fieldName: serviceInstanceId
+      columnName: service_instance_id
+      typeName: int
+      ID: false
+  - name: ServiceRelation
+    columns:
+    - fieldName: entityId
+      columnName: entity_id
+      typeName: java.lang.String
+      ID: true
+  - name: ServiceInstanceRelation
+    columns:
+    - fieldName: entityId
+      columnName: entity_id
+      typeName: java.lang.String
+      ID: true
+    - fieldName: sourceServiceId
+      columnName: source_service_id
+      typeName: int
+      ID: false
+    - fieldName: destServiceId
+      columnName: dest_service_id
+      typeName: int
+      ID: false
+  - name: EndpointRelation
+    columns:
+    - fieldName: entityId
+      columnName: entity_id
+      typeName: java.lang.String
+      ID: true
+    - fieldName: serviceId
+      columnName: service_id
+      typeName: int
+      ID: false
+    - fieldName: childServiceId
+      columnName: child_service_id
+      typeName: int
+      ID: false
+    - fieldName: serviceInstanceId
+      columnName: service_instance_id
+      typeName: int
+      ID: false
+    - fieldName: childServiceInstanceId
+      columnName: child_service_instance_id
+      typeName: int
+      ID: false
+  - name: DatabaseAccess
+    columns:
+    - fieldName: entityId
+      columnName: entity_id
+      typeName: java.lang.String
+      ID: true
diff --git a/oap-server/generated-analysis/src/main/resources/generator-scope-meta.yml b/oap-server/generated-analysis/src/main/resources/generator-scope-meta.yml
new file mode 100644
index 0000000..004a400
--- /dev/null
+++ b/oap-server/generated-analysis/src/main/resources/generator-scope-meta.yml
@@ -0,0 +1,136 @@
+# 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.
+
+scopes:
+  - name: All
+  - name: Service
+    columns:
+      - fieldName: entityId
+        columnName: entity_id
+        typeName: java.lang.String
+        ID: true
+  - name: ServiceInstance
+    columns:
+    - fieldName: entityId
+      columnName: entity_id
+      typeName: java.lang.String
+      ID: true
+    - fieldName: serviceId
+      columnName: service_id
+      typeName: int
+      ID: false
+  - name: Endpoint
+    columns:
+    - fieldName: entityId
+      columnName: entity_id
+      typeName: java.lang.String
+      ID: true
+    - fieldName: serviceId
+      columnName: service_id
+      typeName: int
+      ID: false
+    - fieldName: serviceInstanceId
+      columnName: service_instance_id
+      typeName: int
+      ID: false
+  - name: ServiceInstanceJVMCPU
+    columns:
+    - fieldName: entityId
+      columnName: entity_id
+      typeName: java.lang.String
+      ID: true
+    - fieldName: serviceInstanceId
+      columnName: service_instance_id
+      typeName: int
+      ID: false
+  - name: ServiceInstanceJVMMemory
+    columns:
+    - fieldName: entityId
+      columnName: entity_id
+      typeName: java.lang.String
+      ID: true
+    - fieldName: serviceInstanceId
+      columnName: service_instance_id
+      typeName: int
+      ID: false
+  - name: ServiceInstanceJVMMemoryPool
+    columns:
+    - fieldName: entityId
+      columnName: entity_id
+      typeName: java.lang.String
+      ID: true
+    - fieldName: serviceInstanceId
+      columnName: service_instance_id
+      typeName: int
+      ID: false
+  - name: ServiceInstanceJVMGC
+    columns:
+    - fieldName: entityId
+      columnName: entity_id
+      typeName: java.lang.String
+      ID: true
+    - fieldName: serviceInstanceId
+      columnName: service_instance_id
+      typeName: int
+      ID: false
+  - name: ServiceRelation
+    columns:
+    - fieldName: entityId
+      columnName: entity_id
+      typeName: java.lang.String
+      ID: true
+  - name: ServiceInstanceRelation
+    columns:
+    - fieldName: entityId
+      columnName: entity_id
+      typeName: java.lang.String
+      ID: true
+    - fieldName: sourceServiceId
+      columnName: source_service_id
+      typeName: int
+      ID: false
+    - fieldName: destServiceId
+      columnName: dest_service_id
+      typeName: int
+      ID: false
+  - name: EndpointRelation
+    columns:
+    - fieldName: entityId
+      columnName: entity_id
+      typeName: java.lang.String
+      ID: true
+    - fieldName: serviceId
+      columnName: service_id
+      typeName: int
+      ID: false
+    - fieldName: childServiceId
+      columnName: child_service_id
+      typeName: int
+      ID: false
+    - fieldName: serviceInstanceId
+      columnName: service_instance_id
+      typeName: int
+      ID: false
+    - fieldName: childServiceInstanceId
+      columnName: child_service_instance_id
+      typeName: int
+      ID: false
+  - name: DatabaseAccess
+    columns:
+    - fieldName: entityId
+      columnName: entity_id
+      typeName: java.lang.String
+      ID: true
diff --git a/oap-server/pom.xml b/oap-server/pom.xml
index f0869ae..77bc8a4 100644
--- a/oap-server/pom.xml
+++ b/oap-server/pom.xml
@@ -40,6 +40,7 @@
         <module>generated-analysis</module>
         <module>generate-tool</module>
         <module>server-telemetry</module>
+        <module>generate-tool-grammar</module>
     </modules>
 
     <properties>
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 b0cb665..5aa6494 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
@@ -25,6 +25,8 @@ import org.apache.skywalking.oap.server.core.alarm.IndicatorNotify;
 import org.apache.skywalking.oap.server.core.alarm.MetaInAlarm;
 import org.apache.skywalking.oap.server.core.analysis.indicator.Indicator;
 
+import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.*;
+
 public class NotifyHandler implements IndicatorNotify {
     private final AlarmCore core;
     private final Rules rules;
@@ -35,12 +37,12 @@ public class NotifyHandler implements IndicatorNotify {
     }
 
     @Override public void notify(MetaInAlarm meta, Indicator indicator) {
-        switch (meta.getScope()) {
-            case Service:
+        switch (meta.getScopeId()) {
+            case SERVICE:
                 break;
-            case ServiceInstance:
+            case SERVICE_INSTANCE:
                 break;
-            case Endpoint:
+            case ENDPOINT:
                 break;
             default:
                 return;
diff --git a/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/RunningRule.java b/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/RunningRule.java
index dd0659d..bf8ac47 100644
--- a/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/RunningRule.java
+++ b/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/RunningRule.java
@@ -30,7 +30,6 @@ import org.apache.skywalking.oap.server.core.analysis.indicator.DoubleValueHolde
 import org.apache.skywalking.oap.server.core.analysis.indicator.Indicator;
 import org.apache.skywalking.oap.server.core.analysis.indicator.IntValueHolder;
 import org.apache.skywalking.oap.server.core.analysis.indicator.LongValueHolder;
-import org.apache.skywalking.oap.server.core.source.Scope;
 import org.apache.skywalking.oap.server.library.util.CollectionUtils;
 import org.joda.time.LocalDateTime;
 import org.joda.time.Minutes;
@@ -57,7 +56,7 @@ public class RunningRule {
     private final int silencePeriod;
     private Map<MetaInAlarm, Window> windows;
     private volatile IndicatorValueType valueType;
-    private Scope targetScope;
+    private int targetScopeId;
     private List<String> includeNames;
     private AlarmMessageFormatter formatter;
 
@@ -111,7 +110,7 @@ public class RunningRule {
             } else {
                 return;
             }
-            targetScope = meta.getScope();
+            targetScopeId = meta.getScopeId();
         }
 
         if (valueType != null) {
@@ -147,7 +146,7 @@ public class RunningRule {
             Window window = entry.getValue();
             AlarmMessage alarmMessage = window.checkAlarm();
             if (alarmMessage != AlarmMessage.NONE) {
-                alarmMessage.setScope(meta.getScope());
+                alarmMessage.setScopeId(meta.getScopeId());
                 alarmMessage.setName(meta.getName());
                 alarmMessage.setId0(meta.getId0());
                 alarmMessage.setId1(meta.getId1());
diff --git a/oap-server/server-alarm-plugin/src/test/java/org/apache/skywalking/oap/server/core/alarm/provider/AlarmMessageFormatterTest.java b/oap-server/server-alarm-plugin/src/test/java/org/apache/skywalking/oap/server/core/alarm/provider/AlarmMessageFormatterTest.java
index 02a3699..5d96606 100644
--- a/oap-server/server-alarm-plugin/src/test/java/org/apache/skywalking/oap/server/core/alarm/provider/AlarmMessageFormatterTest.java
+++ b/oap-server/server-alarm-plugin/src/test/java/org/apache/skywalking/oap/server/core/alarm/provider/AlarmMessageFormatterTest.java
@@ -19,9 +19,7 @@
 package org.apache.skywalking.oap.server.core.alarm.provider;
 
 import org.apache.skywalking.oap.server.core.alarm.MetaInAlarm;
-import org.apache.skywalking.oap.server.core.source.Scope;
-import org.junit.Assert;
-import org.junit.Test;
+import org.junit.*;
 
 public class AlarmMessageFormatterTest {
     @Test
@@ -29,8 +27,8 @@ public class AlarmMessageFormatterTest {
         AlarmMessageFormatter formatter = new AlarmMessageFormatter("abc words {sdf");
         String message = formatter.format(new MetaInAlarm() {
 
-            @Override public Scope getScope() {
-                return null;
+            @Override public int getScopeId() {
+                return -1;
             }
 
             @Override public String getName() {
@@ -58,8 +56,8 @@ public class AlarmMessageFormatterTest {
         AlarmMessageFormatter formatter = new AlarmMessageFormatter("abc} words {name} - {id} .. {");
         String message = formatter.format(new MetaInAlarm() {
 
-            @Override public Scope getScope() {
-                return null;
+            @Override public int getScopeId() {
+                return -1;
             }
 
             @Override public String getName() {
diff --git a/oap-server/server-alarm-plugin/src/test/java/org/apache/skywalking/oap/server/core/alarm/provider/RunningRuleTest.java b/oap-server/server-alarm-plugin/src/test/java/org/apache/skywalking/oap/server/core/alarm/provider/RunningRuleTest.java
index 336e6df..371e6ef 100644
--- a/oap-server/server-alarm-plugin/src/test/java/org/apache/skywalking/oap/server/core/alarm/provider/RunningRuleTest.java
+++ b/oap-server/server-alarm-plugin/src/test/java/org/apache/skywalking/oap/server/core/alarm/provider/RunningRuleTest.java
@@ -18,22 +18,14 @@
 
 package org.apache.skywalking.oap.server.core.alarm.provider;
 
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import org.apache.skywalking.oap.server.core.alarm.AlarmCallback;
-import org.apache.skywalking.oap.server.core.alarm.AlarmMessage;
-import org.apache.skywalking.oap.server.core.alarm.MetaInAlarm;
-import org.apache.skywalking.oap.server.core.analysis.indicator.Indicator;
-import org.apache.skywalking.oap.server.core.analysis.indicator.IntValueHolder;
+import java.util.*;
+import org.apache.skywalking.oap.server.core.alarm.*;
+import org.apache.skywalking.oap.server.core.analysis.indicator.*;
 import org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData;
-import org.apache.skywalking.oap.server.core.source.Scope;
+import org.apache.skywalking.oap.server.core.source.DefaultScopeDefine;
 import org.joda.time.LocalDateTime;
-import org.joda.time.format.DateTimeFormat;
-import org.joda.time.format.DateTimeFormatter;
-import org.junit.Assert;
-import org.junit.Test;
+import org.joda.time.format.*;
+import org.junit.*;
 import org.powermock.reflect.Whitebox;
 
 /**
@@ -177,7 +169,7 @@ public class RunningRuleTest {
         Assert.assertEquals(0, runningRule.check().size()); //check matches, no alarm
         runningRule.moveTo(TIME_BUCKET_FORMATTER.parseLocalDateTime("201808301441"));
         // check at 201808301441
-        Assert.assertEquals(0,  runningRule.check().size()); //check matches, no alarm
+        Assert.assertEquals(0, runningRule.check().size()); //check matches, no alarm
         runningRule.moveTo(TIME_BUCKET_FORMATTER.parseLocalDateTime("201808301442"));
         // check at 201808301442
         Assert.assertNotEquals(0, runningRule.check().size()); //alarm
@@ -191,8 +183,8 @@ public class RunningRuleTest {
 
     private MetaInAlarm getMetaInAlarm(int id) {
         return new MetaInAlarm() {
-            @Override public Scope getScope() {
-                return Scope.Service;
+            @Override public int getScopeId() {
+                return DefaultScopeDefine.SERVICE;
             }
 
             @Override public String getName() {
diff --git a/oap-server/server-alarm-plugin/src/test/java/org/apache/skywalking/oap/server/core/alarm/provider/WebhookCallbackTest.java b/oap-server/server-alarm-plugin/src/test/java/org/apache/skywalking/oap/server/core/alarm/provider/WebhookCallbackTest.java
index e3ef8b5..097a77f 100644
--- a/oap-server/server-alarm-plugin/src/test/java/org/apache/skywalking/oap/server/core/alarm/provider/WebhookCallbackTest.java
+++ b/oap-server/server-alarm-plugin/src/test/java/org/apache/skywalking/oap/server/core/alarm/provider/WebhookCallbackTest.java
@@ -18,30 +18,17 @@
 
 package org.apache.skywalking.oap.server.core.alarm.provider;
 
-import com.google.gson.Gson;
-import com.google.gson.JsonArray;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
+import com.google.gson.*;
+import java.io.*;
 import java.net.InetSocketAddress;
-import java.util.ArrayList;
-import java.util.List;
-import javax.servlet.Servlet;
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import java.util.*;
+import javax.servlet.*;
+import javax.servlet.http.*;
 import org.apache.skywalking.oap.server.core.alarm.AlarmMessage;
-import org.apache.skywalking.oap.server.core.source.Scope;
+import org.apache.skywalking.oap.server.core.source.DefaultScopeDefine;
 import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.servlet.ServletContextHandler;
-import org.eclipse.jetty.servlet.ServletHolder;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
+import org.eclipse.jetty.servlet.*;
+import org.junit.*;
 
 public class WebhookCallbackTest implements Servlet {
     private Server server;
@@ -74,12 +61,12 @@ public class WebhookCallbackTest implements Servlet {
         WebhookCallback webhookCallback = new WebhookCallback(remoteEndpoints);
         List<AlarmMessage> alarmMessages = new ArrayList<>(2);
         AlarmMessage alarmMessage = new AlarmMessage();
-        alarmMessage.setScope(Scope.All);
-        alarmMessage.setAlarmMessage("alarmMessage with [Scope.All]");
+        alarmMessage.setScopeId(DefaultScopeDefine.ALL);
+        alarmMessage.setAlarmMessage("alarmMessage with [DefaultScopeDefine.All]");
         alarmMessages.add(alarmMessage);
         AlarmMessage anotherAlarmMessage = new AlarmMessage();
-        anotherAlarmMessage.setScope(Scope.Endpoint);
-        anotherAlarmMessage.setAlarmMessage("anotherAlarmMessage with [Scope.Endpoint]");
+        anotherAlarmMessage.setScopeId(DefaultScopeDefine.ENDPOINT);
+        anotherAlarmMessage.setAlarmMessage("anotherAlarmMessage with [DefaultScopeDefine.Endpoint]");
         alarmMessages.add(anotherAlarmMessage);
         webhookCallback.doAlarm(alarmMessages);
 
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleProvider.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleProvider.java
index f6db632..cb4160b 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleProvider.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleProvider.java
@@ -85,7 +85,15 @@ public class CoreModuleProvider extends ModuleProvider {
         return moduleConfig;
     }
 
-    @Override public void prepare() throws ServiceNotProvidedException {
+    @Override public void prepare() throws ServiceNotProvidedException, ModuleStartException {
+        AnnotationScan scopeScan = new AnnotationScan();
+        scopeScan.registerListener(new DefaultScopeDefine.Listener());
+        try {
+            scopeScan.scan(null);
+        } catch (IOException e) {
+            throw new ModuleStartException(e.getMessage(), e);
+        }
+
         grpcServer = new GRPCServer(moduleConfig.getGRPCHost(), moduleConfig.getGRPCPort());
         if (moduleConfig.getMaxConcurrentCallsPerConnection() > 0) {
             grpcServer.setMaxConcurrentCallsPerConnection(moduleConfig.getMaxConcurrentCallsPerConnection());
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/AlarmEntrance.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/AlarmEntrance.java
index 207ec3e..d673e46 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/AlarmEntrance.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/AlarmEntrance.java
@@ -21,14 +21,12 @@ package org.apache.skywalking.oap.server.core.alarm;
 import java.util.concurrent.locks.ReentrantLock;
 import org.apache.skywalking.oap.server.core.CoreModule;
 import org.apache.skywalking.oap.server.core.analysis.indicator.Indicator;
-import org.apache.skywalking.oap.server.core.cache.EndpointInventoryCache;
-import org.apache.skywalking.oap.server.core.cache.ServiceInstanceInventoryCache;
-import org.apache.skywalking.oap.server.core.cache.ServiceInventoryCache;
-import org.apache.skywalking.oap.server.core.register.EndpointInventory;
-import org.apache.skywalking.oap.server.core.register.ServiceInstanceInventory;
-import org.apache.skywalking.oap.server.core.register.ServiceInventory;
+import org.apache.skywalking.oap.server.core.cache.*;
+import org.apache.skywalking.oap.server.core.register.*;
 import org.apache.skywalking.oap.server.library.module.ModuleManager;
 
+import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.*;
+
 /**
  * @author wusheng
  */
@@ -56,7 +54,7 @@ public class AlarmEntrance {
 
         MetaInAlarm metaInAlarm;
         switch (alarmMeta.getScope()) {
-            case Service:
+            case SERVICE:
                 int serviceId = Integer.parseInt(alarmMeta.getId());
                 ServiceInventory serviceInventory = serviceInventoryCache.get(serviceId);
                 ServiceMetaInAlarm serviceMetaInAlarm = new ServiceMetaInAlarm();
@@ -65,7 +63,7 @@ public class AlarmEntrance {
                 serviceMetaInAlarm.setName(serviceInventory.getName());
                 metaInAlarm = serviceMetaInAlarm;
                 break;
-            case ServiceInstance:
+            case SERVICE_INSTANCE:
                 int serviceInstanceId = Integer.parseInt(alarmMeta.getId());
                 ServiceInstanceInventory serviceInstanceInventory = serviceInstanceInventoryCache.get(serviceInstanceId);
                 ServiceInstanceMetaInAlarm instanceMetaInAlarm = new ServiceInstanceMetaInAlarm();
@@ -74,7 +72,7 @@ public class AlarmEntrance {
                 instanceMetaInAlarm.setName(serviceInstanceInventory.getName());
                 metaInAlarm = instanceMetaInAlarm;
                 break;
-            case Endpoint:
+            case ENDPOINT:
                 int endpointId = Integer.parseInt(alarmMeta.getId());
                 EndpointInventory endpointInventory = endpointInventoryCache.get(endpointId);
                 EndpointMetaInAlarm endpointMetaInAlarm = new EndpointMetaInAlarm();
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 051e761..4eb1dd7 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
@@ -19,7 +19,6 @@
 package org.apache.skywalking.oap.server.core.alarm;
 
 import lombok.*;
-import org.apache.skywalking.oap.server.core.source.Scope;
 
 /**
  * Alarm message represents the details of each alarm.
@@ -32,7 +31,7 @@ public class AlarmMessage {
 
     public static AlarmMessage NONE = new NoAlarm();
 
-    private Scope scope;
+    private int scopeId;
     private String name;
     private int id0;
     private int id1;
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/AlarmMeta.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/AlarmMeta.java
index 82cc939..c751df0 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/AlarmMeta.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/AlarmMeta.java
@@ -18,26 +18,24 @@
 
 package org.apache.skywalking.oap.server.core.alarm;
 
-import lombok.Getter;
-import lombok.Setter;
+import lombok.*;
 import org.apache.skywalking.oap.server.core.Const;
-import org.apache.skywalking.oap.server.core.source.Scope;
 
 /**
  * @author wusheng
  */
 public class AlarmMeta {
     @Setter @Getter private String indicatorName;
-    @Setter @Getter private Scope scope;
+    @Setter @Getter private int scope;
     @Setter @Getter private String id;
 
-    public AlarmMeta(String indicatorName, Scope scope) {
+    public AlarmMeta(String indicatorName, int scope) {
         this.indicatorName = indicatorName;
         this.scope = scope;
         this.id = Const.EMPTY_STRING;
     }
 
-    public AlarmMeta(String indicatorName, Scope scope, String id) {
+    public AlarmMeta(String indicatorName, int scope, String id) {
         this.indicatorName = indicatorName;
         this.scope = scope;
         this.id = id;
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/AlarmRecord.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/AlarmRecord.java
index 9257829..f7abbff 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/AlarmRecord.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/AlarmRecord.java
@@ -23,17 +23,20 @@ import lombok.*;
 import org.apache.skywalking.oap.server.core.Const;
 import org.apache.skywalking.oap.server.core.analysis.record.Record;
 import org.apache.skywalking.oap.server.core.analysis.record.annotation.RecordType;
-import org.apache.skywalking.oap.server.core.source.Scope;
+import org.apache.skywalking.oap.server.core.source.*;
 import org.apache.skywalking.oap.server.core.storage.StorageBuilder;
 import org.apache.skywalking.oap.server.core.storage.annotation.*;
 
+import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.ALARM;
+
 /**
  * @author peng-yongsheng
  */
 @Getter
 @Setter
 @RecordType
-@StorageEntity(name = AlarmRecord.INDEX_NAME, builder = AlarmRecord.Builder.class, source = Scope.Alarm)
+@ScopeDeclaration(id = ALARM, name = "Alarm")
+@StorageEntity(name = AlarmRecord.INDEX_NAME, builder = AlarmRecord.Builder.class, sourceScopeId = DefaultScopeDefine.ALARM)
 public class AlarmRecord extends Record {
 
     public static final String INDEX_NAME = "alarm_record";
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/AlarmStandardPersistence.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/AlarmStandardPersistence.java
index 2fec9ae..326affc 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/AlarmStandardPersistence.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/AlarmStandardPersistence.java
@@ -39,7 +39,7 @@ public class AlarmStandardPersistence implements AlarmCallback {
             }
 
             AlarmRecord record = new AlarmRecord();
-            record.setScope(message.getScope().ordinal());
+            record.setScope(message.getScopeId());
             record.setId0(message.getId0());
             record.setId1(message.getId1());
             record.setName(message.getName());
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 10b859f..6438c68 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
@@ -21,7 +21,7 @@ package org.apache.skywalking.oap.server.core.alarm;
 import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.Setter;
-import org.apache.skywalking.oap.server.core.source.Scope;
+import org.apache.skywalking.oap.server.core.source.DefaultScopeDefine;
 
 @Getter(AccessLevel.PUBLIC)
 @Setter(AccessLevel.PUBLIC)
@@ -33,8 +33,8 @@ public class EndpointMetaInAlarm extends MetaInAlarm {
     private String[] tags;
     private String[] properties;
 
-    @Override public Scope getScope() {
-        return Scope.Endpoint;
+    @Override public int getScopeId() {
+        return DefaultScopeDefine.ENDPOINT;
     }
 
     @Override public int getId0() {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/MetaInAlarm.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/MetaInAlarm.java
index 7fe9ea2..0d55f07 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/MetaInAlarm.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/alarm/MetaInAlarm.java
@@ -19,10 +19,9 @@
 package org.apache.skywalking.oap.server.core.alarm;
 
 import java.util.Objects;
-import org.apache.skywalking.oap.server.core.source.Scope;
 
 public abstract class MetaInAlarm {
-    public abstract Scope getScope();
+    public abstract int getScopeId();
 
     public abstract String getName();
 
@@ -30,7 +29,7 @@ public abstract class MetaInAlarm {
 
     /**
      * In most scopes, there is only id0, as primary id. Such as Service, Endpoint. But in relation, the ID includes
-     * two, actually. Such as ServiceRelation, id0 represents the source service id
+     * two, actually. Such as ServiceRelation, id0 represents the sourceScopeId service id
      *
      * @return the primary id.
      */
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 4c8862a..09fca31 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
@@ -21,7 +21,7 @@ package org.apache.skywalking.oap.server.core.alarm;
 import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.Setter;
-import org.apache.skywalking.oap.server.core.source.Scope;
+import org.apache.skywalking.oap.server.core.source.DefaultScopeDefine;
 
 @Getter(AccessLevel.PUBLIC)
 @Setter(AccessLevel.PUBLIC)
@@ -33,8 +33,8 @@ public class ServiceInstanceMetaInAlarm extends MetaInAlarm {
     private String[] tags;
     private String[] properties;
 
-    @Override public Scope getScope() {
-        return Scope.ServiceInstance;
+    @Override public int getScopeId() {
+        return DefaultScopeDefine.SERVICE_INSTANCE;
     }
 
     @Override public int getId0() {
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 e8359ed..192b118 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
@@ -21,7 +21,7 @@ package org.apache.skywalking.oap.server.core.alarm;
 import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.Setter;
-import org.apache.skywalking.oap.server.core.source.Scope;
+import org.apache.skywalking.oap.server.core.source.DefaultScopeDefine;
 
 @Getter(AccessLevel.PUBLIC)
 @Setter(AccessLevel.PUBLIC)
@@ -33,8 +33,8 @@ public class ServiceMetaInAlarm extends MetaInAlarm {
     private String[] tags;
     private String[] properties;
 
-    @Override public Scope getScope() {
-        return Scope.Service;
+    @Override public int getScopeId() {
+        return DefaultScopeDefine.SERVICE;
     }
 
     @Override public int getId0() {
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 61602a6..f84ee9d 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
@@ -21,17 +21,11 @@ package org.apache.skywalking.oap.server.core.analysis;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.reflect.ClassPath;
 import java.io.IOException;
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.lang.reflect.*;
+import java.util.*;
 import org.apache.skywalking.oap.server.core.UnexpectedException;
-import org.apache.skywalking.oap.server.core.source.Scope;
 import org.apache.skywalking.oap.server.core.source.Source;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.slf4j.*;
 
 /**
  * @author peng-yongsheng, wusheng
@@ -40,7 +34,7 @@ public class DispatcherManager {
 
     private static final Logger logger = LoggerFactory.getLogger(DispatcherManager.class);
 
-    private Map<Scope, List<SourceDispatcher>> dispatcherMap;
+    private Map<Integer, List<SourceDispatcher>> dispatcherMap;
 
     public DispatcherManager() {
         this.dispatcherMap = new HashMap<>();
@@ -51,8 +45,17 @@ public class DispatcherManager {
             return;
         }
 
-        for (SourceDispatcher dispatcher : dispatcherMap.get(source.scope())) {
-            dispatcher.dispatch(source);
+        List<SourceDispatcher> dispatchers = dispatcherMap.get(source.scope());
+
+        /**
+         * Dispatcher is only generated by oal script analysis result.
+         * So these will/could be possible, the given source doesn't have the dispatcher,
+         * when the receiver is open, and oal script doesn't ask for analysis.
+         */
+        if (dispatchers != null) {
+            for (SourceDispatcher dispatcher : dispatchers) {
+                dispatcher.dispatch(source);
+            }
         }
     }
 
@@ -93,17 +96,17 @@ public class DispatcherManager {
                         Source dispatcherSource = (Source)source;
                         SourceDispatcher dispatcher = (SourceDispatcher)aClass.newInstance();
 
-                        Scope scope = dispatcherSource.scope();
+                        int scopeId = dispatcherSource.scope();
 
-                        List<SourceDispatcher> dispatchers = this.dispatcherMap.get(scope);
+                        List<SourceDispatcher> dispatchers = this.dispatcherMap.get(scopeId);
                         if (dispatchers == null) {
                             dispatchers = new ArrayList<>();
-                            this.dispatcherMap.put(scope, dispatchers);
+                            this.dispatcherMap.put(scopeId, dispatchers);
                         }
 
                         dispatchers.add(dispatcher);
 
-                        logger.info("Dispatcher {} is added into Scope {}.", dispatcher.getClass().getName(), scope);
+                        logger.info("Dispatcher {} is added into DefaultScopeDefine {}.", dispatcher.getClass().getName(), scopeId);
                     }
                 }
             }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/database/TopNDatabaseStatement.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/database/TopNDatabaseStatement.java
index 2456486..7ea0ca4 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/database/TopNDatabaseStatement.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/database/TopNDatabaseStatement.java
@@ -20,10 +20,9 @@ package org.apache.skywalking.oap.server.core.analysis.manual.database;
 
 import java.util.*;
 import lombok.*;
-import org.apache.skywalking.oap.server.core.*;
 import org.apache.skywalking.oap.server.core.analysis.topn.TopN;
 import org.apache.skywalking.oap.server.core.analysis.topn.annotation.TopNType;
-import org.apache.skywalking.oap.server.core.source.Scope;
+import org.apache.skywalking.oap.server.core.source.DefaultScopeDefine;
 import org.apache.skywalking.oap.server.core.storage.StorageBuilder;
 import org.apache.skywalking.oap.server.core.storage.annotation.*;
 
@@ -33,7 +32,7 @@ import org.apache.skywalking.oap.server.core.storage.annotation.*;
  * @author wusheng
  */
 @TopNType
-@StorageEntity(name = TopNDatabaseStatement.INDEX_NAME, builder = TopNDatabaseStatement.Builder.class, source = Scope.DatabaseSlowStatement)
+@StorageEntity(name = TopNDatabaseStatement.INDEX_NAME, builder = TopNDatabaseStatement.Builder.class, sourceScopeId = DefaultScopeDefine.DATABASE_SLOW_STATEMENT)
 public class TopNDatabaseStatement extends TopN {
     public static final String INDEX_NAME = "top_n_database_statement";
 
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/endpointrelation/EndpointRelationServerSideIndicator.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/endpointrelation/EndpointRelationServerSideIndicator.java
index 78d6139..3e6a1e3 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/endpointrelation/EndpointRelationServerSideIndicator.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/endpointrelation/EndpointRelationServerSideIndicator.java
@@ -25,13 +25,13 @@ import org.apache.skywalking.oap.server.core.analysis.indicator.Indicator;
 import org.apache.skywalking.oap.server.core.analysis.indicator.annotation.IndicatorType;
 import org.apache.skywalking.oap.server.core.remote.annotation.StreamData;
 import org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData;
-import org.apache.skywalking.oap.server.core.source.Scope;
+import org.apache.skywalking.oap.server.core.source.DefaultScopeDefine;
 import org.apache.skywalking.oap.server.core.storage.StorageBuilder;
 import org.apache.skywalking.oap.server.core.storage.annotation.*;
 
 @IndicatorType
 @StreamData
-@StorageEntity(name = EndpointRelationServerSideIndicator.INDEX_NAME, builder = EndpointRelationServerSideIndicator.Builder.class, source = Scope.EndpointRelation)
+@StorageEntity(name = EndpointRelationServerSideIndicator.INDEX_NAME, builder = EndpointRelationServerSideIndicator.Builder.class, sourceScopeId = DefaultScopeDefine.ENDPOINT_RELATION)
 public class EndpointRelationServerSideIndicator extends Indicator {
 
     public static final String INDEX_NAME = "endpoint_relation_server_side";
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/segment/SegmentRecord.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/segment/SegmentRecord.java
index b98e774..ae1b56c 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/segment/SegmentRecord.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/segment/SegmentRecord.java
@@ -24,7 +24,7 @@ import org.apache.skywalking.apm.util.StringUtil;
 import org.apache.skywalking.oap.server.core.Const;
 import org.apache.skywalking.oap.server.core.analysis.record.Record;
 import org.apache.skywalking.oap.server.core.analysis.record.annotation.RecordType;
-import org.apache.skywalking.oap.server.core.source.Scope;
+import org.apache.skywalking.oap.server.core.source.DefaultScopeDefine;
 import org.apache.skywalking.oap.server.core.storage.StorageBuilder;
 import org.apache.skywalking.oap.server.core.storage.annotation.*;
 import org.apache.skywalking.oap.server.library.util.CollectionUtils;
@@ -33,7 +33,7 @@ import org.apache.skywalking.oap.server.library.util.CollectionUtils;
  * @author peng-yongsheng
  */
 @RecordType
-@StorageEntity(name = SegmentRecord.INDEX_NAME, builder = SegmentRecord.Builder.class, source = Scope.Segment)
+@StorageEntity(name = SegmentRecord.INDEX_NAME, builder = SegmentRecord.Builder.class, sourceScopeId = DefaultScopeDefine.SEGMENT)
 public class SegmentRecord extends Record {
 
     public static final String INDEX_NAME = "segment";
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/servicerelation/ServiceRelationClientSideIndicator.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/servicerelation/ServiceRelationClientSideIndicator.java
index b0f1855..7e740da 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/servicerelation/ServiceRelationClientSideIndicator.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/servicerelation/ServiceRelationClientSideIndicator.java
@@ -25,13 +25,13 @@ import org.apache.skywalking.oap.server.core.analysis.indicator.Indicator;
 import org.apache.skywalking.oap.server.core.analysis.indicator.annotation.IndicatorType;
 import org.apache.skywalking.oap.server.core.remote.annotation.StreamData;
 import org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData;
-import org.apache.skywalking.oap.server.core.source.Scope;
+import org.apache.skywalking.oap.server.core.source.DefaultScopeDefine;
 import org.apache.skywalking.oap.server.core.storage.StorageBuilder;
 import org.apache.skywalking.oap.server.core.storage.annotation.*;
 
 @IndicatorType
 @StreamData
-@StorageEntity(name = ServiceRelationClientSideIndicator.INDEX_NAME, builder = ServiceRelationClientSideIndicator.Builder.class, source = Scope.ServiceRelation)
+@StorageEntity(name = ServiceRelationClientSideIndicator.INDEX_NAME, builder = ServiceRelationClientSideIndicator.Builder.class, sourceScopeId = DefaultScopeDefine.SERVICE_RELATION)
 public class ServiceRelationClientSideIndicator extends Indicator {
 
     public static final String INDEX_NAME = "service_relation_client_side";
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/servicerelation/ServiceRelationServerSideIndicator.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/servicerelation/ServiceRelationServerSideIndicator.java
index e24cc61..3dea780 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/servicerelation/ServiceRelationServerSideIndicator.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/servicerelation/ServiceRelationServerSideIndicator.java
@@ -25,14 +25,14 @@ import org.apache.skywalking.oap.server.core.analysis.indicator.Indicator;
 import org.apache.skywalking.oap.server.core.analysis.indicator.annotation.IndicatorType;
 import org.apache.skywalking.oap.server.core.remote.annotation.StreamData;
 import org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData;
-import org.apache.skywalking.oap.server.core.source.Scope;
+import org.apache.skywalking.oap.server.core.source.DefaultScopeDefine;
 import org.apache.skywalking.oap.server.core.storage.StorageBuilder;
 import org.apache.skywalking.oap.server.core.storage.annotation.*;
 
 @IndicatorType
 @StreamData
 @StorageEntity(name = ServiceRelationServerSideIndicator.INDEX_NAME, builder = ServiceRelationServerSideIndicator.Builder.class,
-    source = Scope.ServiceRelation)
+    sourceScopeId = DefaultScopeDefine.SERVICE_RELATION)
 public class ServiceRelationServerSideIndicator extends Indicator {
 
     public static final String INDEX_NAME = "service_relation_server_side";
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/annotation/AnnotationScan.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/annotation/AnnotationScan.java
index 7d9cd8a..3d70fd4 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/annotation/AnnotationScan.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/annotation/AnnotationScan.java
@@ -56,7 +56,9 @@ public class AnnotationScan {
             listener.complete()
         );
 
-        callBack.run();
+        if (callBack != null) {
+            callBack.run();
+        }
     }
 
     public class AnnotationListenerCache {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/AlarmQueryService.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/AlarmQueryService.java
index 9533cbe..30a30aa 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/AlarmQueryService.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/AlarmQueryService.java
@@ -20,7 +20,6 @@ package org.apache.skywalking.oap.server.core.query;
 
 import java.io.IOException;
 import org.apache.skywalking.oap.server.core.query.entity.*;
-import org.apache.skywalking.oap.server.core.source.Scope;
 import org.apache.skywalking.oap.server.core.storage.StorageModule;
 import org.apache.skywalking.oap.server.core.storage.query.IAlarmQueryDAO;
 import org.apache.skywalking.oap.server.library.module.*;
@@ -48,9 +47,9 @@ public class AlarmQueryService implements Service {
         return alarmQueryDAO;
     }
 
-    public Alarms getAlarm(final Scope scope, final String keyword, final Pagination paging, final long startTB,
+    public Alarms getAlarm(final Integer scopeId, final String keyword, final Pagination paging, final long startTB,
         final long endTB) throws IOException {
         PaginationUtils.Page page = PaginationUtils.INSTANCE.exchange(paging);
-        return getAlarmQueryDAO().getAlarm(scope, keyword, page.getLimit(), page.getFrom(), startTB, endTB);
+        return getAlarmQueryDAO().getAlarm(scopeId, keyword, page.getLimit(), page.getFrom(), startTB, endTB);
     }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/AlarmMessage.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/AlarmMessage.java
index 99bf234..b179378 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/AlarmMessage.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/AlarmMessage.java
@@ -19,7 +19,6 @@
 package org.apache.skywalking.oap.server.core.query.entity;
 
 import lombok.*;
-import org.apache.skywalking.oap.server.core.source.Scope;
 
 /**
  * @author peng-yongsheng
@@ -28,6 +27,7 @@ import org.apache.skywalking.oap.server.core.source.Scope;
 @Setter
 public class AlarmMessage {
     private Scope scope;
+    private int scopeId;
     private String id;
     private String message;
     private Long startTime;
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Scope.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Scope.java
new file mode 100644
index 0000000..be8b793
--- /dev/null
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Scope.java
@@ -0,0 +1,57 @@
+/*
+ * 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.query.entity;
+
+import java.util.HashMap;
+import lombok.Getter;
+import org.apache.skywalking.oap.server.core.UnexpectedException;
+import org.apache.skywalking.oap.server.core.source.DefaultScopeDefine;
+
+/**
+ * @author wusheng
+ */
+public enum Scope {
+    Service(DefaultScopeDefine.SERVICE),
+    ServiceInstance(DefaultScopeDefine.SERVICE_INSTANCE),
+    Endpoint(DefaultScopeDefine.ENDPOINT),
+    ServiceRelation(DefaultScopeDefine.SERVICE_RELATION),
+    ServiceInstanceRelation(DefaultScopeDefine.SERVICE_INSTANCE_RELATION),
+    EndpointRelation(DefaultScopeDefine.ENDPOINT_RELATION);
+
+    @Getter
+    private int scopeId;
+
+    Scope(int scopeId) {
+        this.scopeId = scopeId;
+        Finder.ALL_QUERY_SCOPES.put(scopeId, this);
+    }
+
+    public static class Finder {
+        private static HashMap<Integer, Scope> ALL_QUERY_SCOPES = new HashMap<>();
+
+        public static Scope valueOf(int scopeId) {
+            Scope scope = ALL_QUERY_SCOPES.get(scopeId);
+            if (scope == null) {
+                throw new UnexpectedException("Can't find scope id =" + scopeId);
+            }
+            return scope;
+        }
+    }
+
+}
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/EndpointInventory.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/EndpointInventory.java
index a643623..89e8b0b 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/EndpointInventory.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/EndpointInventory.java
@@ -24,17 +24,20 @@ import org.apache.skywalking.oap.server.core.Const;
 import org.apache.skywalking.oap.server.core.register.annotation.InventoryType;
 import org.apache.skywalking.oap.server.core.remote.annotation.StreamData;
 import org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData;
-import org.apache.skywalking.oap.server.core.source.Scope;
+import org.apache.skywalking.oap.server.core.source.*;
 import org.apache.skywalking.oap.server.core.storage.StorageBuilder;
 import org.apache.skywalking.oap.server.core.storage.annotation.*;
 import org.elasticsearch.common.Strings;
 
+import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.ENDPOINT_INVENTORY;
+
 /**
  * @author peng-yongsheng
  */
 @InventoryType
 @StreamData
-@StorageEntity(name = EndpointInventory.MODEL_NAME, builder = EndpointInventory.Builder.class, deleteHistory = false, source = Scope.EndpointInventory)
+@ScopeDeclaration(id = ENDPOINT_INVENTORY, name = "EndpointInventory")
+@StorageEntity(name = EndpointInventory.MODEL_NAME, builder = EndpointInventory.Builder.class, deleteHistory = false, sourceScopeId = DefaultScopeDefine.ENDPOINT_INVENTORY)
 public class EndpointInventory extends RegisterSource {
 
     public static final String MODEL_NAME = "endpoint_inventory";
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/NetworkAddressInventory.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/NetworkAddressInventory.java
index 4572e3d..1510c29 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/NetworkAddressInventory.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/NetworkAddressInventory.java
@@ -24,17 +24,20 @@ import org.apache.skywalking.oap.server.core.Const;
 import org.apache.skywalking.oap.server.core.register.annotation.InventoryType;
 import org.apache.skywalking.oap.server.core.remote.annotation.StreamData;
 import org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData;
-import org.apache.skywalking.oap.server.core.source.Scope;
+import org.apache.skywalking.oap.server.core.source.*;
 import org.apache.skywalking.oap.server.core.storage.StorageBuilder;
 import org.apache.skywalking.oap.server.core.storage.annotation.*;
 import org.elasticsearch.common.Strings;
 
+import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.NETWORK_ADDRESS;
+
 /**
  * @author peng-yongsheng
  */
 @InventoryType
 @StreamData
-@StorageEntity(name = NetworkAddressInventory.MODEL_NAME, builder = NetworkAddressInventory.Builder.class, deleteHistory = false, source = Scope.NetworkAddress)
+@ScopeDeclaration(id = NETWORK_ADDRESS, name = "NetworkAddress")
+@StorageEntity(name = NetworkAddressInventory.MODEL_NAME, builder = NetworkAddressInventory.Builder.class, deleteHistory = false, sourceScopeId = DefaultScopeDefine.NETWORK_ADDRESS)
 public class NetworkAddressInventory extends RegisterSource {
 
     public static final String MODEL_NAME = "network_address_inventory";
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/ServiceInstanceInventory.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/ServiceInstanceInventory.java
index 196a674..ca49439 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/ServiceInstanceInventory.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/ServiceInstanceInventory.java
@@ -26,18 +26,21 @@ import org.apache.skywalking.oap.server.core.Const;
 import org.apache.skywalking.oap.server.core.register.annotation.InventoryType;
 import org.apache.skywalking.oap.server.core.remote.annotation.StreamData;
 import org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData;
-import org.apache.skywalking.oap.server.core.source.Scope;
+import org.apache.skywalking.oap.server.core.source.*;
 import org.apache.skywalking.oap.server.core.storage.StorageBuilder;
 import org.apache.skywalking.oap.server.core.storage.annotation.*;
 import org.apache.skywalking.oap.server.library.util.BooleanUtils;
 import org.elasticsearch.common.Strings;
 
+import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.SERVICE_INSTANCE_INVENTORY;
+
 /**
  * @author peng-yongsheng
  */
 @InventoryType
 @StreamData
-@StorageEntity(name = ServiceInstanceInventory.MODEL_NAME, builder = ServiceInstanceInventory.Builder.class, deleteHistory = false, source = Scope.ServiceInstanceInventory)
+@ScopeDeclaration(id = SERVICE_INSTANCE_INVENTORY, name = "ServiceInstanceInventory")
+@StorageEntity(name = ServiceInstanceInventory.MODEL_NAME, builder = ServiceInstanceInventory.Builder.class, deleteHistory = false, sourceScopeId = DefaultScopeDefine.SERVICE_INSTANCE_INVENTORY)
 public class ServiceInstanceInventory extends RegisterSource {
 
     public static final String MODEL_NAME = "service_instance_inventory";
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/ServiceInventory.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/ServiceInventory.java
index f8b3546..bcdee42 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/ServiceInventory.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/ServiceInventory.java
@@ -25,18 +25,21 @@ import org.apache.skywalking.oap.server.core.Const;
 import org.apache.skywalking.oap.server.core.register.annotation.InventoryType;
 import org.apache.skywalking.oap.server.core.remote.annotation.StreamData;
 import org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData;
-import org.apache.skywalking.oap.server.core.source.Scope;
+import org.apache.skywalking.oap.server.core.source.*;
 import org.apache.skywalking.oap.server.core.storage.StorageBuilder;
 import org.apache.skywalking.oap.server.core.storage.annotation.*;
 import org.apache.skywalking.oap.server.library.util.BooleanUtils;
 import org.elasticsearch.common.Strings;
 
+import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.SERVICE_INVENTORY;
+
 /**
  * @author peng-yongsheng
  */
 @InventoryType
 @StreamData
-@StorageEntity(name = ServiceInventory.MODEL_NAME, builder = ServiceInventory.Builder.class, deleteHistory = false, source = Scope.ServiceInventory)
+@ScopeDeclaration(id = SERVICE_INVENTORY, name = "ServiceInventory")
+@StorageEntity(name = ServiceInventory.MODEL_NAME, builder = ServiceInventory.Builder.class, deleteHistory = false, sourceScopeId = DefaultScopeDefine.SERVICE_INVENTORY)
 public class ServiceInventory extends RegisterSource {
 
     public static final String MODEL_NAME = "service_inventory";
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/worker/InventoryProcess.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/worker/InventoryProcess.java
index cd6f35f..ab7e83b 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/worker/InventoryProcess.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/worker/InventoryProcess.java
@@ -18,20 +18,12 @@
 
 package org.apache.skywalking.oap.server.core.register.worker;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import org.apache.skywalking.oap.server.core.UnexpectedException;
 import org.apache.skywalking.oap.server.core.register.RegisterSource;
-import org.apache.skywalking.oap.server.core.source.Scope;
-import org.apache.skywalking.oap.server.core.storage.IRegisterDAO;
-import org.apache.skywalking.oap.server.core.storage.StorageBuilder;
-import org.apache.skywalking.oap.server.core.storage.StorageDAO;
-import org.apache.skywalking.oap.server.core.storage.StorageModule;
+import org.apache.skywalking.oap.server.core.storage.*;
 import org.apache.skywalking.oap.server.core.storage.annotation.StorageEntityAnnotationUtils;
-import org.apache.skywalking.oap.server.core.worker.WorkerIdGenerator;
-import org.apache.skywalking.oap.server.core.worker.WorkerInstances;
+import org.apache.skywalking.oap.server.core.worker.*;
 import org.apache.skywalking.oap.server.library.module.ModuleManager;
 
 /**
@@ -48,7 +40,7 @@ public enum InventoryProcess {
 
     public void create(ModuleManager moduleManager, Class<? extends RegisterSource> inventoryClass) {
         String modelName = StorageEntityAnnotationUtils.getModelName(inventoryClass);
-        Scope scope = StorageEntityAnnotationUtils.getSourceScope(inventoryClass);
+        int scopeId = StorageEntityAnnotationUtils.getSourceScope(inventoryClass);
 
         Class<? extends StorageBuilder> builderClass = StorageEntityAnnotationUtils.getBuilder(inventoryClass);
 
@@ -60,7 +52,7 @@ public enum InventoryProcess {
             throw new UnexpectedException("");
         }
 
-        RegisterPersistentWorker persistentWorker = new RegisterPersistentWorker(WorkerIdGenerator.INSTANCES.generate(), modelName, moduleManager, registerDAO, scope);
+        RegisterPersistentWorker persistentWorker = new RegisterPersistentWorker(WorkerIdGenerator.INSTANCES.generate(), modelName, moduleManager, registerDAO, scopeId);
         WorkerInstances.INSTANCES.put(persistentWorker.getWorkerId(), persistentWorker);
 
         RegisterRemoteWorker remoteWorker = new RegisterRemoteWorker(WorkerIdGenerator.INSTANCES.generate(), moduleManager, persistentWorker);
@@ -73,7 +65,7 @@ public enum InventoryProcess {
     }
 
     /**
-     * @return all register source class types
+     * @return all register sourceScopeId class types
      */
     public List<Class> getAllRegisterSources() {
         List allSources = new ArrayList<>();
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/worker/RegisterPersistentWorker.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/worker/RegisterPersistentWorker.java
index 2bd11e5..3cbfc93 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/worker/RegisterPersistentWorker.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/register/worker/RegisterPersistentWorker.java
@@ -24,7 +24,7 @@ import org.apache.skywalking.apm.commons.datacarrier.consumer.*;
 import org.apache.skywalking.oap.server.core.*;
 import org.apache.skywalking.oap.server.core.analysis.data.EndOfBatchContext;
 import org.apache.skywalking.oap.server.core.register.RegisterSource;
-import org.apache.skywalking.oap.server.core.source.Scope;
+import org.apache.skywalking.oap.server.core.source.DefaultScopeDefine;
 import org.apache.skywalking.oap.server.core.storage.*;
 import org.apache.skywalking.oap.server.core.worker.AbstractWorker;
 import org.apache.skywalking.oap.server.library.module.ModuleManager;
@@ -37,7 +37,7 @@ public class RegisterPersistentWorker extends AbstractWorker<RegisterSource> {
 
     private static final Logger logger = LoggerFactory.getLogger(RegisterPersistentWorker.class);
 
-    private final Scope scope;
+    private final int scopeId;
     private final String modelName;
     private final Map<RegisterSource, RegisterSource> sources;
     private final IRegisterLockDAO registerLockDAO;
@@ -45,13 +45,13 @@ public class RegisterPersistentWorker extends AbstractWorker<RegisterSource> {
     private final DataCarrier<RegisterSource> dataCarrier;
 
     RegisterPersistentWorker(int workerId, String modelName, ModuleManager moduleManager,
-        IRegisterDAO registerDAO, Scope scope) {
+        IRegisterDAO registerDAO, int scopeId) {
         super(workerId);
         this.modelName = modelName;
         this.sources = new HashMap<>();
         this.registerDAO = registerDAO;
         this.registerLockDAO = moduleManager.find(StorageModule.NAME).provider().getService(IRegisterLockDAO.class);
-        this.scope = scope;
+        this.scopeId = scopeId;
         this.dataCarrier = new DataCarrier<>("IndicatorPersistentWorker." + modelName, 1, 1000);
 
         String name = "REGISTER_L2";
@@ -91,7 +91,7 @@ public class RegisterPersistentWorker extends AbstractWorker<RegisterSource> {
                         }
                     } else {
                         int sequence;
-                        if ((sequence = registerLockDAO.getId(scope, registerSource)) != Const.NONE) {
+                        if ((sequence = registerLockDAO.getId(scopeId, registerSource)) != Const.NONE) {
                             try {
                                 dbSource = registerDAO.get(modelName, source.id());
                                 if (Objects.nonNull(dbSource)) {
@@ -106,7 +106,7 @@ public class RegisterPersistentWorker extends AbstractWorker<RegisterSource> {
                                 logger.error(t.getMessage(), t);
                             }
                         } else {
-                            logger.info("{} inventory register try lock and increment sequence failure.", scope.name());
+                            logger.info("{} inventory register try lock and increment sequence failure.", DefaultScopeDefine.nameOf(scopeId));
                         }
                     }
                 } catch (Throwable t) {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/All.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/All.java
index 0be4324..ea2830b 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/All.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/All.java
@@ -18,17 +18,16 @@
 
 package org.apache.skywalking.oap.server.core.source;
 
-import lombok.Getter;
-import lombok.Setter;
-import org.apache.skywalking.oap.server.core.source.annotation.SourceType;
+import lombok.*;
 
-@SourceType
+import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.ALL;
+
+@ScopeDeclaration(id = ALL, name = "All")
 public class All extends Source {
-    @Override public Scope scope() {
-        return Scope.All;
+    @Override public int scope() {
+        return DefaultScopeDefine.ALL;
     }
 
-
     @Override public String getEntityId() {
         return "";
     }
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 0bb1e9d..67a17fb 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
@@ -18,17 +18,19 @@
 
 package org.apache.skywalking.oap.server.core.source;
 
-import lombok.Getter;
-import lombok.Setter;
+import lombok.*;
+
+import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.DATABASE_ACCESS;
 
 /**
  * @author: liuhaoyang
  */
+@ScopeDeclaration(id = DATABASE_ACCESS, name = "DatabaseAccess")
 public class DatabaseAccess extends Source {
 
     @Override
-    public Scope scope() {
-        return Scope.DatabaseAccess;
+    public int scope() {
+        return DefaultScopeDefine.DATABASE_ACCESS;
     }
 
     @Override
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/DatabaseSlowStatement.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/DatabaseSlowStatement.java
index 254a5e7..667d413 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/DatabaseSlowStatement.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/DatabaseSlowStatement.java
@@ -20,12 +20,13 @@ package org.apache.skywalking.oap.server.core.source;
 
 import lombok.*;
 import org.apache.skywalking.oap.server.core.Const;
-import org.apache.skywalking.oap.server.core.source.annotation.SourceType;
+
+import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.DATABASE_SLOW_STATEMENT;
 
 /**
  * @author wusheng
  */
-@SourceType
+@ScopeDeclaration(id = DATABASE_SLOW_STATEMENT, name = "DatabaseSlowStatement")
 public class DatabaseSlowStatement extends Source {
     @Getter @Setter private String id;
     @Getter @Setter private int databaseServiceId;
@@ -33,8 +34,8 @@ public class DatabaseSlowStatement extends Source {
     @Getter @Setter private long latency;
     @Getter @Setter private String traceId;
 
-    @Override public Scope scope() {
-        return Scope.DatabaseSlowStatement;
+    @Override public int scope() {
+        return DefaultScopeDefine.DATABASE_SLOW_STATEMENT;
     }
 
     @Override public String getEntityId() {
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
new file mode 100644
index 0000000..4bf9b6d
--- /dev/null
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/DefaultScopeDefine.java
@@ -0,0 +1,100 @@
+/*
+ * 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.source;
+
+import java.lang.annotation.Annotation;
+import java.util.*;
+import org.apache.skywalking.oap.server.core.UnexpectedException;
+import org.apache.skywalking.oap.server.core.annotation.AnnotationListener;
+
+/**
+ * @author peng-yongsheng, wusheng
+ */
+
+public class DefaultScopeDefine {
+    private static final Map<String, Integer> NAME_2_ID = new HashMap<>();
+    private static final Map<Integer, String> ID_2_NAME = new HashMap<>();
+
+    public static final int ALL = 0;
+    public static final int SERVICE = 1;
+    public static final int SERVICE_INSTANCE = 2;
+    public static final int ENDPOINT = 3;
+    public static final int SERVICE_RELATION = 4;
+    public static final int SERVICE_INSTANCE_RELATION = 5;
+    public static final int ENDPOINT_RELATION = 6;
+    public static final int NETWORK_ADDRESS = 7;
+    public static final int SERVICE_INSTANCE_JVM_CPU = 8;
+    public static final int SERVICE_INSTANCE_JVM_MEMORY = 9;
+    public static final int SERVICE_INSTANCE_JVM_MEMORY_POOL = 10;
+    public static final int SERVICE_INSTANCE_JVM_GC = 11;
+    public static final int SEGMENT = 12;
+    public static final int ALARM = 13;
+    public static final int SERVICE_INVENTORY = 14;
+    public static final int SERVICE_INSTANCE_INVENTORY = 15;
+    public static final int ENDPOINT_INVENTORY = 16;
+    public static final int DATABASE_ACCESS = 17;
+    public static final int DATABASE_SLOW_STATEMENT = 18;
+
+    public static class Listener implements AnnotationListener {
+        @Override public Class<? extends Annotation> annotation() {
+            return ScopeDeclaration.class;
+        }
+
+        @Override public void notify(Class originalClass) {
+            ScopeDeclaration declaration = (ScopeDeclaration)originalClass.getAnnotation(ScopeDeclaration.class);
+            if (declaration != null) {
+                addNewScope(declaration, originalClass);
+            }
+        }
+    }
+
+    public static final void addNewScope(ScopeDeclaration declaration, Class originalClass) {
+        int id = declaration.id();
+        if (ID_2_NAME.containsKey(id)) {
+            throw new UnexpectedException("ScopeDeclaration id=" + id + " at " + originalClass.getName() + " has conflict with another named " + ID_2_NAME.get(id));
+        }
+        String name = declaration.name();
+        if (NAME_2_ID.containsKey(name)) {
+            throw new UnexpectedException("ScopeDeclaration name=" + name + " at " + originalClass.getName() + " has conflict with another id= " + NAME_2_ID.get(name));
+        }
+        ID_2_NAME.put(id, name);
+        NAME_2_ID.put(name, id);
+    }
+
+    public static String nameOf(int id) {
+        String name = ID_2_NAME.get(id);
+        if (name == null) {
+            throw new UnexpectedException("ScopeDefine id = " + id + " not found.");
+        }
+        return name;
+    }
+
+    public static int valueOf(String name) {
+        Integer id = NAME_2_ID.get(name);
+        if (id == null) {
+            throw new UnexpectedException("ScopeDefine name = " + name + " not found.");
+        }
+        return id;
+    }
+
+    public static void reset() {
+        NAME_2_ID.clear();
+        ID_2_NAME.clear();
+    }
+}
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Endpoint.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Endpoint.java
index 17e2ed7..7879c79 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Endpoint.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Endpoint.java
@@ -19,15 +19,16 @@
 package org.apache.skywalking.oap.server.core.source;
 
 import lombok.*;
-import org.apache.skywalking.oap.server.core.source.annotation.SourceType;
+
+import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.ENDPOINT;
 
 /**
  * @author peng-yongsheng
  */
-@SourceType
+@ScopeDeclaration(id = ENDPOINT, name = "Endpoint")
 public class Endpoint extends Source {
-    @Override public Scope scope() {
-        return Scope.Endpoint;
+    @Override public int scope() {
+        return DefaultScopeDefine.ENDPOINT;
     }
 
     @Override public String getEntityId() {
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 534309f..648daec 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/EndpointRelation.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/EndpointRelation.java
@@ -21,13 +21,16 @@ package org.apache.skywalking.oap.server.core.source;
 import lombok.*;
 import org.apache.skywalking.oap.server.core.Const;
 
+import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.ENDPOINT_RELATION;
+
 /**
  * @author peng-yongsheng
  */
+@ScopeDeclaration(id = ENDPOINT_RELATION, name = "EndpointRelation")
 public class EndpointRelation extends Source {
 
-    @Override public Scope scope() {
-        return Scope.EndpointRelation;
+    @Override public int scope() {
+        return DefaultScopeDefine.ENDPOINT_RELATION;
     }
 
     @Override public String getEntityId() {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Scope.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Scope.java
deleted file mode 100644
index fd66299..0000000
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Scope.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-package org.apache.skywalking.oap.server.core.source;
-
-/**
- * @author peng-yongsheng, wusheng
- */
-public enum Scope {
-    All, Service, ServiceInstance, Endpoint, ServiceRelation, ServiceInstanceRelation, EndpointRelation, NetworkAddress,
-    ServiceInstanceJVMCPU, ServiceInstanceJVMMemory, ServiceInstanceJVMMemoryPool, ServiceInstanceJVMGC,
-    Segment, Alarm, ServiceInventory, ServiceInstanceInventory, EndpointInventory, DatabaseAccess, DatabaseSlowStatement;
-
-    public static Scope valueOf(int ordinal) {
-        if (ordinal < 0 || ordinal >= values().length) {
-            throw new IndexOutOfBoundsException("Invalid ordinal");
-        }
-        return values()[ordinal];
-    }
-}
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Source.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ScopeDeclaration.java
similarity index 79%
copy from oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Source.java
copy to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ScopeDeclaration.java
index 5e6ab35..0f5f062 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Source.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ScopeDeclaration.java
@@ -18,15 +18,16 @@
 
 package org.apache.skywalking.oap.server.core.source;
 
-import lombok.*;
+import java.lang.annotation.*;
 
 /**
- * @author peng-yongsheng
+ * DefaultScopeDefine id declaration.
+ *
+ * @author wusheng
  */
-public abstract class Source {
-    public abstract Scope scope();
-
-    @Getter @Setter private long timeBucket;
-
-    public abstract String getEntityId();
+@Target({ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ScopeDeclaration {
+    int id();
+    String name();
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Segment.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Segment.java
index 5959aed..041cbf6 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Segment.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Segment.java
@@ -19,16 +19,17 @@
 package org.apache.skywalking.oap.server.core.source;
 
 import lombok.*;
-import org.apache.skywalking.oap.server.core.source.annotation.SourceType;
+
+import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.SEGMENT;
 
 /**
  * @author peng-yongsheng
  */
-@SourceType
+@ScopeDeclaration(id = SEGMENT, name = "Segment")
 public class Segment extends Source {
 
-    @Override public Scope scope() {
-        return Scope.Segment;
+    @Override public int scope() {
+        return DefaultScopeDefine.SEGMENT;
     }
 
     @Override public String getEntityId() {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Service.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Service.java
index f59be7a..974596f 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Service.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Service.java
@@ -19,15 +19,16 @@
 package org.apache.skywalking.oap.server.core.source;
 
 import lombok.*;
-import org.apache.skywalking.oap.server.core.source.annotation.SourceType;
+
+import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.SERVICE;
 
 /**
  * @author wusheng, peng-yongsheng
  */
-@SourceType
+@ScopeDeclaration(id = SERVICE, name = "Service")
 public class Service extends Source {
-    @Override public Scope scope() {
-        return Scope.Service;
+    @Override public int scope() {
+        return DefaultScopeDefine.SERVICE;
     }
 
     @Override public String getEntityId() {
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 4a96727..63d71a9 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
@@ -19,15 +19,16 @@
 package org.apache.skywalking.oap.server.core.source;
 
 import lombok.*;
-import org.apache.skywalking.oap.server.core.source.annotation.SourceType;
+
+import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.SERVICE_INSTANCE;
 
 /**
  * @author peng-yongsheng
  */
-@SourceType
+@ScopeDeclaration(id = SERVICE_INSTANCE, name = "ServiceInstance")
 public class ServiceInstance extends Source {
-    @Override public Scope scope() {
-        return Scope.ServiceInstance;
+    @Override public int scope() {
+        return DefaultScopeDefine.SERVICE_INSTANCE;
     }
 
     @Override public String getEntityId() {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMCPU.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMCPU.java
index 4decea0..bbf0b49 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMCPU.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMCPU.java
@@ -19,15 +19,16 @@
 package org.apache.skywalking.oap.server.core.source;
 
 import lombok.*;
-import org.apache.skywalking.oap.server.core.source.annotation.SourceType;
+
+import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.SERVICE_INSTANCE_JVM_CPU;
 
 /**
  * @author peng-yongsheng
  */
-@SourceType
+@ScopeDeclaration(id = SERVICE_INSTANCE_JVM_CPU, name = "ServiceInstanceJVMCPU")
 public class ServiceInstanceJVMCPU extends Source {
-    @Override public Scope scope() {
-        return Scope.ServiceInstanceJVMCPU;
+    @Override public int scope() {
+        return DefaultScopeDefine.SERVICE_INSTANCE_JVM_CPU;
     }
 
     @Override public String getEntityId() {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMGC.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMGC.java
index 865589d..0c005bc 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMGC.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMGC.java
@@ -19,15 +19,16 @@
 package org.apache.skywalking.oap.server.core.source;
 
 import lombok.*;
-import org.apache.skywalking.oap.server.core.source.annotation.SourceType;
+
+import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.SERVICE_INSTANCE_JVM_GC;
 
 /**
  * @author peng-yongsheng
  */
-@SourceType
+@ScopeDeclaration(id = SERVICE_INSTANCE_JVM_GC, name = "ServiceInstanceJVMGC")
 public class ServiceInstanceJVMGC extends Source {
-    @Override public Scope scope() {
-        return Scope.ServiceInstanceJVMGC;
+    @Override public int scope() {
+        return DefaultScopeDefine.SERVICE_INSTANCE_JVM_GC;
     }
 
     @Override public String getEntityId() {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMMemory.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMMemory.java
index 37e4b98..9688f56 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMMemory.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMMemory.java
@@ -20,12 +20,15 @@ package org.apache.skywalking.oap.server.core.source;
 
 import lombok.*;
 
+import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.SERVICE_INSTANCE_JVM_MEMORY;
+
 /**
  * @author peng-yongsheng
  */
+@ScopeDeclaration(id = SERVICE_INSTANCE_JVM_MEMORY, name = "ServiceInstanceJVMMemory")
 public class ServiceInstanceJVMMemory extends Source {
-    @Override public Scope scope() {
-        return Scope.ServiceInstanceJVMMemory;
+    @Override public int scope() {
+        return DefaultScopeDefine.SERVICE_INSTANCE_JVM_MEMORY;
     }
 
     @Override public String getEntityId() {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMMemoryPool.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMMemoryPool.java
index b7864a8..2e00932 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMMemoryPool.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMMemoryPool.java
@@ -20,12 +20,15 @@ package org.apache.skywalking.oap.server.core.source;
 
 import lombok.*;
 
+import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.SERVICE_INSTANCE_JVM_MEMORY_POOL;
+
 /**
  * @author peng-yongsheng
  */
+@ScopeDeclaration(id = SERVICE_INSTANCE_JVM_MEMORY_POOL, name = "ServiceInstanceJVMMemoryPool")
 public class ServiceInstanceJVMMemoryPool extends Source {
-    @Override public Scope scope() {
-        return Scope.ServiceInstanceJVMMemoryPool;
+    @Override public int scope() {
+        return DefaultScopeDefine.SERVICE_INSTANCE_JVM_MEMORY_POOL;
     }
 
     @Override public String getEntityId() {
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 07f34cb..27d4b65 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
@@ -21,13 +21,16 @@ package org.apache.skywalking.oap.server.core.source;
 import lombok.*;
 import org.apache.skywalking.oap.server.core.Const;
 
+import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.SERVICE_INSTANCE_RELATION;
+
 /**
  * @author peng-yongsheng
  */
+@ScopeDeclaration(id = SERVICE_INSTANCE_RELATION, name = "ServiceInstanceRelation")
 public class ServiceInstanceRelation extends Source {
 
-    @Override public Scope scope() {
-        return Scope.ServiceInstanceRelation;
+    @Override public int scope() {
+        return DefaultScopeDefine.SERVICE_INSTANCE_RELATION;
     }
 
     @Override public String getEntityId() {
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 f4a3a18..1f0d62b 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
@@ -21,13 +21,16 @@ package org.apache.skywalking.oap.server.core.source;
 import lombok.*;
 import org.apache.skywalking.oap.server.core.Const;
 
+import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.SERVICE_RELATION;
+
 /**
  * @author peng-yongsheng
  */
+@ScopeDeclaration(id = SERVICE_RELATION, name = "ServiceRelation")
 public class ServiceRelation extends Source {
 
-    @Override public Scope scope() {
-        return Scope.ServiceRelation;
+    @Override public int scope() {
+        return DefaultScopeDefine.SERVICE_RELATION;
     }
 
     @Override public String getEntityId() {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Source.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Source.java
index 5e6ab35..11e4e22 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Source.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Source.java
@@ -24,7 +24,7 @@ import lombok.*;
  * @author peng-yongsheng
  */
 public abstract class Source {
-    public abstract Scope scope();
+    public abstract int scope();
 
     @Getter @Setter private long timeBucket;
 
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/IRegisterLockDAO.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/IRegisterLockDAO.java
index 2edaa8f..034e4da 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/IRegisterLockDAO.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/IRegisterLockDAO.java
@@ -19,7 +19,6 @@
 package org.apache.skywalking.oap.server.core.storage;
 
 import org.apache.skywalking.oap.server.core.register.RegisterSource;
-import org.apache.skywalking.oap.server.core.source.Scope;
 
 /**
  * Entity register and ID generator.
@@ -32,8 +31,8 @@ public interface IRegisterLockDAO extends DAO {
      * in concurrent way, so no `sync` in method level, but the implementation must make sure the return id is unique no
      * matter the cluster size.
      *
-     * @param scope for the id. IDs at different scopes could be same, but unique in same scope.
+     * @param scopeId for the id. IDs at different scopes could be same, but unique in same scope.
      * @return Unique ID.
      */
-    int getId(Scope scope, RegisterSource registerSource);
+    int getId(int scopeId, RegisterSource registerSource);
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/annotation/StorageAnnotationListener.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/annotation/StorageAnnotationListener.java
index e31f347..5fd5533 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/annotation/StorageAnnotationListener.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/annotation/StorageAnnotationListener.java
@@ -20,20 +20,13 @@ package org.apache.skywalking.oap.server.core.storage.annotation;
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Field;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
 import lombok.Getter;
 import org.apache.skywalking.oap.server.core.analysis.indicator.annotation.IndicatorAnnotationUtils;
 import org.apache.skywalking.oap.server.core.annotation.AnnotationListener;
-import org.apache.skywalking.oap.server.core.source.Scope;
-import org.apache.skywalking.oap.server.core.storage.model.ColumnName;
-import org.apache.skywalking.oap.server.core.storage.model.IModelGetter;
-import org.apache.skywalking.oap.server.core.storage.model.IModelOverride;
-import org.apache.skywalking.oap.server.core.storage.model.Model;
-import org.apache.skywalking.oap.server.core.storage.model.ModelColumn;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.skywalking.oap.server.core.source.DefaultScopeDefine;
+import org.apache.skywalking.oap.server.core.storage.model.*;
+import org.slf4j.*;
 
 /**
  * @author peng-yongsheng
@@ -57,12 +50,14 @@ public class StorageAnnotationListener implements AnnotationListener, IModelGett
 
         String modelName = StorageEntityAnnotationUtils.getModelName(aClass);
         boolean deleteHistory = StorageEntityAnnotationUtils.getDeleteHistory(aClass);
-        Scope sourceScope = StorageEntityAnnotationUtils.getSourceScope(aClass);
+        int sourceScopeId = StorageEntityAnnotationUtils.getSourceScope(aClass);
+        // Check this scope id is valid.
+        DefaultScopeDefine.nameOf(sourceScopeId);
         List<ModelColumn> modelColumns = new LinkedList<>();
         boolean isIndicator = IndicatorAnnotationUtils.isIndicator(aClass);
         retrieval(aClass, modelName, modelColumns);
 
-        models.add(new Model(modelName, modelColumns, isIndicator, deleteHistory, sourceScope));
+        models.add(new Model(modelName, modelColumns, isIndicator, deleteHistory, sourceScopeId));
     }
 
     private void retrieval(Class clazz, String modelName, List<ModelColumn> modelColumns) {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/annotation/StorageEntity.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/annotation/StorageEntity.java
index bbbc38f..1b53fdd 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/annotation/StorageEntity.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/annotation/StorageEntity.java
@@ -19,7 +19,6 @@
 package org.apache.skywalking.oap.server.core.storage.annotation;
 
 import java.lang.annotation.*;
-import org.apache.skywalking.oap.server.core.source.Scope;
 import org.apache.skywalking.oap.server.core.storage.StorageBuilder;
 
 /**
@@ -32,7 +31,10 @@ public @interface StorageEntity {
 
     Class<? extends StorageBuilder> builder();
 
-    Scope source();
+    /**
+     * @return scope id.
+     */
+    int sourceScopeId();
 
     boolean deleteHistory() default true;
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/annotation/StorageEntityAnnotationUtils.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/annotation/StorageEntityAnnotationUtils.java
index b351f20..ecfebe4 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/annotation/StorageEntityAnnotationUtils.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/annotation/StorageEntityAnnotationUtils.java
@@ -19,7 +19,6 @@
 package org.apache.skywalking.oap.server.core.storage.annotation;
 
 import org.apache.skywalking.oap.server.core.UnexpectedException;
-import org.apache.skywalking.oap.server.core.source.Scope;
 import org.apache.skywalking.oap.server.core.storage.StorageBuilder;
 
 /**
@@ -54,10 +53,10 @@ public class StorageEntityAnnotationUtils {
         }
     }
 
-    public static Scope getSourceScope(Class aClass) {
+    public static int getSourceScope(Class aClass) {
         if (aClass.isAnnotationPresent(StorageEntity.class)) {
             StorageEntity annotation = (StorageEntity)aClass.getAnnotation(StorageEntity.class);
-            return annotation.source();
+            return annotation.sourceScopeId();
         } else {
             throw new UnexpectedException("");
         }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/model/Model.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/model/Model.java
index 07dc1c5..f847db7 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/model/Model.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/model/Model.java
@@ -20,7 +20,6 @@ package org.apache.skywalking.oap.server.core.storage.model;
 
 import java.util.List;
 import lombok.Getter;
-import org.apache.skywalking.oap.server.core.source.Scope;
 
 /**
  * @author peng-yongsheng
@@ -31,17 +30,18 @@ public class Model {
     private final boolean isIndicator;
     private final boolean deleteHistory;
     private final List<ModelColumn> columns;
-    private final Scope source;
+    private final int sourceScopeId;
 
-    public Model(String name, List<ModelColumn> columns, boolean isIndicator, boolean deleteHistory, Scope source) {
+    public Model(String name, List<ModelColumn> columns, boolean isIndicator, boolean deleteHistory,
+        int sourceScopeId) {
         this.name = name;
         this.columns = columns;
         this.isIndicator = isIndicator;
         this.deleteHistory = deleteHistory;
-        this.source = source;
+        this.sourceScopeId = sourceScopeId;
     }
 
     public Model copy(String name) {
-        return new Model(name, columns, isIndicator, deleteHistory, source);
+        return new Model(name, columns, isIndicator, deleteHistory, sourceScopeId);
     }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/query/IAlarmQueryDAO.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/query/IAlarmQueryDAO.java
index 0f6d4cb..a4dcb94 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/query/IAlarmQueryDAO.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/query/IAlarmQueryDAO.java
@@ -19,8 +19,7 @@
 package org.apache.skywalking.oap.server.core.storage.query;
 
 import java.io.IOException;
-import org.apache.skywalking.oap.server.core.query.entity.*;
-import org.apache.skywalking.oap.server.core.source.Scope;
+import org.apache.skywalking.oap.server.core.query.entity.Alarms;
 import org.apache.skywalking.oap.server.core.storage.DAO;
 
 /**
@@ -28,6 +27,6 @@ import org.apache.skywalking.oap.server.core.storage.DAO;
  */
 public interface IAlarmQueryDAO extends DAO {
 
-    Alarms getAlarm(final Scope scope, final String keyword, final int limit, final int from, final long startTB,
+    Alarms getAlarm(final Integer scopeId, final String keyword, final int limit, final int from, final long startTB,
         final long endTB) throws IOException;
 }
diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/AlarmQuery.java b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/AlarmQuery.java
index c69b162..0fc3fc6 100644
--- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/AlarmQuery.java
+++ b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/AlarmQuery.java
@@ -20,11 +20,10 @@ package org.apache.skywalking.oap.query.graphql.resolver;
 
 import com.coxautodev.graphql.tools.GraphQLQueryResolver;
 import java.io.IOException;
-import org.apache.skywalking.oap.query.graphql.type.Duration;
+import org.apache.skywalking.oap.query.graphql.type.*;
 import org.apache.skywalking.oap.server.core.CoreModule;
 import org.apache.skywalking.oap.server.core.query.*;
 import org.apache.skywalking.oap.server.core.query.entity.*;
-import org.apache.skywalking.oap.server.core.source.Scope;
 import org.apache.skywalking.oap.server.library.module.ModuleManager;
 
 /**
@@ -55,6 +54,6 @@ public class AlarmQuery implements GraphQLQueryResolver {
         long startTimeBucket = DurationUtils.INSTANCE.startTimeDurationToSecondTimeBucket(duration.getStep(), duration.getStart());
         long endTimeBucket = DurationUtils.INSTANCE.endTimeDurationToSecondTimeBucket(duration.getStep(), duration.getEnd());
 
-        return getQueryService().getAlarm(scope, keyword, paging, startTimeBucket, endTimeBucket);
+        return getQueryService().getAlarm(scope.getScopeId(), keyword, paging, startTimeBucket, endTimeBucket);
     }
 }
diff --git a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/lock/RegisterLockDAOImpl.java b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/lock/RegisterLockDAOImpl.java
index 3f7fdd0..a7b3830 100644
--- a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/lock/RegisterLockDAOImpl.java
+++ b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/lock/RegisterLockDAOImpl.java
@@ -22,7 +22,6 @@ import java.io.IOException;
 import java.util.Map;
 import org.apache.skywalking.oap.server.core.Const;
 import org.apache.skywalking.oap.server.core.register.RegisterSource;
-import org.apache.skywalking.oap.server.core.source.Scope;
 import org.apache.skywalking.oap.server.core.storage.IRegisterLockDAO;
 import org.apache.skywalking.oap.server.library.client.elasticsearch.ElasticSearchClient;
 import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.base.EsDAO;
@@ -41,8 +40,8 @@ public class RegisterLockDAOImpl extends EsDAO implements IRegisterLockDAO {
         super(client);
     }
 
-    @Override public int getId(Scope scope, RegisterSource registerSource) {
-        String id = String.valueOf(scope.ordinal());
+    @Override public int getId(int scopeId, RegisterSource registerSource) {
+        String id = scopeId + "";
 
         int sequence = Const.NONE;
         try {
diff --git a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/lock/RegisterLockInstaller.java b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/lock/RegisterLockInstaller.java
index cf6d253..72ff4f0 100644
--- a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/lock/RegisterLockInstaller.java
+++ b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/lock/RegisterLockInstaller.java
@@ -20,7 +20,6 @@ package org.apache.skywalking.oap.server.storage.plugin.elasticsearch.lock;
 
 import java.io.IOException;
 import org.apache.skywalking.oap.server.core.register.worker.InventoryProcess;
-import org.apache.skywalking.oap.server.core.source.Scope;
 import org.apache.skywalking.oap.server.core.storage.StorageException;
 import org.apache.skywalking.oap.server.core.storage.annotation.StorageEntityAnnotationUtils;
 import org.apache.skywalking.oap.server.library.client.elasticsearch.ElasticSearchClient;
@@ -56,8 +55,8 @@ public class RegisterLockInstaller {
             }
 
             for (Class registerSource : InventoryProcess.INSTANCE.getAllRegisterSources()) {
-                Scope sourceScope = StorageEntityAnnotationUtils.getSourceScope(registerSource);
-                putIfAbsent(sourceScope.ordinal());
+                int sourceScopeId = StorageEntityAnnotationUtils.getSourceScope(registerSource);
+                putIfAbsent(sourceScopeId);
             }
         } catch (IOException e) {
             throw new StorageException(e.getMessage());
diff --git a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/AlarmQueryEsDAO.java b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/AlarmQueryEsDAO.java
index 24272ec..5db788d 100644
--- a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/AlarmQueryEsDAO.java
+++ b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/AlarmQueryEsDAO.java
@@ -23,7 +23,6 @@ import java.io.IOException;
 import java.util.Objects;
 import org.apache.skywalking.oap.server.core.alarm.AlarmRecord;
 import org.apache.skywalking.oap.server.core.query.entity.*;
-import org.apache.skywalking.oap.server.core.source.Scope;
 import org.apache.skywalking.oap.server.core.storage.query.IAlarmQueryDAO;
 import org.apache.skywalking.oap.server.library.client.elasticsearch.ElasticSearchClient;
 import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.base.*;
@@ -41,15 +40,16 @@ public class AlarmQueryEsDAO extends EsDAO implements IAlarmQueryDAO {
         super(client);
     }
 
-    public Alarms getAlarm(final Scope scope, final String keyword, final int limit, final int from, final long startTB,
+    public Alarms getAlarm(final Integer scopeId, final String keyword, final int limit, final int from,
+        final long startTB,
         final long endTB) throws IOException {
         SearchSourceBuilder sourceBuilder = SearchSourceBuilder.searchSource();
 
         BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
         boolQueryBuilder.must().add(QueryBuilders.rangeQuery(AlarmRecord.TIME_BUCKET).gte(startTB).lte(endTB));
 
-        if (Objects.nonNull(scope)) {
-            boolQueryBuilder.must().add(QueryBuilders.termQuery(AlarmRecord.SCOPE, scope.ordinal()));
+        if (Objects.nonNull(scopeId)) {
+            boolQueryBuilder.must().add(QueryBuilders.termQuery(AlarmRecord.SCOPE, scopeId.intValue()));
         }
 
         if (!Strings.isNullOrEmpty(keyword)) {
@@ -74,7 +74,8 @@ public class AlarmQueryEsDAO extends EsDAO implements IAlarmQueryDAO {
             message.setId(String.valueOf(alarmRecord.getId0()));
             message.setMessage(alarmRecord.getAlarmMessage());
             message.setStartTime(alarmRecord.getStartTime());
-            message.setScope(Scope.valueOf(alarmRecord.getScope()));
+            message.setScope(Scope.Finder.valueOf(alarmRecord.getScope()));
+            message.setScopeId(alarmRecord.getScope());
             alarms.getMsgs().add(message);
         }
         return alarms;
diff --git a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2AlarmQueryDAO.java b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2AlarmQueryDAO.java
index 1fa18f9..dc8a401 100644
--- a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2AlarmQueryDAO.java
+++ b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2AlarmQueryDAO.java
@@ -23,7 +23,6 @@ import java.sql.*;
 import java.util.*;
 import org.apache.skywalking.oap.server.core.alarm.AlarmRecord;
 import org.apache.skywalking.oap.server.core.query.entity.*;
-import org.apache.skywalking.oap.server.core.source.Scope;
 import org.apache.skywalking.oap.server.core.storage.query.IAlarmQueryDAO;
 import org.apache.skywalking.oap.server.library.client.jdbc.hikaricp.JDBCHikariCPClient;
 import org.elasticsearch.common.Strings;
@@ -39,13 +38,15 @@ public class H2AlarmQueryDAO implements IAlarmQueryDAO {
     }
 
     @Override
-    public Alarms getAlarm(Scope scope, String keyword, int limit, int from, long startTB,
+    public Alarms getAlarm(Integer scopeId, String keyword, int limit, int from, long startTB,
         long endTB) throws IOException {
 
         StringBuilder sql = new StringBuilder();
         List<Object> parameters = new ArrayList<>(10);
         sql.append("from ").append(AlarmRecord.INDEX_NAME).append(" where ");
         sql.append(" 1=1 ");
+        sql.append(" and ").append(AlarmRecord.SCOPE).append(" = ?");
+        parameters.add(scopeId.intValue());
         if (startTB != 0 && endTB != 0) {
             sql.append(" and ").append(AlarmRecord.TIME_BUCKET).append(" >= ?");
             parameters.add(startTB);
@@ -75,7 +76,8 @@ public class H2AlarmQueryDAO implements IAlarmQueryDAO {
                     message.setId(resultSet.getString(AlarmRecord.ID0));
                     message.setMessage(resultSet.getString(AlarmRecord.ALARM_MESSAGE));
                     message.setStartTime(resultSet.getLong(AlarmRecord.START_TIME));
-                    message.setScope(Scope.valueOf(resultSet.getInt(AlarmRecord.SCOPE)));
+                    message.setScope(Scope.Finder.valueOf(resultSet.getInt(AlarmRecord.SCOPE)));
+                    message.setScopeId(resultSet.getInt(AlarmRecord.SCOPE));
 
                     alarms.getMsgs().add(message);
                 }
diff --git a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2MetadataQueryDAO.java b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2MetadataQueryDAO.java
index 12aabeb..1f235a7 100644
--- a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2MetadataQueryDAO.java
+++ b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2MetadataQueryDAO.java
@@ -217,7 +217,7 @@ public class H2MetadataQueryDAO implements IMetadataQueryDAO {
         sql.append(EndpointInventory.SERVICE_ID).append("=?");
         condition.add(serviceId);
         if (!Strings.isNullOrEmpty(keyword)) {
-            sql.append(" and ").append(EndpointInventory.NAME).append(" like \"%").append(keyword).append("%\" ");
+            sql.append(" and ").append(EndpointInventory.NAME).append(" like '%").append(keyword).append("%' ");
         }
         sql.append(" and ").append(EndpointInventory.DETECT_POINT).append(" = ?");
         condition.add(DetectPoint.SERVER.ordinal());
diff --git a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2RegisterLockDAO.java b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2RegisterLockDAO.java
index 1e3f204..91b63da 100644
--- a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2RegisterLockDAO.java
+++ b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2RegisterLockDAO.java
@@ -21,7 +21,6 @@ package org.apache.skywalking.oap.server.storage.plugin.jdbc.h2.dao;
 import java.sql.*;
 import org.apache.skywalking.oap.server.core.Const;
 import org.apache.skywalking.oap.server.core.register.RegisterSource;
-import org.apache.skywalking.oap.server.core.source.Scope;
 import org.apache.skywalking.oap.server.core.storage.IRegisterLockDAO;
 import org.apache.skywalking.oap.server.library.client.jdbc.JDBCClientException;
 import org.apache.skywalking.oap.server.library.client.jdbc.hikaricp.JDBCHikariCPClient;
@@ -42,18 +41,18 @@ public class H2RegisterLockDAO implements IRegisterLockDAO {
         this.h2Client = h2Client;
     }
 
-    @Override public int getId(Scope scope, RegisterSource registerSource) {
+    @Override public int getId(int scopeId, RegisterSource registerSource) {
         try (Connection connection = h2Client.getTransactionConnection()) {
-            ResultSet resultSet = h2Client.executeQuery(connection, "select sequence from " + H2RegisterLockInstaller.LOCK_TABLE_NAME + " where id = " + scope.ordinal() + " for update");
+            ResultSet resultSet = h2Client.executeQuery(connection, "select sequence from " + H2RegisterLockInstaller.LOCK_TABLE_NAME + " where id = " + scopeId + " for update");
             while (resultSet.next()) {
                 int sequence = resultSet.getInt("sequence");
                 sequence++;
-                h2Client.execute(connection, "update " + H2RegisterLockInstaller.LOCK_TABLE_NAME + " set sequence = " + sequence + " where id = " + scope.ordinal());
+                h2Client.execute(connection, "update " + H2RegisterLockInstaller.LOCK_TABLE_NAME + " set sequence = " + sequence + " where id = " + scopeId);
                 connection.commit();
                 return sequence;
             }
         } catch (JDBCClientException | SQLException e) {
-            logger.error("try inventory register lock for scope id={} name={} failure.", scope.ordinal(), scope.name());
+            logger.error("try inventory register lock for scope id={} name={} failure.", scopeId, scopeId);
             logger.error("tryLock error", e);
             return Const.NONE;
         }
diff --git a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2RegisterLockInstaller.java b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2RegisterLockInstaller.java
index 572ba0c..21c5cf8 100644
--- a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2RegisterLockInstaller.java
+++ b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2RegisterLockInstaller.java
@@ -20,7 +20,7 @@ package org.apache.skywalking.oap.server.storage.plugin.jdbc.h2.dao;
 
 import java.sql.*;
 import org.apache.skywalking.oap.server.core.register.worker.InventoryProcess;
-import org.apache.skywalking.oap.server.core.source.Scope;
+import org.apache.skywalking.oap.server.core.source.DefaultScopeDefine;
 import org.apache.skywalking.oap.server.core.storage.StorageException;
 import org.apache.skywalking.oap.server.core.storage.annotation.StorageEntityAnnotationUtils;
 import org.apache.skywalking.oap.server.library.client.Client;
@@ -60,8 +60,8 @@ public class H2RegisterLockInstaller {
             h2Client.execute(connection, tableCreateSQL.toString());
 
             for (Class registerSource : InventoryProcess.INSTANCE.getAllRegisterSources()) {
-                Scope sourceScope = StorageEntityAnnotationUtils.getSourceScope(registerSource);
-                putIfAbsent(h2Client, connection, sourceScope.ordinal(), sourceScope.name());
+                int scopeId = StorageEntityAnnotationUtils.getSourceScope(registerSource);
+                putIfAbsent(h2Client, connection, scopeId, DefaultScopeDefine.nameOf(scopeId));
             }
         } catch (JDBCClientException | SQLException e) {
             throw new StorageException(e.getMessage(), e);
diff --git a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/mysql/MySQLAlarmQueryDAO.java b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/mysql/MySQLAlarmQueryDAO.java
index 582a01e..3c67196 100644
--- a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/mysql/MySQLAlarmQueryDAO.java
+++ b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/mysql/MySQLAlarmQueryDAO.java
@@ -23,7 +23,6 @@ import java.sql.*;
 import java.util.*;
 import org.apache.skywalking.oap.server.core.alarm.AlarmRecord;
 import org.apache.skywalking.oap.server.core.query.entity.*;
-import org.apache.skywalking.oap.server.core.source.Scope;
 import org.apache.skywalking.oap.server.core.storage.query.IAlarmQueryDAO;
 import org.apache.skywalking.oap.server.library.client.jdbc.hikaricp.JDBCHikariCPClient;
 import org.elasticsearch.common.Strings;
@@ -39,14 +38,15 @@ public class MySQLAlarmQueryDAO implements IAlarmQueryDAO {
     }
 
     @Override
-    public Alarms getAlarm(Scope scope, String keyword, int limit, int from, long startTB,
+    public Alarms getAlarm(Integer scopeId, String keyword, int limit, int from, long startTB,
         long endTB) throws IOException {
 
         StringBuilder sql = new StringBuilder();
         List<Object> parameters = new ArrayList<>(10);
         sql.append("from ").append(AlarmRecord.INDEX_NAME).append(" where ");
-        sql.append(" scope = ?");
-        parameters.add(scope.ordinal());
+        sql.append(" 1=1 ");
+        sql.append(" and ").append(AlarmRecord.SCOPE).append(" = ?");
+        parameters.add(scopeId.intValue());
         if (startTB != 0 && endTB != 0) {
             sql.append(" and ").append(AlarmRecord.TIME_BUCKET).append(" >= ?");
             parameters.add(startTB);
@@ -76,7 +76,8 @@ public class MySQLAlarmQueryDAO implements IAlarmQueryDAO {
                     message.setId(resultSet.getString(AlarmRecord.ID0));
                     message.setMessage(resultSet.getString(AlarmRecord.ALARM_MESSAGE));
                     message.setStartTime(resultSet.getLong(AlarmRecord.START_TIME));
-                    message.setScope(Scope.valueOf(resultSet.getInt(AlarmRecord.SCOPE)));
+                    message.setScope(Scope.Finder.valueOf(resultSet.getInt(AlarmRecord.SCOPE)));
+                    message.setScopeId(resultSet.getInt(AlarmRecord.SCOPE));
 
                     alarms.getMsgs().add(message);
                 }
diff --git a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/mysql/MySQLTableInstaller.java b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/mysql/MySQLTableInstaller.java
index eeced14..a54216e 100644
--- a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/mysql/MySQLTableInstaller.java
+++ b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/mysql/MySQLTableInstaller.java
@@ -23,7 +23,7 @@ import java.sql.SQLException;
 import org.apache.skywalking.oap.server.core.analysis.indicator.IntKeyLongValueArray;
 import org.apache.skywalking.oap.server.core.analysis.manual.segment.SegmentRecord;
 import org.apache.skywalking.oap.server.core.register.RegisterSource;
-import org.apache.skywalking.oap.server.core.source.Scope;
+import org.apache.skywalking.oap.server.core.source.DefaultScopeDefine;
 import org.apache.skywalking.oap.server.core.storage.StorageException;
 import org.apache.skywalking.oap.server.core.storage.model.ColumnName;
 import org.apache.skywalking.oap.server.core.storage.model.Model;
@@ -36,6 +36,8 @@ import org.apache.skywalking.oap.server.storage.plugin.jdbc.h2.dao.H2TableInstal
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.*;
+
 /**
  * Extend H2TableInstaller but match MySQL SQL syntax.
  *
@@ -77,7 +79,7 @@ public class MySQLTableInstaller extends H2TableInstaller {
         } else if (Double.class.equals(type) || double.class.equals(type)) {
             return "DOUBLE";
         } else if (String.class.equals(type)) {
-            if (Scope.Segment.equals(model.getSource())) {
+            if (DefaultScopeDefine.SEGMENT == model.getSourceScopeId()) {
                 if (name.getName().equals(SegmentRecord.TRACE_ID) || name.getName().equals(SegmentRecord.SEGMENT_ID))
                     return "VARCHAR(300)";
             }
@@ -92,17 +94,17 @@ public class MySQLTableInstaller extends H2TableInstaller {
     }
 
     protected void createIndexes(JDBCHikariCPClient client, Model model) throws StorageException {
-        switch (model.getSource()) {
-            case ServiceInventory:
-            case ServiceInstanceInventory:
-            case NetworkAddress:
-            case EndpointInventory:
+        switch (model.getSourceScopeId()) {
+            case SERVICE_INVENTORY:
+            case SERVICE_INSTANCE_INVENTORY:
+            case NETWORK_ADDRESS:
+            case ENDPOINT_INVENTORY:
                 createInventoryIndexes(client, model);
                 return;
-            case Segment:
+            case SEGMENT:
                 createSegmentIndexes(client, model);
                 return;
-            case Alarm:
+            case ALARM:
                 createAlarmIndexes(client, model);
                 return;
             default:
diff --git a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/test/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/mysql/PreventRedistributionMySQLDriverTest.java b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/test/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/mysql/PreventRedistributionMySQLDriverTest.java
index 77db0fe..dbc13db 100644
--- a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/test/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/mysql/PreventRedistributionMySQLDriverTest.java
+++ b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/test/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/mysql/PreventRedistributionMySQLDriverTest.java
@@ -23,7 +23,7 @@ import org.junit.Test;
 /**
  * This is a very special test case. It isn't for feature testing.
  *
- * In Apache, we can't redistribute MySQL Driver, because of GPL license, but we deliver MySQL solution source codes and
+ * In Apache, we can't redistribute MySQL Driver, because of GPL license, but we deliver MySQL solution sourceScopeId codes and
  * distribution by using JDBC.
  *
  * @author wusheng