You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by wu...@apache.org on 2018/09/28 04:21:40 UTC

[incubator-skywalking] branch master updated: Fix thermodynamic query error (#1716)

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 1bfc68c  Fix thermodynamic query error (#1716)
1bfc68c is described below

commit 1bfc68c8abf37692f00ac2ceab6a8b0defb43e91
Author: Gao Hongtao <ha...@gmail.com>
AuthorDate: Fri Sep 28 12:21:24 2018 +0800

    Fix thermodynamic query error (#1716)
    
    * Avoid query error by adding initial instance to AlarmTrend
    
    * Fix thermodynamic query
---
 .../apache/skywalking/oap/server/core/Const.java   |  1 +
 .../analysis/indicator/IntKeyLongValueArray.java   |  4 +-
 .../analysis/indicator/ThermodynamicIndicator.java |  2 +-
 .../oap/server/core/query/MetricQueryService.java  |  8 ++-
 .../server/core/query/entity/Thermodynamic.java    | 11 ++++-
 .../elasticsearch/query/MetricQueryEsDAO.java      | 57 +++++++++++++++++-----
 6 files changed, 65 insertions(+), 18 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 4324835..6354236 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
@@ -26,6 +26,7 @@ public class Const {
     public static final String ID_SPLIT = "_";
     public static final String KEY_VALUE_SPLIT = ",";
     public static final String ARRAY_SPLIT = "|";
+    public static final String ARRAY_PARSER_SPLIT = "\\|";
     public static final int USER_SERVICE_ID = 1;
     public static final int USER_INSTANCE_ID = 1;
     public static final int USER_ENDPOINT_ID = 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
index 113fe87..d102d85 100644
--- 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
@@ -49,11 +49,11 @@ public class IntKeyLongValueArray extends ArrayList<IntKeyLongValue> implements
     }
 
     @Override public void toObject(String data) {
-        String[] keyValues = data.split(Const.ARRAY_SPLIT);
+        String[] keyValues = data.split(Const.ARRAY_PARSER_SPLIT);
         for (int i = 0; i < keyValues.length; i++) {
             IntKeyLongValue value = new IntKeyLongValue();
             value.toObject(keyValues[i]);
-            this.set(i, value);
+            this.add(value);
         }
     }
 }
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 a69f7ef..69ba7ba 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
@@ -41,7 +41,7 @@ public abstract class ThermodynamicIndicator extends Indicator {
 
     @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 IntKeyLongValueArray detailGroup = new IntKeyLongValueArray(30);
+    @Getter @Setter @Column(columnName = DETAIL_GROUP, isValue = true) 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/MetricQueryService.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/MetricQueryService.java
index 1e9c217..572581c 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
@@ -77,7 +77,13 @@ public class MetricQueryService implements Service {
         final long endTB) throws IOException, ParseException {
         List<DurationPoint> durationPoints = DurationUtils.INSTANCE.getDurationPoints(step, startTB, endTB);
         List<String> ids = new ArrayList<>();
-        durationPoints.forEach(durationPoint -> ids.add(durationPoint.getPoint() + Const.ID_SPLIT + id));
+        durationPoints.forEach(durationPoint -> {
+            if (id == null) {
+                ids.add(durationPoint.getPoint() + "");
+            } else {
+                ids.add(durationPoint.getPoint() + Const.ID_SPLIT + id);
+            }
+        });
 
         return getMetricQueryDAO().getThermodynamic(indName, step, ids, ValueColumnIds.INSTANCE.getValueCName(indName));
     }
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 5cd65d3..6748f13 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
@@ -26,4 +26,13 @@ import lombok.*;
 public class Thermodynamic {
     private List<List<Long>> nodes = new ArrayList<>();
     private int axisYStep;
-}
+
+    public void setNodeValue(int columnNum, int rowNum, Long value) {
+        List<Long> element = new ArrayList<>(3);
+        element.add((long)columnNum);
+        element.add((long)rowNum);
+        element.add(value);
+        nodes.add(element);
+    }
+
+}
\ No newline at end of file
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 ff92fa3..c9dcf26 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
@@ -106,26 +106,57 @@ public class MetricQueryEsDAO extends EsDAO implements IMetricQueryDAO {
         MultiGetResponse response = getClient().multiGet(indexName, ids);
 
         Thermodynamic thermodynamic = new Thermodynamic();
+        List<List<Long>> thermodynamicValueMatrix = new ArrayList<>();
+
+        int numOfSteps = 0;
         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();
+            Map<String, Object> source = itemResponse.getResponse().getSource();
+            if (source == null) {
+                // add empty list to represent no data exist for this time bucket
+                thermodynamicValueMatrix.add(new ArrayList<>());
+            } else {
+                int axisYStep = ((Number)source.get(ThermodynamicIndicator.STEP)).intValue();
+                thermodynamic.setAxisYStep(axisYStep);
+                numOfSteps = ((Number)source.get(ThermodynamicIndicator.NUM_OF_STEPS)).intValue();
+
+                String value = (String)source.get(ThermodynamicIndicator.DETAIL_GROUP);
+                IntKeyLongValueArray intKeyLongValues = new IntKeyLongValueArray(5);
+                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());
+                }
+
+                thermodynamicValueMatrix.add(axisYValues);
+            }
+        }
 
-            String value = (String)itemResponse.getResponse().getSource().get(ThermodynamicIndicator.DETAIL_GROUP);
-            IntKeyLongValueArray intKeyLongValues = new IntKeyLongValueArray(5);
-            intKeyLongValues.toObject(value);
+        int defaultNumOfSteps = numOfSteps;
 
-            List<Long> axisYValues = new ArrayList<>();
-            for (int i = 0; i < numOfSteps; i++) {
-                axisYValues.add(0L);
+        thermodynamicValueMatrix.forEach(columnOfThermodynamic -> {
+                if (columnOfThermodynamic.size() == 0) {
+                    if (defaultNumOfSteps > 0) {
+                        for (int i = 0; i < defaultNumOfSteps; i++) {
+                            columnOfThermodynamic.add(0L);
+                        }
+                    }
+                }
             }
+        );
 
-            for (IntKeyLongValue intKeyLongValue : intKeyLongValues) {
-                axisYValues.set(intKeyLongValue.getKey(), intKeyLongValue.getValue());
+        for (int colNum = 0; colNum < thermodynamicValueMatrix.size(); colNum++) {
+            List<Long> column = thermodynamicValueMatrix.get(colNum);
+            for (int rowNum = 0; rowNum < column.size(); rowNum++) {
+                Long value = column.get(rowNum);
+                thermodynamic.setNodeValue(colNum, rowNum, value);
             }
-
-            thermodynamic.getNodes().add(axisYValues);
         }
+
         return thermodynamic;
     }
 }