peng-yongsheng closed pull request #1753: Alarm query and alarm persistence 
test.
URL: https://github.com/apache/incubator-skywalking/pull/1753
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

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 d3d1d628a..3f8c6ea39 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 void moveTo(LocalDateTime targetTime) {
                 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 eab389bd9..66cac8d45 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 @@ private void addQueryService(List<Class> classes) {
         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 600577ca0..84435a9c8 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 CoreModuleProvider() {
         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 0f6ccd891..051e76120 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 @@
     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 491b7e2fc..dfbba922d 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 @@
 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 @@
     @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 @@
             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 @@
             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 b6cd613ac..556dfc507 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 @@
 
 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 @@
  */
 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 000000000..ab8f95640
--- /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%
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/query/entity/AlarmMessage.java
index e79e93831..99bf23414 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-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/AlarmTrend.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/AlarmTrend.java
similarity index 75%
rename from 
oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/AlarmTrend.java
rename to 
oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/AlarmTrend.java
index a64d10f3c..1d4c99eea 100644
--- 
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-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/AlarmTrend.java
@@ -16,11 +16,20 @@
  *
  */
 
-package org.apache.skywalking.oap.query.graphql.type;
+package org.apache.skywalking.oap.server.core.query.entity;
 
-import java.util.ArrayList;
-import java.util.List;
+import java.util.*;
+import lombok.Getter;
 
+/**
+ * @author peng-yongsheng
+ */
+@Getter
 public class AlarmTrend {
-    private List<Integer> numOfAlarm = new ArrayList<>();
+
+    private final List<Integer> numOfAlarm;
+
+    public AlarmTrend() {
+        this.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-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Alarms.java
similarity index 74%
rename from 
oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/Alarms.java
rename to 
oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Alarms.java
index d9d7d3f41..22c0aef96 100644
--- 
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-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Alarms.java
@@ -16,11 +16,21 @@
  *
  */
 
-package org.apache.skywalking.oap.query.graphql.type;
+package org.apache.skywalking.oap.server.core.query.entity;
 
-import java.util.List;
+import java.util.*;
+import lombok.*;
 
+/**
+ * @author peng-yongsheng
+ */
+@Getter
 public class Alarms {
-    private List<AlarmMessage> msgs;
-    private int total;
+
+    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 aab8fdc85..8f7daafed 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 7ccbdeacf..33bcace42 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 @@
 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 fa211d98e..d1d32135e 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 @@
 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 2588590c0..681eb6121 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 @@
 
 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 fb55fa77b..cf98063c2 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 @@
 
 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 70609c502..9426c7935 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 @@
 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 83d9680d4..1d16ad1bd 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 @@
 
 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 29cb6116d..46e355ef6 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 @@
 
 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 bd31a6791..75bd1b419 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 4b3e32034..30a019573 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 @@
 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 c2302327a..ee1c54884 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 @@
 
 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 fe562c1af..b81710efb 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 1c612e23b..8deec5ac5 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 @@
 
 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 ec388954f..6b829e872 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 d2b0f71f8..c32b36a7f 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 @@
 
 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 4436cd25e..6e9625707 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 a2b112472..3f7a97c5e 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 @@
 
 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 5acedd221..89bd6d793 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 @@
 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 0a28568a2..c948c506b 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 @@
 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 7fed3a53f..7d22268e6 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 6748f13d9..e3b77eb1f 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 @@
 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 void setNodeValue(int columnNum, int rowNum, Long 
value) {
         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 411b9e0d3..8eb893096 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 @@
 
 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 c76261de2..4f2c18160 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 @@
 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 87988a2ba..f08076c74 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 @@
 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 d24333ed2..64a874479 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 @@
 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 c184a00d0..a7d3cac3e 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 e77d03601..880395cbf 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 @@
     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 424b23564..488661f4e 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 @@
             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-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
new file mode 100644
index 000000000..0f6d4cb21
--- /dev/null
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/query/IAlarmQueryDAO.java
@@ -0,0 +1,33 @@
+/*
+ * 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.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;
+
+/**
+ * @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 840ef4295..7288c43ea 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 @@
             .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 47812c3a2..fabbc2de4 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.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 20b570346..3a30e8f2c 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 bcc6da09a..3ab69c1ad 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.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 618ca0d3d..429d32fb6 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.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 454d9b798..ef5a7bc7b 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.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 b2d662ad2..aca728e1b 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 static java.util.Objects.nonNull;
 
+/**
+ * @author peng-yongsheng
+ */
 public class TraceQuery implements GraphQLQueryResolver {
 
     private final ModuleManager moduleManager;
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 f26fa1e20..55c150eaf 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 2bb72264c..59229302e 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 83e85c47f..e6b9eb453 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 void prepare() throws ServiceNotProvidedException {
         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 000000000..942c3d7a3
--- /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;
+    }
+}


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


With regards,
Apache Git Services

Reply via email to