You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by pe...@apache.org on 2018/10/11 07:55:09 UTC

[incubator-skywalking] branch master updated: Alarm query and alarm persistence test. (#1753)

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

pengys 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 7c192b1  Alarm query and alarm persistence test. (#1753)
7c192b1 is described below

commit 7c192b19d675589417981ca2a2c6f15c5b82aac7
Author: 彭勇升 pengys <80...@qq.com>
AuthorDate: Thu Oct 11 15:55:04 2018 +0800

    Alarm query and alarm persistence test. (#1753)
    
    * Alarm query and alarm persistence test.
    
    * Fixed the package error.
---
 .../server/core/alarm/provider/RunningRule.java    | 25 ++-----
 .../skywalking/oap/server/core/CoreModule.java     |  1 +
 .../oap/server/core/CoreModuleProvider.java        |  1 +
 .../oap/server/core/alarm/AlarmMessage.java        |  2 +-
 .../oap/server/core/alarm/AlarmRecord.java         |  8 ++-
 .../core/alarm/AlarmStandardPersistence.java       | 11 ++-
 .../oap/server/core/query/AlarmQueryService.java   | 56 +++++++++++++++
 .../server/core/query/entity}/AlarmMessage.java    |  8 ++-
 .../query/entity/{Trace.java => AlarmTrend.java}   | 12 +++-
 .../query/entity/{LogEntity.java => Alarms.java}   | 15 ++--
 .../oap/server/core/query/entity/Attribute.java    |  7 ++
 .../oap/server/core/query/entity/BasicTrace.java   | 21 ++++--
 .../oap/server/core/query/entity/Call.java         |  3 +
 .../oap/server/core/query/entity/ClusterBrief.java |  3 +
 .../oap/server/core/query/entity/Endpoint.java     |  3 +
 .../oap/server/core/query/entity/IntValues.java    | 10 ++-
 .../oap/server/core/query/entity/KVInt.java        |  3 +
 .../oap/server/core/query/entity/KeyValue.java     |  3 +
 .../oap/server/core/query/entity/Language.java     |  3 +
 .../oap/server/core/query/entity/LogEntity.java    | 12 +++-
 .../oap/server/core/query/entity/Node.java         |  3 +
 .../oap/server/core/query/entity/Order.java        |  3 +
 .../oap/server/core/query/entity/Pagination.java   |  3 +
 .../oap/server/core/query/entity/QueryOrder.java   |  3 +
 .../oap/server/core/query/entity/Ref.java          |  3 +
 .../oap/server/core/query/entity/RefType.java      |  3 +
 .../oap/server/core/query/entity/Service.java      |  3 +
 .../server/core/query/entity/ServiceInstance.java  | 16 +++--
 .../oap/server/core/query/entity/Span.java         | 48 +++++++------
 .../oap/server/core/query/entity/Step.java         |  3 +
 .../server/core/query/entity/Thermodynamic.java    | 13 ++--
 .../oap/server/core/query/entity/TopNEntity.java   |  3 +
 .../oap/server/core/query/entity/Topology.java     | 12 +++-
 .../oap/server/core/query/entity/Trace.java        |  9 ++-
 .../oap/server/core/query/entity/TraceBrief.java   | 12 +++-
 .../oap/server/core/query/entity/TraceState.java   |  3 +
 .../skywalking/oap/server/core/source/Scope.java   |  9 ++-
 .../oap/server/core/storage/StorageModule.java     |  2 +-
 .../server/core/storage/query/IAlarmQueryDAO.java} | 17 +++--
 .../oap/query/graphql/GraphQLQueryProvider.java    |  2 +-
 .../query/graphql/resolver/AggregationQuery.java   |  3 +
 .../oap/query/graphql/resolver/AlarmQuery.java     | 34 +++++++--
 .../oap/query/graphql/resolver/MetadataQuery.java  |  3 +
 .../oap/query/graphql/resolver/MetricQuery.java    |  3 +
 .../oap/query/graphql/resolver/TopologyQuery.java  |  3 +
 .../oap/query/graphql/resolver/TraceQuery.java     |  3 +
 .../oap/query/graphql/type/AlarmTrend.java         | 26 -------
 .../skywalking/oap/query/graphql/type/Alarms.java  | 26 -------
 .../src/main/resources/alarm-settings.yml          | 24 +++----
 .../server-starter/src/main/resources/log4j2.xml   |  1 +
 .../StorageModuleElasticsearchProvider.java        |  1 +
 .../elasticsearch/query/AlarmQueryEsDAO.java       | 82 ++++++++++++++++++++++
 52 files changed, 434 insertions(+), 152 deletions(-)

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 d3d1d62..3f8c6ea 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
@@ -18,26 +18,15 @@
 
 package org.apache.skywalking.oap.server.core.alarm.provider;
 
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.locks.ReentrantLock;
-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.DoubleValueHolder;
-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.alarm.*;
+import org.apache.skywalking.oap.server.core.analysis.indicator.*;
 import org.apache.skywalking.oap.server.core.source.Scope;
-import org.apache.skywalking.oap.server.library.util.TimeBucketUtils;
-import org.joda.time.LocalDateTime;
-import org.joda.time.Minutes;
-import org.joda.time.format.DateTimeFormat;
-import org.joda.time.format.DateTimeFormatter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.joda.time.*;
+import org.joda.time.format.*;
+import org.slf4j.*;
 
 /**
  * RunningRule represents each rule in running status. Based on the {@link AlarmRule} definition,
@@ -149,7 +138,7 @@ public class RunningRule {
                 alarmMessage.setId0(meta.getId0());
                 alarmMessage.setId1(meta.getId1());
                 alarmMessage.setAlarmMessage(formatter.format(meta));
-                alarmMessage.setTimeBucket(TimeBucketUtils.INSTANCE.getTime(LocalDateTime.now()));
+                alarmMessage.setStartTime(System.currentTimeMillis());
                 alarmMessageList.add(alarmMessage);
             }
         });
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModule.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModule.java
index eab389b..66cac8d 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModule.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModule.java
@@ -62,6 +62,7 @@ public class CoreModule extends ModuleDefine {
         classes.add(TraceQueryService.class);
         classes.add(MetadataQueryService.class);
         classes.add(AggregationQueryService.class);
+        classes.add(AlarmQueryService.class);
     }
 
     private void addServerInterface(List<Class> classes) {
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 600577c..84435a9 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
@@ -115,6 +115,7 @@ public class CoreModuleProvider extends ModuleProvider {
         this.registerServiceImplementation(TraceQueryService.class, new TraceQueryService(getManager()));
         this.registerServiceImplementation(MetadataQueryService.class, new MetadataQueryService(getManager()));
         this.registerServiceImplementation(AggregationQueryService.class, new AggregationQueryService(getManager()));
+        this.registerServiceImplementation(AlarmQueryService.class, new AlarmQueryService(getManager()));
 
         annotationScan.registerListener(storageAnnotationListener);
         annotationScan.registerListener(streamAnnotationListener);
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 0f6ccd8..051e761 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
@@ -37,7 +37,7 @@ public class AlarmMessage {
     private int id0;
     private int id1;
     private String alarmMessage;
-    private long timeBucket;
+    private long startTime;
 
     private static class NoAlarm extends AlarmMessage {
 
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 491b7e2..dfbba92 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
@@ -36,11 +36,12 @@ import org.apache.skywalking.oap.server.core.storage.annotation.*;
 public class AlarmRecord extends Record {
 
     public static final String INDEX_NAME = "alarm_record";
-    private static final String SCOPE = "scope";
+    public static final String SCOPE = "scope";
     private static final String NAME = "name";
     private static final String ID0 = "id0";
     private static final String ID1 = "id1";
-    private static final String ALARM_MESSAGE = "alarm_message";
+    private static final String START_TIME = "start_time";
+    public static final String ALARM_MESSAGE = "alarm_message";
 
     @Override public String id() {
         return getTimeBucket() + Const.ID_SPLIT + scope + Const.ID_SPLIT + id0 + Const.ID_SPLIT + id1;
@@ -50,6 +51,7 @@ public class AlarmRecord extends Record {
     @Column(columnName = NAME) private String name;
     @Column(columnName = ID0) private int id0;
     @Column(columnName = ID1) private int id1;
+    @Column(columnName = START_TIME) private long startTime;
     @Column(columnName = ALARM_MESSAGE, matchQuery = true) private String alarmMessage;
 
     public static class Builder implements StorageBuilder<AlarmRecord> {
@@ -61,6 +63,7 @@ public class AlarmRecord extends Record {
             map.put(ID0, storageData.getId0());
             map.put(ID1, storageData.getId1());
             map.put(ALARM_MESSAGE, storageData.getAlarmMessage());
+            map.put(START_TIME, storageData.getStartTime());
             map.put(TIME_BUCKET, storageData.getTimeBucket());
             return map;
         }
@@ -72,6 +75,7 @@ public class AlarmRecord extends Record {
             record.setId0(((Number)dbMap.get(ID0)).intValue());
             record.setId1(((Number)dbMap.get(ID1)).intValue());
             record.setAlarmMessage((String)dbMap.get(ALARM_MESSAGE));
+            record.setStartTime(((Number)dbMap.get(START_TIME)).longValue());
             record.setTimeBucket(((Number)dbMap.get(TIME_BUCKET)).longValue());
             return 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 b6cd613..556dfc5 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
@@ -20,6 +20,8 @@ package org.apache.skywalking.oap.server.core.alarm;
 
 import java.util.List;
 import org.apache.skywalking.oap.server.core.analysis.worker.RecordProcess;
+import org.apache.skywalking.oap.server.library.util.TimeBucketUtils;
+import org.slf4j.*;
 
 /**
  * Save the alarm info into storage for UI query.
@@ -28,15 +30,22 @@ import org.apache.skywalking.oap.server.core.analysis.worker.RecordProcess;
  */
 public class AlarmStandardPersistence implements AlarmCallback {
 
+    private static final Logger logger = LoggerFactory.getLogger(AlarmStandardPersistence.class);
+
     @Override public void doAlarm(List<AlarmMessage> alarmMessage) {
         alarmMessage.forEach(message -> {
+            if (logger.isDebugEnabled()) {
+                logger.debug("Alarm message: {}", message.getAlarmMessage());
+            }
+
             AlarmRecord record = new AlarmRecord();
             record.setScope(message.getScope().ordinal());
             record.setId0(message.getId0());
             record.setId1(message.getId1());
             record.setName(message.getName());
             record.setAlarmMessage(message.getAlarmMessage());
-            record.setTimeBucket(message.getTimeBucket());
+            record.setStartTime(message.getStartTime());
+            record.setTimeBucket(TimeBucketUtils.INSTANCE.getMinuteTimeBucket(message.getStartTime()));
 
             RecordProcess.INSTANCE.in(record);
         });
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
new file mode 100644
index 0000000..ab8f956
--- /dev/null
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/AlarmQueryService.java
@@ -0,0 +1,56 @@
+/*
+ * 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;
+
+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.*;
+import org.apache.skywalking.oap.server.library.module.Service;
+import org.slf4j.*;
+
+/**
+ * @author peng-yongsheng
+ */
+public class AlarmQueryService implements Service {
+
+    private static final Logger logger = LoggerFactory.getLogger(AlarmQueryService.class);
+
+    private final ModuleManager moduleManager;
+    private IAlarmQueryDAO alarmQueryDAO;
+
+    public AlarmQueryService(ModuleManager moduleManager) {
+        this.moduleManager = moduleManager;
+    }
+
+    private IAlarmQueryDAO getAlarmQueryDAO() {
+        if (alarmQueryDAO == null) {
+            alarmQueryDAO = moduleManager.find(StorageModule.NAME).getService(IAlarmQueryDAO.class);
+        }
+        return alarmQueryDAO;
+    }
+
+    public Alarms getAlarm(final Scope scope, 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);
+    }
+}
diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/AlarmMessage.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/AlarmMessage.java
similarity index 88%
copy from oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/AlarmMessage.java
copy to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/AlarmMessage.java
index e79e938..99bf234 100644
--- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/AlarmMessage.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/AlarmMessage.java
@@ -16,10 +16,16 @@
  *
  */
 
-package org.apache.skywalking.oap.query.graphql.type;
+package org.apache.skywalking.oap.server.core.query.entity;
 
+import lombok.*;
 import org.apache.skywalking.oap.server.core.source.Scope;
 
+/**
+ * @author peng-yongsheng
+ */
+@Getter
+@Setter
 public class AlarmMessage {
     private Scope scope;
     private String id;
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Trace.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/AlarmTrend.java
similarity index 83%
copy from oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Trace.java
copy to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/AlarmTrend.java
index 87988a2..1d4c99e 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Trace.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/AlarmTrend.java
@@ -21,7 +21,15 @@ package org.apache.skywalking.oap.server.core.query.entity;
 import java.util.*;
 import lombok.Getter;
 
+/**
+ * @author peng-yongsheng
+ */
 @Getter
-public class Trace {
-    private List<Span> spans = new ArrayList<>();
+public class AlarmTrend {
+
+    private final List<Integer> numOfAlarm;
+
+    public AlarmTrend() {
+        this.numOfAlarm = new ArrayList<>();
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/LogEntity.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Alarms.java
similarity index 82%
copy from oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/LogEntity.java
copy to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Alarms.java
index 4b3e320..22c0aef 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/LogEntity.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Alarms.java
@@ -21,9 +21,16 @@ package org.apache.skywalking.oap.server.core.query.entity;
 import java.util.*;
 import lombok.*;
 
+/**
+ * @author peng-yongsheng
+ */
 @Getter
-@Setter
-public class LogEntity {
-    private long time;
-    private List<KeyValue> data = new ArrayList<>();
+public class Alarms {
+
+    private final List<AlarmMessage> msgs;
+    @Setter private int total;
+
+    public Alarms() {
+        this.msgs = new ArrayList<>();
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Attribute.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Attribute.java
index aab8fdc..8f7daaf 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Attribute.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Attribute.java
@@ -18,6 +18,13 @@
 
 package org.apache.skywalking.oap.server.core.query.entity;
 
+import lombok.*;
+
+/**
+ * @author peng-yongsheng
+ */
+@Getter
+@Setter
 public class Attribute {
     private String name;
     private String value;
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/BasicTrace.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/BasicTrace.java
index 7ccbdea..33bcace 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/BasicTrace.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/BasicTrace.java
@@ -21,13 +21,20 @@ package org.apache.skywalking.oap.server.core.query.entity;
 import java.util.*;
 import lombok.*;
 
+/**
+ * @author peng-yongsheng
+ */
 @Getter
-@Setter
 public class BasicTrace {
-    private String segmentId;
-    private List<String> endpointNames = new ArrayList<>();
-    private int duration;
-    private String start;
-    private boolean isError;
-    private List<String> traceIds = new ArrayList<>();
+    @Setter private String segmentId;
+    private final List<String> endpointNames;
+    @Setter private int duration;
+    @Setter private String start;
+    @Setter private boolean isError;
+    private final List<String> traceIds;
+
+    public BasicTrace() {
+        this.endpointNames = new ArrayList<>();
+        this.traceIds = new ArrayList<>();
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Call.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Call.java
index fa211d9..d1d3213 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Call.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Call.java
@@ -21,6 +21,9 @@ package org.apache.skywalking.oap.server.core.query.entity;
 import lombok.*;
 import org.apache.skywalking.oap.server.core.source.DetectPoint;
 
+/**
+ * @author peng-yongsheng
+ */
 @Getter
 @Setter
 public class Call {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/ClusterBrief.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/ClusterBrief.java
index 2588590..681eb61 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/ClusterBrief.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/ClusterBrief.java
@@ -20,6 +20,9 @@ package org.apache.skywalking.oap.server.core.query.entity;
 
 import lombok.*;
 
+/**
+ * @author peng-yongsheng
+ */
 @Getter
 @Setter
 public class ClusterBrief {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Endpoint.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Endpoint.java
index fb55fa7..cf98063 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Endpoint.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Endpoint.java
@@ -20,6 +20,9 @@ package org.apache.skywalking.oap.server.core.query.entity;
 
 import lombok.*;
 
+/**
+ * @author peng-yongsheng
+ */
 @Getter
 @Setter
 public class Endpoint {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/IntValues.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/IntValues.java
index 70609c5..9426c79 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/IntValues.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/IntValues.java
@@ -21,6 +21,14 @@ package org.apache.skywalking.oap.server.core.query.entity;
 import java.util.*;
 import lombok.Getter;
 
+/**
+ * @author peng-yongsheng
+ */
 public class IntValues {
-    @Getter private List<KVInt> values = new LinkedList<>();
+    
+    @Getter private final List<KVInt> values;
+
+    public IntValues() {
+        this.values = new LinkedList<>();
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/KVInt.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/KVInt.java
index 83d9680..1d16ad1 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/KVInt.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/KVInt.java
@@ -20,6 +20,9 @@ package org.apache.skywalking.oap.server.core.query.entity;
 
 import lombok.*;
 
+/**
+ * @author peng-yongsheng
+ */
 @Setter
 @Getter
 public class KVInt {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/KeyValue.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/KeyValue.java
index 29cb611..46e355e 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/KeyValue.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/KeyValue.java
@@ -20,6 +20,9 @@ package org.apache.skywalking.oap.server.core.query.entity;
 
 import lombok.*;
 
+/**
+ * @author peng-yongsheng
+ */
 @Getter
 @Setter
 public class KeyValue {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Language.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Language.java
index bd31a67..75bd1b4 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Language.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Language.java
@@ -18,6 +18,9 @@
 
 package org.apache.skywalking.oap.server.core.query.entity;
 
+/**
+ * @author peng-yongsheng
+ */
 public enum Language {
     UNKNOWN,
     JAVA,
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/LogEntity.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/LogEntity.java
index 4b3e320..30a0195 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/LogEntity.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/LogEntity.java
@@ -21,9 +21,15 @@ package org.apache.skywalking.oap.server.core.query.entity;
 import java.util.*;
 import lombok.*;
 
+/**
+ * @author peng-yongsheng
+ */
 @Getter
-@Setter
 public class LogEntity {
-    private long time;
-    private List<KeyValue> data = new ArrayList<>();
+    @Setter private long time;
+    private final List<KeyValue> data;
+
+    public LogEntity() {
+        this.data = new ArrayList<>();
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Node.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Node.java
index c230232..ee1c548 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Node.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Node.java
@@ -20,6 +20,9 @@ package org.apache.skywalking.oap.server.core.query.entity;
 
 import lombok.*;
 
+/**
+ * @author peng-yongsheng
+ */
 @Getter
 @Setter
 public class Node {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Order.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Order.java
index fe562c1..b81710e 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Order.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Order.java
@@ -18,6 +18,9 @@
 
 package org.apache.skywalking.oap.server.core.query.entity;
 
+/**
+ * @author peng-yongsheng
+ */
 public enum Order {
     ASC,
     DES
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Pagination.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Pagination.java
index 1c612e2..8deec5a 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Pagination.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Pagination.java
@@ -20,6 +20,9 @@ package org.apache.skywalking.oap.server.core.query.entity;
 
 import lombok.*;
 
+/**
+ * @author peng-yongsheng
+ */
 @Getter
 @Setter
 public class Pagination {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/QueryOrder.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/QueryOrder.java
index ec38895..6b829e8 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/QueryOrder.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/QueryOrder.java
@@ -18,6 +18,9 @@
 
 package org.apache.skywalking.oap.server.core.query.entity;
 
+/**
+ * @author peng-yongsheng
+ */
 public enum QueryOrder {
     BY_START_TIME,
     BY_DURATION
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Ref.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Ref.java
index d2b0f71..c32b36a 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Ref.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Ref.java
@@ -20,6 +20,9 @@ package org.apache.skywalking.oap.server.core.query.entity;
 
 import lombok.*;
 
+/**
+ * @author peng-yongsheng
+ */
 @Setter
 @Getter
 public class Ref {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/RefType.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/RefType.java
index 4436cd2..6e96257 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/RefType.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/RefType.java
@@ -18,6 +18,9 @@
 
 package org.apache.skywalking.oap.server.core.query.entity;
 
+/**
+ * @author peng-yongsheng
+ */
 public enum RefType {
     CROSS_PROCESS,
     CROSS_THREAD
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Service.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Service.java
index a2b1124..3f7a97c 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Service.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Service.java
@@ -20,6 +20,9 @@ package org.apache.skywalking.oap.server.core.query.entity;
 
 import lombok.*;
 
+/**
+ * @author peng-yongsheng
+ */
 @Getter
 @Setter
 public class Service {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/ServiceInstance.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/ServiceInstance.java
index 5acedd2..89bd6d7 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/ServiceInstance.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/ServiceInstance.java
@@ -21,11 +21,17 @@ package org.apache.skywalking.oap.server.core.query.entity;
 import java.util.*;
 import lombok.*;
 
+/**
+ * @author peng-yongsheng
+ */
 @Getter
-@Setter
 public class ServiceInstance {
-    private String id;
-    private String name;
-    private List<Attribute> attributes = new ArrayList<>();
-    private Language language;
+    @Setter private String id;
+    @Setter private String name;
+    private final List<Attribute> attributes;
+    @Setter private Language language;
+
+    public ServiceInstance() {
+        this.attributes = new ArrayList<>();
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Span.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Span.java
index 0a28568..c948c50 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Span.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Span.java
@@ -21,26 +21,34 @@ package org.apache.skywalking.oap.server.core.query.entity;
 import java.util.*;
 import lombok.*;
 
+/**
+ * @author peng-yongsheng
+ */
 @Getter
-@Setter
 public class Span {
-    private String traceId;
-    private String segmentId;
-    private int spanId;
-    private int parentSpanId;
-    private List<Ref> refs = new ArrayList<>();
-    private String serviceCode;
-    private long startTime;
-    private long endTime;
-    private String endpointName;
-    private String type;
-    private String peer;
-    private String component;
-    private boolean isError;
-    private String layer;
-    private List<KeyValue> tags = new ArrayList<>();
-    private List<LogEntity> logs = new ArrayList<>();
-    private boolean isRoot;
-    private String segmentSpanId;
-    private String segmentParentSpanId;
+    @Setter private String traceId;
+    @Setter private String segmentId;
+    @Setter private int spanId;
+    @Setter private int parentSpanId;
+    private final List<Ref> refs;
+    @Setter private String serviceCode;
+    @Setter private long startTime;
+    @Setter private long endTime;
+    @Setter private String endpointName;
+    @Setter private String type;
+    @Setter private String peer;
+    @Setter private String component;
+    @Setter private boolean isError;
+    @Setter private String layer;
+    private final List<KeyValue> tags;
+    private final List<LogEntity> logs;
+    @Setter private boolean isRoot;
+    @Setter private String segmentSpanId;
+    @Setter private String segmentParentSpanId;
+
+    public Span() {
+        this.refs = new ArrayList<>();
+        this.tags = new ArrayList<>();
+        this.logs = new ArrayList<>();
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Step.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Step.java
index 7fed3a5..7d22268 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Step.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Step.java
@@ -18,6 +18,9 @@
 
 package org.apache.skywalking.oap.server.core.query.entity;
 
+/**
+ * @author peng-yongsheng
+ */
 public enum Step {
     MONTH,
     DAY,
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Thermodynamic.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Thermodynamic.java
index 6748f13..e3b77eb 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Thermodynamic.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Thermodynamic.java
@@ -21,11 +21,17 @@ package org.apache.skywalking.oap.server.core.query.entity;
 import java.util.*;
 import lombok.*;
 
+/**
+ * @author peng-yongsheng
+ */
 @Getter
-@Setter
 public class Thermodynamic {
-    private List<List<Long>> nodes = new ArrayList<>();
-    private int axisYStep;
+    private final List<List<Long>> nodes;
+    @Setter private int axisYStep;
+
+    public Thermodynamic() {
+        this.nodes = new ArrayList<>();
+    }
 
     public void setNodeValue(int columnNum, int rowNum, Long value) {
         List<Long> element = new ArrayList<>(3);
@@ -34,5 +40,4 @@ public class Thermodynamic {
         element.add(value);
         nodes.add(element);
     }
-
 }
\ No newline at end of file
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/TopNEntity.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/TopNEntity.java
index 411b9e0..8eb8930 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/TopNEntity.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/TopNEntity.java
@@ -20,6 +20,9 @@ package org.apache.skywalking.oap.server.core.query.entity;
 
 import lombok.*;
 
+/**
+ * @author peng-yongsheng
+ */
 @Getter
 @Setter
 public class TopNEntity {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Topology.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Topology.java
index c76261d..4f2c181 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Topology.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Topology.java
@@ -21,8 +21,16 @@ package org.apache.skywalking.oap.server.core.query.entity;
 import java.util.*;
 import lombok.Getter;
 
+/**
+ * @author peng-yongsheng
+ */
 @Getter
 public class Topology {
-    private List<Node> nodes = new ArrayList<>();
-    private List<Call> calls = new ArrayList<>();
+    private final List<Node> nodes;
+    private final List<Call> calls;
+
+    public Topology() {
+        this.nodes = new ArrayList<>();
+        this.calls = new ArrayList<>();
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Trace.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Trace.java
index 87988a2..f08076c 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Trace.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Trace.java
@@ -21,7 +21,14 @@ package org.apache.skywalking.oap.server.core.query.entity;
 import java.util.*;
 import lombok.Getter;
 
+/**
+ * @author peng-yongsheng
+ */
 @Getter
 public class Trace {
-    private List<Span> spans = new ArrayList<>();
+    private final List<Span> spans;
+
+    public Trace() {
+        this.spans = new ArrayList<>();
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/TraceBrief.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/TraceBrief.java
index d24333e..64a8744 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/TraceBrief.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/TraceBrief.java
@@ -21,9 +21,15 @@ package org.apache.skywalking.oap.server.core.query.entity;
 import java.util.*;
 import lombok.*;
 
-@Setter
+/**
+ * @author peng-yongsheng
+ */
 @Getter
 public class TraceBrief {
-    private List<BasicTrace> traces = new ArrayList<>();
-    private int total;
+    private final List<BasicTrace> traces;
+    @Setter private int total;
+
+    public TraceBrief() {
+        this.traces = new ArrayList<>();
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/TraceState.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/TraceState.java
index c184a00..a7d3cac 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/TraceState.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/TraceState.java
@@ -18,6 +18,9 @@
 
 package org.apache.skywalking.oap.server.core.query.entity;
 
+/**
+ * @author peng-yongsheng
+ */
 public enum TraceState {
     ALL,
     SUCCESS,
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
index e77d036..880395c 100644
--- 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
@@ -25,5 +25,12 @@ public enum Scope {
     All, Service, ServiceInstance, Endpoint, ServiceRelation, ServiceInstanceRelation, EndpointRelation, NetworkAddress,
     ServiceInstanceJVMCPU, ServiceInstanceJVMMemory, ServiceInstanceJVMMemoryPool, ServiceInstanceJVMGC,
     ServiceComponent, ServiceMapping,
-    Segment
+    Segment;
+
+    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/storage/StorageModule.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/StorageModule.java
index 424b235..488661f 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/StorageModule.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/StorageModule.java
@@ -38,6 +38,6 @@ public class StorageModule extends ModuleDefine {
             IBatchDAO.class, StorageDAO.class, IRegisterLockDAO.class,
             IServiceInventoryCacheDAO.class, IServiceInstanceInventoryCacheDAO.class,
             IEndpointInventoryCacheDAO.class, INetworkAddressInventoryCacheDAO.class,
-            ITopologyQueryDAO.class, IMetricQueryDAO.class, ITraceQueryDAO.class, IMetadataQueryDAO.class, IAggregationQueryDAO.class};
+            ITopologyQueryDAO.class, IMetricQueryDAO.class, ITraceQueryDAO.class, IMetadataQueryDAO.class, IAggregationQueryDAO.class, IAlarmQueryDAO.class};
     }
 }
diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/AlarmMessage.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/query/IAlarmQueryDAO.java
similarity index 65%
rename from oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/AlarmMessage.java
rename to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/query/IAlarmQueryDAO.java
index e79e938..0f6d4cb 100644
--- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/AlarmMessage.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/query/IAlarmQueryDAO.java
@@ -16,13 +16,18 @@
  *
  */
 
-package org.apache.skywalking.oap.query.graphql.type;
+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.storage.DAO;
 
-public class AlarmMessage {
-    private Scope scope;
-    private String id;
-    private String message;
-    private Long startTime;
+/**
+ * @author peng-yongsheng
+ */
+public interface IAlarmQueryDAO extends DAO {
+
+    Alarms getAlarm(final Scope scope, 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/GraphQLQueryProvider.java b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/GraphQLQueryProvider.java
index 840ef42..7288c43 100644
--- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/GraphQLQueryProvider.java
+++ b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/GraphQLQueryProvider.java
@@ -65,7 +65,7 @@ public class GraphQLQueryProvider extends ModuleProvider {
             .file("query-protocol/aggregation.graphqls")
             .resolvers(new AggregationQuery(getManager()))
             .file("query-protocol/alarm.graphqls")
-            .resolvers(new AlarmQuery())
+            .resolvers(new AlarmQuery(getManager()))
             .build()
             .makeExecutableSchema();
         this.graphQL = GraphQL.newGraphQL(schema).build();
diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/AggregationQuery.java b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/AggregationQuery.java
index 47812c3..fabbc2d 100644
--- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/AggregationQuery.java
+++ b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/AggregationQuery.java
@@ -27,6 +27,9 @@ import org.apache.skywalking.oap.server.core.query.*;
 import org.apache.skywalking.oap.server.core.query.entity.*;
 import org.apache.skywalking.oap.server.library.module.ModuleManager;
 
+/**
+ * @author peng-yongsheng
+ */
 public class AggregationQuery implements GraphQLQueryResolver {
 
     private final ModuleManager moduleManager;
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 20b5703..3a30e8f 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
@@ -19,16 +19,42 @@
 package org.apache.skywalking.oap.query.graphql.resolver;
 
 import com.coxautodev.graphql.tools.GraphQLQueryResolver;
-import org.apache.skywalking.oap.query.graphql.type.*;
-import org.apache.skywalking.oap.server.core.query.entity.Pagination;
+import java.io.IOException;
+import org.apache.skywalking.oap.query.graphql.type.Duration;
+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;
 
+/**
+ * @author peng-yongsheng
+ */
 public class AlarmQuery implements GraphQLQueryResolver {
+
+    private final ModuleManager moduleManager;
+    private AlarmQueryService queryService;
+
+    public AlarmQuery(ModuleManager moduleManager) {
+        this.moduleManager = moduleManager;
+    }
+
+    private AlarmQueryService getQueryService() {
+        if (queryService == null) {
+            this.queryService = moduleManager.find(CoreModule.NAME).getService(AlarmQueryService.class);
+        }
+        return queryService;
+    }
+
     public AlarmTrend getAlarmTrend(final Duration duration) {
         return new AlarmTrend();
     }
 
-    public Alarms getAlarm(final Duration duration, final Scope scope, final String keyword, final Pagination paging) {
-        return new Alarms();
+    public Alarms getAlarm(final Duration duration, final Scope scope, final String keyword,
+        final Pagination paging) throws IOException {
+        long startTimeBucket = DurationUtils.INSTANCE.exchangeToTimeBucket(duration.getStart());
+        long endTimeBucket = DurationUtils.INSTANCE.exchangeToTimeBucket(duration.getEnd());
+
+        return getQueryService().getAlarm(scope, keyword, paging, startTimeBucket, endTimeBucket);
     }
 }
diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/MetadataQuery.java b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/MetadataQuery.java
index bcc6da0..3ab69c1 100644
--- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/MetadataQuery.java
+++ b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/MetadataQuery.java
@@ -28,6 +28,9 @@ import org.apache.skywalking.oap.server.core.query.*;
 import org.apache.skywalking.oap.server.core.query.entity.*;
 import org.apache.skywalking.oap.server.library.module.ModuleManager;
 
+/**
+ * @author peng-yongsheng
+ */
 public class MetadataQuery implements GraphQLQueryResolver {
 
     private final ModuleManager moduleManager;
diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/MetricQuery.java b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/MetricQuery.java
index 618ca0d..429d32f 100644
--- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/MetricQuery.java
+++ b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/MetricQuery.java
@@ -27,6 +27,9 @@ import org.apache.skywalking.oap.server.core.query.*;
 import org.apache.skywalking.oap.server.core.query.entity.*;
 import org.apache.skywalking.oap.server.library.module.ModuleManager;
 
+/**
+ * @author peng-yongsheng
+ */
 public class MetricQuery implements GraphQLQueryResolver {
 
     private final ModuleManager moduleManager;
diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/TopologyQuery.java b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/TopologyQuery.java
index 454d9b7..ef5a7bc 100644
--- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/TopologyQuery.java
+++ b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/TopologyQuery.java
@@ -26,6 +26,9 @@ import org.apache.skywalking.oap.server.core.query.*;
 import org.apache.skywalking.oap.server.core.query.entity.Topology;
 import org.apache.skywalking.oap.server.library.module.ModuleManager;
 
+/**
+ * @author peng-yongsheng
+ */
 public class TopologyQuery implements GraphQLQueryResolver {
 
     private final ModuleManager moduleManager;
diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/TraceQuery.java b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/TraceQuery.java
index b2d662a..aca728e 100644
--- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/TraceQuery.java
+++ b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/TraceQuery.java
@@ -29,6 +29,9 @@ import org.apache.skywalking.oap.server.library.util.StringUtils;
 
 import static java.util.Objects.nonNull;
 
+/**
+ * @author peng-yongsheng
+ */
 public class TraceQuery implements GraphQLQueryResolver {
 
     private final ModuleManager moduleManager;
diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/AlarmTrend.java b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/AlarmTrend.java
deleted file mode 100644
index a64d10f..0000000
--- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/AlarmTrend.java
+++ /dev/null
@@ -1,26 +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.query.graphql.type;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class AlarmTrend {
-    private List<Integer> numOfAlarm = new ArrayList<>();
-}
diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/Alarms.java b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/Alarms.java
deleted file mode 100644
index d9d7d3f..0000000
--- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/Alarms.java
+++ /dev/null
@@ -1,26 +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.query.graphql.type;
-
-import java.util.List;
-
-public class Alarms {
-    private List<AlarmMessage> msgs;
-    private int total;
-}
diff --git a/oap-server/server-starter/src/main/resources/alarm-settings.yml b/oap-server/server-starter/src/main/resources/alarm-settings.yml
index f26fa1e..55c150e 100644
--- a/oap-server/server-starter/src/main/resources/alarm-settings.yml
+++ b/oap-server/server-starter/src/main/resources/alarm-settings.yml
@@ -15,8 +15,8 @@
 # limitations under the License.
 
 # Sample alarm rules.
-#rules:
-#  # Rule unique name, must be ended with `_rule`.
+rules:
+  # Rule unique name, must be ended with `_rule`.
 #  endpoint_percent_rule:
 #    # Indicator value need to be long, double or int
 #    indicator-name: endpoint_percent
@@ -29,16 +29,16 @@
 #    # How many times of checks, the alarm keeps silence after alarm triggered, default as same as period.
 #    silence-period: 10
 #    message: Successful rate of endpoint {name} is lower than 75%
-#  service_percent_rule:
-#    indicator-name: service_percent
-#    # [Optional] Default, match all services in this indicator
-#    include-names:
-#      - service_a
-#      - service_b
-#    threshold: 85
-#    op: <
-#    period: 10
-#    count: 4
+  service_resp_time_rule:
+    indicator-name: service_resp_time
+    # [Optional] Default, match all services in this indicator
+    include-names:
+      - dubbox-provider
+      - dubbox-consumer
+    threshold: 1000
+    op: ">"
+    period: 10
+    count: 1
 
 #webhooks:
 #  - http://127.0.0.1/notify/
diff --git a/oap-server/server-starter/src/main/resources/log4j2.xml b/oap-server/server-starter/src/main/resources/log4j2.xml
index 2bb7226..5922930 100644
--- a/oap-server/server-starter/src/main/resources/log4j2.xml
+++ b/oap-server/server-starter/src/main/resources/log4j2.xml
@@ -32,6 +32,7 @@
         <logger name="io.netty" level="INFO"/>
         <logger name="org.apache.http" level="INFO"/>
         <logger name="org.apache.skywalking.oap.server.receiver.istio.telemetry" level="DEBUG"/>
+        <logger name="org.apache.skywalking.oap.server.core.alarm.AlarmStandardPersistence" level="DEBUG"/>
         <logger name="org.apache.skywalking.oap.server.core.remote" level="INFO"/>
         <Root level="INFO">
             <AppenderRef ref="Console"/>
diff --git a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/StorageModuleElasticsearchProvider.java b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/StorageModuleElasticsearchProvider.java
index 83e85c4..e6b9eb4 100644
--- a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/StorageModuleElasticsearchProvider.java
+++ b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/StorageModuleElasticsearchProvider.java
@@ -80,6 +80,7 @@ public class StorageModuleElasticsearchProvider extends ModuleProvider {
         this.registerServiceImplementation(ITraceQueryDAO.class, new TraceQueryEsDAO(elasticSearchClient));
         this.registerServiceImplementation(IMetadataQueryDAO.class, new MetadataQueryEsDAO(elasticSearchClient));
         this.registerServiceImplementation(IAggregationQueryDAO.class, new AggregationQueryEsDAO(elasticSearchClient));
+        this.registerServiceImplementation(IAlarmQueryDAO.class, new AlarmQueryEsDAO(elasticSearchClient));
     }
 
     @Override
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
new file mode 100644
index 0000000..942c3d7
--- /dev/null
+++ b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/AlarmQueryEsDAO.java
@@ -0,0 +1,82 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.oap.server.storage.plugin.elasticsearch.query;
+
+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.library.util.StringUtils;
+import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.base.*;
+import org.elasticsearch.action.search.SearchResponse;
+import org.elasticsearch.index.query.*;
+import org.elasticsearch.search.SearchHit;
+import org.elasticsearch.search.builder.SearchSourceBuilder;
+
+/**
+ * @author peng-yongsheng
+ */
+public class AlarmQueryEsDAO extends EsDAO implements IAlarmQueryDAO {
+
+    public AlarmQueryEsDAO(ElasticSearchClient client) {
+        super(client);
+    }
+
+    public Alarms getAlarm(final Scope scope, 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 (StringUtils.isNotEmpty(keyword)) {
+            String matchCName = MatchCNameBuilder.INSTANCE.build(AlarmRecord.ALARM_MESSAGE);
+            boolQueryBuilder.must().add(QueryBuilders.matchQuery(matchCName, keyword));
+        }
+
+        sourceBuilder.query(boolQueryBuilder);
+        sourceBuilder.size(limit);
+        sourceBuilder.from(from);
+
+        SearchResponse response = getClient().search(AlarmRecord.INDEX_NAME, sourceBuilder);
+
+        Alarms alarms = new Alarms();
+        alarms.setTotal((int)response.getHits().totalHits);
+
+        for (SearchHit searchHit : response.getHits().getHits()) {
+            AlarmRecord.Builder builder = new AlarmRecord.Builder();
+            AlarmRecord alarmRecord = builder.map2Data(searchHit.getSourceAsMap());
+
+            AlarmMessage message = new AlarmMessage();
+            message.setId(String.valueOf(alarmRecord.getId0()));
+            message.setMessage(alarmRecord.getAlarmMessage());
+            message.setStartTime(alarmRecord.getStartTime());
+            message.setScope(Scope.valueOf(alarmRecord.getScope()));
+            alarms.getMsgs().add(message);
+        }
+        return alarms;
+    }
+}