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

[incubator-skywalking] branch master updated: Analysis and query implementation of thermodynamic. (#1678)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 2bad786  Analysis and query implementation of thermodynamic. (#1678)
2bad786 is described below

commit 2bad786e798eb9c2fbf26c58aeadc91dc21d4880
Author: 彭勇升 pengys <80...@qq.com>
AuthorDate: Sun Sep 16 10:57:12 2018 +0800

    Analysis and query implementation of thermodynamic. (#1678)
    
    * Metric query.
    
    * Analysis and query implementation of thermodynamic.
---
 .../apache/skywalking/oap/server/core/Const.java   |  2 +
 .../generated/all/AllHeatmapIndicator.java         | 15 ++---
 .../analysis/generated/all/AllP50Indicator.java    |  4 +-
 .../analysis/generated/all/AllP75Indicator.java    |  4 +-
 .../analysis/generated/all/AllP90Indicator.java    |  4 +-
 .../analysis/generated/all/AllP95Indicator.java    |  4 +-
 .../analysis/generated/all/AllP99Indicator.java    |  4 +-
 .../core/analysis/indicator/IntKeyLongValue.java   | 19 ++++--
 .../analysis/indicator/IntKeyLongValueArray.java   | 58 ++++++++++++++++++
 .../core/analysis/indicator/PxxIndicator.java      | 25 ++------
 .../analysis/indicator/ThermodynamicIndicator.java |  8 +--
 .../server/core/query/MetadataQueryService.java    | 70 ++++++++++++++++++++++
 .../oap/server/core/query/MetricQueryService.java  |  1 +
 .../oap/server/core/query/entity}/Attribute.java   |  2 +-
 .../server/core/query/entity}/ClusterBrief.java    |  6 +-
 .../oap/server/core/query/entity}/Endpoint.java    |  2 +-
 .../oap/server/core/query/entity}/Language.java    |  2 +-
 .../oap/server/core/query/entity}/Service.java     |  6 +-
 .../server/core/query/entity}/ServiceInstance.java |  9 ++-
 .../core/storage/query/IMetadataQueryDAO.java}     | 11 ++--
 .../server/core/storage/type/StorageDataType.java} | 13 ++--
 .../oap/server/library/module/Service.java         |  1 -
 .../oap/query/graphql/GraphQLQueryProvider.java    |  2 +-
 .../oap/query/graphql/resolver/MetadataQuery.java  | 52 ++++++++++++----
 .../elasticsearch/base/ColumnTypeEsMapping.java    |  4 +-
 .../plugin/elasticsearch/base/IndicatorEsDAO.java  | 15 ++++-
 .../elasticsearch/query/MetricQueryEsDAO.java      | 18 +++++-
 27 files changed, 279 insertions(+), 82 deletions(-)

diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/Const.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/Const.java
index ca3583a..fbad921 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/Const.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/Const.java
@@ -24,6 +24,8 @@ package org.apache.skywalking.oap.server.core;
 public class Const {
     public static final int NONE = 0;
     public static final String ID_SPLIT = "_";
+    public static final String KEY_VALUE_SPLIT = ",";
+    public static final String ARRAY_SPLIT = "|";
     public static final int NONE_SERVICE_ID = 1;
     public static final int NONE_INSTANCE_ID = 1;
     public static final int NONE_ENDPOINT_ID = 1;
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllHeatmapIndicator.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllHeatmapIndicator.java
index a1261cb..e0ab631 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllHeatmapIndicator.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllHeatmapIndicator.java
@@ -19,15 +19,14 @@
 package org.apache.skywalking.oap.server.core.analysis.generated.all;
 
 import java.util.*;
-import org.apache.skywalking.oap.server.core.alarm.AlarmMeta;
-import org.apache.skywalking.oap.server.core.alarm.AlarmSupported;
+import org.apache.skywalking.oap.server.core.alarm.*;
 import org.apache.skywalking.oap.server.core.analysis.indicator.*;
 import org.apache.skywalking.oap.server.core.analysis.indicator.annotation.IndicatorType;
 import org.apache.skywalking.oap.server.core.remote.annotation.StreamData;
 import org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData;
-import org.apache.skywalking.oap.server.core.storage.annotation.*;
-import org.apache.skywalking.oap.server.core.storage.StorageBuilder;
 import org.apache.skywalking.oap.server.core.source.Scope;
+import org.apache.skywalking.oap.server.core.storage.StorageBuilder;
+import org.apache.skywalking.oap.server.core.storage.annotation.StorageEntity;
 
 /**
  * This class is auto generated. Please don't change this class manually.
@@ -39,7 +38,6 @@ import org.apache.skywalking.oap.server.core.source.Scope;
 @StorageEntity(name = "all_heatmap", builder = AllHeatmapIndicator.Builder.class)
 public class AllHeatmapIndicator extends ThermodynamicIndicator implements AlarmSupported {
 
-
     @Override public String id() {
         String splitJointId = String.valueOf(getTimeBucket());
         return splitJointId;
@@ -51,7 +49,6 @@ public class AllHeatmapIndicator extends ThermodynamicIndicator implements Alarm
         return result;
     }
 
-
     @Override public int remoteHashCode() {
         int result = 17;
         return result;
@@ -78,7 +75,6 @@ public class AllHeatmapIndicator extends ThermodynamicIndicator implements Alarm
 
         remoteBuilder.setDataLongs(0, getTimeBucket());
 
-
         remoteBuilder.setDataIntegers(0, getStep());
         remoteBuilder.setDataIntegers(1, getNumOfSteps());
         getDetailGroup().forEach(element -> remoteBuilder.addDataIntLongPairList(element.serialize()));
@@ -90,11 +86,10 @@ public class AllHeatmapIndicator extends ThermodynamicIndicator implements Alarm
 
         setTimeBucket(remoteData.getDataLongs(0));
 
-
         setStep(remoteData.getDataIntegers(0));
         setNumOfSteps(remoteData.getDataIntegers(1));
 
-        setDetailGroup(new ArrayList<>(30));
+        setDetailGroup(new IntKeyLongValueArray(30));
         remoteData.getDataIntLongPairListList().forEach(element -> {
             getDetailGroup().add(new IntKeyLongValue(element.getKey(), element.getValue()));
         });
@@ -153,7 +148,7 @@ public class AllHeatmapIndicator extends ThermodynamicIndicator implements Alarm
             AllHeatmapIndicator indicator = new AllHeatmapIndicator();
             indicator.setStep(((Number)dbMap.get("step")).intValue());
             indicator.setNumOfSteps(((Number)dbMap.get("num_of_steps")).intValue());
-            indicator.setDetailGroup((java.util.List)dbMap.get("detail_group"));
+            indicator.setDetailGroup((IntKeyLongValueArray)dbMap.get("detail_group"));
             indicator.setTimeBucket(((Number)dbMap.get("time_bucket")).longValue());
             return indicator;
         }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP50Indicator.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP50Indicator.java
index 3471b31..1bc9abe 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP50Indicator.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP50Indicator.java
@@ -94,7 +94,7 @@ public class AllP50Indicator extends P50Indicator implements AlarmSupported {
         setValue(remoteData.getDataIntegers(0));
         setPrecision(remoteData.getDataIntegers(1));
 
-        setDetailGroup(new ArrayList<>(30));
+        setDetailGroup(new IntKeyLongValueArray(30));
         remoteData.getDataIntLongPairListList().forEach(element -> {
             getDetailGroup().add(new IntKeyLongValue(element.getKey(), element.getValue()));
         });
@@ -153,7 +153,7 @@ public class AllP50Indicator extends P50Indicator implements AlarmSupported {
             AllP50Indicator indicator = new AllP50Indicator();
             indicator.setValue(((Number)dbMap.get("value")).intValue());
             indicator.setPrecision(((Number)dbMap.get("precision")).intValue());
-            indicator.setDetailGroup((java.util.List)dbMap.get("detail_group"));
+            indicator.setDetailGroup((IntKeyLongValueArray)dbMap.get("detail_group"));
             indicator.setTimeBucket(((Number)dbMap.get("time_bucket")).longValue());
             return indicator;
         }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP75Indicator.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP75Indicator.java
index 4bf661b..fbcedcb 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP75Indicator.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP75Indicator.java
@@ -94,7 +94,7 @@ public class AllP75Indicator extends P75Indicator implements AlarmSupported {
         setValue(remoteData.getDataIntegers(0));
         setPrecision(remoteData.getDataIntegers(1));
 
-        setDetailGroup(new ArrayList<>(30));
+        setDetailGroup(new IntKeyLongValueArray(30));
         remoteData.getDataIntLongPairListList().forEach(element -> {
             getDetailGroup().add(new IntKeyLongValue(element.getKey(), element.getValue()));
         });
@@ -153,7 +153,7 @@ public class AllP75Indicator extends P75Indicator implements AlarmSupported {
             AllP75Indicator indicator = new AllP75Indicator();
             indicator.setValue(((Number)dbMap.get("value")).intValue());
             indicator.setPrecision(((Number)dbMap.get("precision")).intValue());
-            indicator.setDetailGroup((java.util.List)dbMap.get("detail_group"));
+            indicator.setDetailGroup((IntKeyLongValueArray)dbMap.get("detail_group"));
             indicator.setTimeBucket(((Number)dbMap.get("time_bucket")).longValue());
             return indicator;
         }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP90Indicator.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP90Indicator.java
index e2771a8..f2031b1 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP90Indicator.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP90Indicator.java
@@ -94,7 +94,7 @@ public class AllP90Indicator extends P90Indicator implements AlarmSupported {
         setValue(remoteData.getDataIntegers(0));
         setPrecision(remoteData.getDataIntegers(1));
 
-        setDetailGroup(new ArrayList<>(30));
+        setDetailGroup(new IntKeyLongValueArray(30));
         remoteData.getDataIntLongPairListList().forEach(element -> {
             getDetailGroup().add(new IntKeyLongValue(element.getKey(), element.getValue()));
         });
@@ -153,7 +153,7 @@ public class AllP90Indicator extends P90Indicator implements AlarmSupported {
             AllP90Indicator indicator = new AllP90Indicator();
             indicator.setValue(((Number)dbMap.get("value")).intValue());
             indicator.setPrecision(((Number)dbMap.get("precision")).intValue());
-            indicator.setDetailGroup((java.util.List)dbMap.get("detail_group"));
+            indicator.setDetailGroup((IntKeyLongValueArray)dbMap.get("detail_group"));
             indicator.setTimeBucket(((Number)dbMap.get("time_bucket")).longValue());
             return indicator;
         }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP95Indicator.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP95Indicator.java
index cc9c840..64f17a1 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP95Indicator.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP95Indicator.java
@@ -94,7 +94,7 @@ public class AllP95Indicator extends P95Indicator implements AlarmSupported {
         setValue(remoteData.getDataIntegers(0));
         setPrecision(remoteData.getDataIntegers(1));
 
-        setDetailGroup(new ArrayList<>(30));
+        setDetailGroup(new IntKeyLongValueArray(30));
         remoteData.getDataIntLongPairListList().forEach(element -> {
             getDetailGroup().add(new IntKeyLongValue(element.getKey(), element.getValue()));
         });
@@ -153,7 +153,7 @@ public class AllP95Indicator extends P95Indicator implements AlarmSupported {
             AllP95Indicator indicator = new AllP95Indicator();
             indicator.setValue(((Number)dbMap.get("value")).intValue());
             indicator.setPrecision(((Number)dbMap.get("precision")).intValue());
-            indicator.setDetailGroup((java.util.List)dbMap.get("detail_group"));
+            indicator.setDetailGroup((IntKeyLongValueArray)dbMap.get("detail_group"));
             indicator.setTimeBucket(((Number)dbMap.get("time_bucket")).longValue());
             return indicator;
         }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP99Indicator.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP99Indicator.java
index 031d7cb..01ce273 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP99Indicator.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/generated/all/AllP99Indicator.java
@@ -94,7 +94,7 @@ public class AllP99Indicator extends P99Indicator implements AlarmSupported {
         setValue(remoteData.getDataIntegers(0));
         setPrecision(remoteData.getDataIntegers(1));
 
-        setDetailGroup(new ArrayList<>(30));
+        setDetailGroup(new IntKeyLongValueArray(30));
         remoteData.getDataIntLongPairListList().forEach(element -> {
             getDetailGroup().add(new IntKeyLongValue(element.getKey(), element.getValue()));
         });
@@ -153,7 +153,7 @@ public class AllP99Indicator extends P99Indicator implements AlarmSupported {
             AllP99Indicator indicator = new AllP99Indicator();
             indicator.setValue(((Number)dbMap.get("value")).intValue());
             indicator.setPrecision(((Number)dbMap.get("precision")).intValue());
-            indicator.setDetailGroup((java.util.List)dbMap.get("detail_group"));
+            indicator.setDetailGroup((IntKeyLongValueArray)dbMap.get("detail_group"));
             indicator.setTimeBucket(((Number)dbMap.get("time_bucket")).longValue());
             return indicator;
         }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/IntKeyLongValue.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/IntKeyLongValue.java
index 0537d60..f3fcdc0 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/IntKeyLongValue.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/IntKeyLongValue.java
@@ -19,18 +19,19 @@
 package org.apache.skywalking.oap.server.core.analysis.indicator;
 
 import java.util.Objects;
-import lombok.Getter;
-import lombok.Setter;
+import lombok.*;
+import org.apache.skywalking.oap.server.core.Const;
 import org.apache.skywalking.oap.server.core.remote.grpc.proto.IntKeyLongValuePair;
+import org.apache.skywalking.oap.server.core.storage.type.StorageDataType;
 
 /**
  * IntKeyLongValue is a common bean, with key in Int and value in Long
  *
- * @author wusheng
+ * @author wusheng, peng-yongsheng
  */
 @Setter
 @Getter
-public class IntKeyLongValue implements Comparable<IntKeyLongValue> {
+public class IntKeyLongValue implements Comparable<IntKeyLongValue>, StorageDataType {
     private int key;
     private long value;
 
@@ -72,4 +73,14 @@ public class IntKeyLongValue implements Comparable<IntKeyLongValue> {
         this.key = pair.getKey();
         this.value = pair.getValue();
     }
+
+    @Override public String toStorageData() {
+        return key + Const.KEY_VALUE_SPLIT + value;
+    }
+
+    @Override public void toObject(String data) {
+        String[] keyValue = data.split(Const.KEY_VALUE_SPLIT);
+        this.key = Integer.valueOf(keyValue[0]);
+        this.value = Long.valueOf(keyValue[1]);
+    }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/IntKeyLongValueArray.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/IntKeyLongValueArray.java
new file mode 100644
index 0000000..298da62
--- /dev/null
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/IntKeyLongValueArray.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.oap.server.core.analysis.indicator;
+
+import java.util.ArrayList;
+import org.apache.skywalking.oap.server.core.Const;
+import org.apache.skywalking.oap.server.core.storage.type.StorageDataType;
+
+/**
+ * @author peng-yongsheng
+ */
+public class IntKeyLongValueArray extends ArrayList<IntKeyLongValue> implements StorageDataType {
+
+    public IntKeyLongValueArray(int initialCapacity) {
+        super(initialCapacity);
+    }
+
+    public IntKeyLongValueArray() {
+        super();
+    }
+
+    @Override public String toStorageData() {
+        StringBuilder data = new StringBuilder();
+        for (int i = 0; i < this.size(); i++) {
+            if (i == 0) {
+                data.append(this.get(i).toStorageData());
+            } else {
+                data.append(Const.ARRAY_SPLIT).append(this.get(i).toStorageData());
+            }
+        }
+        return data.toString();
+    }
+
+    @Override public void toObject(String data) {
+        String[] keyValues = data.split(Const.ARRAY_SPLIT);
+        for (int i = 0; i < keyValues.length; i++) {
+            IntKeyLongValue value = new IntKeyLongValue();
+            value.toObject(keyValues[i]);
+            this.set(i, value);
+        }
+    }
+}
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/PxxIndicator.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/PxxIndicator.java
index 282b877..d16f9bf 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/PxxIndicator.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/PxxIndicator.java
@@ -18,17 +18,9 @@
 
 package org.apache.skywalking.oap.server.core.analysis.indicator;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import lombok.Getter;
-import lombok.Setter;
-import org.apache.skywalking.oap.server.core.analysis.indicator.annotation.Arg;
-import org.apache.skywalking.oap.server.core.analysis.indicator.annotation.Entrance;
-import org.apache.skywalking.oap.server.core.analysis.indicator.annotation.IndicatorOperator;
-import org.apache.skywalking.oap.server.core.analysis.indicator.annotation.SourceFrom;
+import java.util.*;
+import lombok.*;
+import org.apache.skywalking.oap.server.core.analysis.indicator.annotation.*;
 import org.apache.skywalking.oap.server.core.storage.annotation.Column;
 
 /**
@@ -38,7 +30,7 @@ import org.apache.skywalking.oap.server.core.storage.annotation.Column;
  * observations in a group of observations fall. For example, the 20th percentile is the value (or score) below which
  * 20% of the observations may be found.
  *
- * @author wusheng
+ * @author wusheng, peng-yongsheng
  */
 @IndicatorOperator
 public abstract class PxxIndicator extends Indicator implements IntValueHolder {
@@ -48,14 +40,14 @@ public abstract class PxxIndicator extends Indicator implements IntValueHolder {
 
     @Getter @Setter @Column(columnName = VALUE) private int value;
     @Getter @Setter @Column(columnName = PRECISION) private int precision;
-    @Getter @Setter @Column(columnName = DETAIL_GROUP) private List<IntKeyLongValue> detailGroup;
+    @Getter @Setter @Column(columnName = DETAIL_GROUP) private IntKeyLongValueArray detailGroup;
 
     private final int percentileRank;
     private Map<Integer, IntKeyLongValue> detailIndex;
 
     public PxxIndicator(int percentileRank) {
         this.percentileRank = percentileRank;
-        detailGroup = new ArrayList<>(30);
+        detailGroup = new IntKeyLongValueArray(30);
     }
 
     @Entrance
@@ -111,11 +103,6 @@ public abstract class PxxIndicator extends Indicator implements IntValueHolder {
         }
     }
 
-    @Override
-    public int getValue() {
-        return value;
-    }
-
     private void addElement(IntKeyLongValue element) {
         detailGroup.add(element);
         detailIndex.put(element.getKey(), element);
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/ThermodynamicIndicator.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/ThermodynamicIndicator.java
index acc35d3..a69f7ef 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/ThermodynamicIndicator.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/indicator/ThermodynamicIndicator.java
@@ -31,17 +31,17 @@ import org.apache.skywalking.oap.server.core.storage.annotation.Column;
  * A heat map (or heatmap) is a graphical representation of data where the individual values contained in a matrix are
  * represented as colors.
  *
- * @author wusheng
+ * @author wusheng, peng-yongsheng
  */
 @IndicatorOperator
 public abstract class ThermodynamicIndicator extends Indicator {
-    protected static final String DETAIL_GROUP = "detail_group";
-    protected static final String STEP = "step";
+    public static final String DETAIL_GROUP = "detail_group";
+    public static final String STEP = "step";
     public static final String NUM_OF_STEPS = "num_of_steps";
 
     @Getter @Setter @Column(columnName = STEP) private int step = 0;
     @Getter @Setter @Column(columnName = NUM_OF_STEPS) private int numOfSteps = 0;
-    @Getter @Setter @Column(columnName = DETAIL_GROUP) private List<IntKeyLongValue> detailGroup = new ArrayList<>(30);
+    @Getter @Setter @Column(columnName = DETAIL_GROUP) private IntKeyLongValueArray detailGroup = new IntKeyLongValueArray(30);
 
     private Map<Integer, IntKeyLongValue> detailIndex;
 
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/MetadataQueryService.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/MetadataQueryService.java
new file mode 100644
index 0000000..7520b0b
--- /dev/null
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/MetadataQueryService.java
@@ -0,0 +1,70 @@
+/*
+ * 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.util.*;
+import org.apache.skywalking.oap.server.core.query.entity.*;
+import org.apache.skywalking.oap.server.core.storage.StorageModule;
+import org.apache.skywalking.oap.server.core.storage.query.IMetadataQueryDAO;
+import org.apache.skywalking.oap.server.library.module.ModuleManager;
+
+/**
+ * @author peng-yongsheng
+ */
+public class MetadataQueryService implements org.apache.skywalking.oap.server.library.module.Service {
+
+    private final ModuleManager moduleManager;
+    private IMetadataQueryDAO metadataQueryDAO;
+
+    public MetadataQueryService(ModuleManager moduleManager) {
+        this.moduleManager = moduleManager;
+    }
+
+    public IMetadataQueryDAO getMetadataQueryDAO() {
+        if (metadataQueryDAO == null) {
+            metadataQueryDAO = moduleManager.find(StorageModule.NAME).getService(IMetadataQueryDAO.class);
+        }
+        return metadataQueryDAO;
+    }
+
+    public ClusterBrief getGlobalBrief(final Step step, final long startTB, final long endTB) {
+        return new ClusterBrief();
+    }
+
+    public List<Service> getAllServices(final Step step, final long startTB, final long endTB) {
+        return Collections.emptyList();
+    }
+
+    public List<Service> searchServices(final Step step, final long startTB, final long endTB, final String keyword) {
+        return Collections.emptyList();
+    }
+
+    public List<ServiceInstance> getServiceInstances(final Step step, final long startTB, final long endTB,
+        final String id) {
+        return Collections.emptyList();
+    }
+
+    public List<Endpoint> searchEndpoint(final String keyword, final String serviceId, final int limit) {
+        return Collections.emptyList();
+    }
+
+    public Service searchService(final Step step, final long startTB, final long endTB, final String serviceCode) {
+        return new Service();
+    }
+}
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/MetricQueryService.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/MetricQueryService.java
index 4c8a841..1e9c217 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/MetricQueryService.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/MetricQueryService.java
@@ -29,6 +29,7 @@ import org.apache.skywalking.oap.server.core.storage.StorageModule;
 import org.apache.skywalking.oap.server.core.storage.annotation.ValueColumnIds;
 import org.apache.skywalking.oap.server.core.storage.query.IMetricQueryDAO;
 import org.apache.skywalking.oap.server.library.module.*;
+import org.apache.skywalking.oap.server.library.module.Service;
 import org.slf4j.*;
 
 /**
diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/Attribute.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Attribute.java
similarity index 93%
rename from oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/Attribute.java
rename to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Attribute.java
index 70d2915..aab8fdc 100644
--- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/Attribute.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Attribute.java
@@ -16,7 +16,7 @@
  *
  */
 
-package org.apache.skywalking.oap.query.graphql.type;
+package org.apache.skywalking.oap.server.core.query.entity;
 
 public class Attribute {
     private String name;
diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/ClusterBrief.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/ClusterBrief.java
similarity index 91%
rename from oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/ClusterBrief.java
rename to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/ClusterBrief.java
index b5d20a6..2588590 100644
--- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/ClusterBrief.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/ClusterBrief.java
@@ -16,8 +16,12 @@
  *
  */
 
-package org.apache.skywalking.oap.query.graphql.type;
+package org.apache.skywalking.oap.server.core.query.entity;
 
+import lombok.*;
+
+@Getter
+@Setter
 public class ClusterBrief {
     private int numOfService;
     private int numOfEndpoint;
diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/Endpoint.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Endpoint.java
similarity index 93%
copy from oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/Endpoint.java
copy to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Endpoint.java
index 1b9ae82..d0b4b8e 100644
--- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/Endpoint.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Endpoint.java
@@ -16,7 +16,7 @@
  *
  */
 
-package org.apache.skywalking.oap.query.graphql.type;
+package org.apache.skywalking.oap.server.core.query.entity;
 
 public class Endpoint {
     private String id;
diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/Language.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Language.java
similarity index 93%
rename from oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/Language.java
rename to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Language.java
index bec5592..bd31a67 100644
--- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/Language.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Language.java
@@ -16,7 +16,7 @@
  *
  */
 
-package org.apache.skywalking.oap.query.graphql.type;
+package org.apache.skywalking.oap.server.core.query.entity;
 
 public enum Language {
     UNKNOWN,
diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/Service.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Service.java
similarity index 90%
rename from oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/Service.java
rename to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Service.java
index fbc4d7b..a2b1124 100644
--- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/Service.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/Service.java
@@ -16,8 +16,12 @@
  *
  */
 
-package org.apache.skywalking.oap.query.graphql.type;
+package org.apache.skywalking.oap.server.core.query.entity;
 
+import lombok.*;
+
+@Getter
+@Setter
 public class Service {
     private String id;
     private String name;
diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/ServiceInstance.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/ServiceInstance.java
similarity index 84%
rename from oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/ServiceInstance.java
rename to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/ServiceInstance.java
index 725a1c6..5acedd2 100644
--- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/ServiceInstance.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/entity/ServiceInstance.java
@@ -16,13 +16,16 @@
  *
  */
 
-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.*;
 
+@Getter
+@Setter
 public class ServiceInstance {
     private String id;
     private String name;
-    private List<Attribute> attributes;
+    private List<Attribute> attributes = new ArrayList<>();
     private Language language;
 }
diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/Endpoint.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/query/IMetadataQueryDAO.java
similarity index 79%
copy from oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/Endpoint.java
copy to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/query/IMetadataQueryDAO.java
index 1b9ae82..2101c90 100644
--- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/Endpoint.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/query/IMetadataQueryDAO.java
@@ -16,9 +16,12 @@
  *
  */
 
-package org.apache.skywalking.oap.query.graphql.type;
+package org.apache.skywalking.oap.server.core.storage.query;
 
-public class Endpoint {
-    private String id;
-    private String name;
+import org.apache.skywalking.oap.server.core.storage.DAO;
+
+/**
+ * @author peng-yongsheng
+ */
+public interface IMetadataQueryDAO extends DAO {
 }
diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/Endpoint.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/type/StorageDataType.java
similarity index 80%
rename from oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/Endpoint.java
rename to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/type/StorageDataType.java
index 1b9ae82..4545d9e 100644
--- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/type/Endpoint.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/type/StorageDataType.java
@@ -16,9 +16,14 @@
  *
  */
 
-package org.apache.skywalking.oap.query.graphql.type;
+package org.apache.skywalking.oap.server.core.storage.type;
 
-public class Endpoint {
-    private String id;
-    private String name;
+/**
+ * @author peng-yongsheng
+ */
+public interface StorageDataType {
+
+    String toStorageData();
+
+    void toObject(String data);
 }
diff --git a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/Service.java b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/Service.java
index 4061202..ef5805a 100644
--- a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/Service.java
+++ b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/Service.java
@@ -16,7 +16,6 @@
  *
  */
 
-
 package org.apache.skywalking.oap.server.library.module;
 
 /**
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 b2e4bfc..a089041 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
@@ -55,7 +55,7 @@ public class GraphQLQueryProvider extends ModuleProvider {
             .file("query-protocol/common.graphqls")
             .resolvers(new Query(), new Mutation())
             .file("query-protocol/metadata.graphqls")
-            .resolvers(new MetadataQuery())
+            .resolvers(new MetadataQuery(getManager()))
             .file("query-protocol/metric.graphqls")
             .resolvers(new MetricQuery(getManager()))
             .file("query-protocol/topology.graphqls")
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 b448113..6f5e2f7 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
@@ -19,37 +19,65 @@
 package org.apache.skywalking.oap.query.graphql.resolver;
 
 import com.coxautodev.graphql.tools.GraphQLQueryResolver;
-import java.util.Collections;
 import java.util.List;
-import org.apache.skywalking.oap.query.graphql.type.ClusterBrief;
 import org.apache.skywalking.oap.query.graphql.type.Duration;
-import org.apache.skywalking.oap.query.graphql.type.Endpoint;
-import org.apache.skywalking.oap.query.graphql.type.Service;
-import org.apache.skywalking.oap.query.graphql.type.ServiceInstance;
+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.library.module.ModuleManager;
 
 public class MetadataQuery implements GraphQLQueryResolver {
+
+    private final ModuleManager moduleManager;
+    private MetadataQueryService metadataQueryService;
+
+    public MetadataQuery(ModuleManager moduleManager) {
+        this.moduleManager = moduleManager;
+    }
+
+    private MetadataQueryService getMetadataQueryService() {
+        if (metadataQueryService == null) {
+            this.metadataQueryService = moduleManager.find(CoreModule.NAME).getService(MetadataQueryService.class);
+        }
+        return metadataQueryService;
+    }
+
     public ClusterBrief getGlobalBrief(final Duration duration) {
-        return new ClusterBrief();
+        long startTimeBucket = DurationUtils.INSTANCE.exchangeToTimeBucket(duration.getStart());
+        long endTimeBucket = DurationUtils.INSTANCE.exchangeToTimeBucket(duration.getEnd());
+
+        return getMetadataQueryService().getGlobalBrief(duration.getStep(), startTimeBucket, endTimeBucket);
     }
 
     public List<Service> getAllServices(final Duration duration) {
-        return Collections.emptyList();
+        long startTimeBucket = DurationUtils.INSTANCE.exchangeToTimeBucket(duration.getStart());
+        long endTimeBucket = DurationUtils.INSTANCE.exchangeToTimeBucket(duration.getEnd());
+
+        return getMetadataQueryService().getAllServices(duration.getStep(), startTimeBucket, endTimeBucket);
     }
 
     public List<Service> searchServices(final Duration duration, final String keyword) {
-        return Collections.emptyList();
+        long startTimeBucket = DurationUtils.INSTANCE.exchangeToTimeBucket(duration.getStart());
+        long endTimeBucket = DurationUtils.INSTANCE.exchangeToTimeBucket(duration.getEnd());
+
+        return getMetadataQueryService().searchServices(duration.getStep(), startTimeBucket, endTimeBucket, keyword);
     }
 
     public List<ServiceInstance> getServiceInstances(final Duration duration, final String id) {
-        return Collections.emptyList();
+        long startTimeBucket = DurationUtils.INSTANCE.exchangeToTimeBucket(duration.getStart());
+        long endTimeBucket = DurationUtils.INSTANCE.exchangeToTimeBucket(duration.getEnd());
+
+        return getMetadataQueryService().getServiceInstances(duration.getStep(), startTimeBucket, endTimeBucket, id);
     }
 
     public List<Endpoint> searchEndpoint(final String keyword, final String serviceId, final int limit) {
-        return Collections.emptyList();
+        return getMetadataQueryService().searchEndpoint(keyword, serviceId, limit);
     }
 
-
     public Service searchService(final Duration duration, final String serviceCode) {
-        return new Service();
+        long startTimeBucket = DurationUtils.INSTANCE.exchangeToTimeBucket(duration.getStart());
+        long endTimeBucket = DurationUtils.INSTANCE.exchangeToTimeBucket(duration.getEnd());
+
+        return getMetadataQueryService().searchService(duration.getStep(), startTimeBucket, endTimeBucket, serviceCode);
     }
 }
diff --git a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/base/ColumnTypeEsMapping.java b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/base/ColumnTypeEsMapping.java
index 0647eea..37c3db8 100644
--- a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/base/ColumnTypeEsMapping.java
+++ b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/base/ColumnTypeEsMapping.java
@@ -18,7 +18,7 @@
 
 package org.apache.skywalking.oap.server.storage.plugin.elasticsearch.base;
 
-import java.util.List;
+import org.apache.skywalking.oap.server.core.analysis.indicator.IntKeyLongValueArray;
 import org.apache.skywalking.oap.server.core.storage.model.DataTypeMapping;
 
 /**
@@ -35,7 +35,7 @@ public class ColumnTypeEsMapping implements DataTypeMapping {
             return "double";
         } else if (String.class.equals(type)) {
             return "keyword";
-        } else if (List.class.equals(type)) {
+        } else if (IntKeyLongValueArray.class.equals(type)) {
             return "keyword";
         } else {
             throw new IllegalArgumentException("Unsupported data type: " + type.getName());
diff --git a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/base/IndicatorEsDAO.java b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/base/IndicatorEsDAO.java
index 37b4d47..8bfb6d4 100644
--- a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/base/IndicatorEsDAO.java
+++ b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/base/IndicatorEsDAO.java
@@ -22,6 +22,7 @@ import java.io.IOException;
 import java.util.Map;
 import org.apache.skywalking.oap.server.core.analysis.indicator.Indicator;
 import org.apache.skywalking.oap.server.core.storage.*;
+import org.apache.skywalking.oap.server.core.storage.type.StorageDataType;
 import org.apache.skywalking.oap.server.library.client.elasticsearch.ElasticSearchClient;
 import org.elasticsearch.action.get.GetResponse;
 import org.elasticsearch.action.index.IndexRequest;
@@ -54,7 +55,12 @@ public class IndicatorEsDAO extends EsDAO implements IIndicatorDAO<IndexRequest,
 
         XContentBuilder builder = XContentFactory.jsonBuilder().startObject();
         for (String key : objectMap.keySet()) {
-            builder.field(key, objectMap.get(key));
+            Object value = objectMap.get(key);
+            if (value instanceof StorageDataType) {
+                builder.field(key, ((StorageDataType)value).toStorageData());
+            } else {
+                builder.field(key, value);
+            }
         }
         builder.endObject();
         return getClient().prepareInsert(modelName, indicator.id(), builder);
@@ -65,7 +71,12 @@ public class IndicatorEsDAO extends EsDAO implements IIndicatorDAO<IndexRequest,
 
         XContentBuilder builder = XContentFactory.jsonBuilder().startObject();
         for (String key : objectMap.keySet()) {
-            builder.field(key, objectMap.get(key));
+            Object value = objectMap.get(key);
+            if (value instanceof StorageDataType) {
+                builder.field(key, ((StorageDataType)value).toStorageData());
+            } else {
+                builder.field(key, value);
+            }
         }
         builder.endObject();
         return getClient().prepareUpdate(modelName, indicator.id(), builder);
diff --git a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/MetricQueryEsDAO.java b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/MetricQueryEsDAO.java
index 60eda38..310f3b7 100644
--- a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/MetricQueryEsDAO.java
+++ b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/MetricQueryEsDAO.java
@@ -20,7 +20,7 @@ package org.apache.skywalking.oap.server.storage.plugin.elasticsearch.query;
 
 import java.io.IOException;
 import java.util.*;
-import org.apache.skywalking.oap.server.core.analysis.indicator.Indicator;
+import org.apache.skywalking.oap.server.core.analysis.indicator.*;
 import org.apache.skywalking.oap.server.core.query.entity.*;
 import org.apache.skywalking.oap.server.core.query.sql.*;
 import org.apache.skywalking.oap.server.core.storage.TimePyramidTableNameBuilder;
@@ -107,7 +107,23 @@ public class MetricQueryEsDAO extends EsDAO implements IMetricQueryDAO {
 
         Thermodynamic thermodynamic = new Thermodynamic();
         for (MultiGetItemResponse itemResponse : response.getResponses()) {
+            int axisYStep = ((Number)itemResponse.getResponse().getSource().get(ThermodynamicIndicator.STEP)).intValue();
+            thermodynamic.setAxisYStep(axisYStep);
+            int numOfSteps = ((Number)itemResponse.getResponse().getSource().get(ThermodynamicIndicator.NUM_OF_STEPS)).intValue();
+
+            String value = (String)itemResponse.getResponse().getSource().get(ThermodynamicIndicator.DETAIL_GROUP);
+            IntKeyLongValueArray intKeyLongValues = new IntKeyLongValueArray();
+            intKeyLongValues.toObject(value);
+
             List<Long> axisYValues = new ArrayList<>();
+            for (int i = 0; i < numOfSteps; i++) {
+                axisYValues.add(0L);
+            }
+
+            for (IntKeyLongValue intKeyLongValue : intKeyLongValues) {
+                axisYValues.set(intKeyLongValue.getKey(), intKeyLongValue.getValue());
+            }
+
             thermodynamic.getNodes().add(axisYValues);
         }
         return thermodynamic;