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 4324835fa4acf58bf90d0ce72f73afd32a9aeaa1..6354236d07f3421e30137bf76e4ba1dc6c648b5f 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 113fe877a6576f81d5f4cc44023f7ce9f3e33aeb..d102d85152b4f0693a0a90315b1500e8aab72845 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 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 a69f7ef96c46b68221072adff5f4612ef059171a..69ba7bae599cddd0a46315e06512f7411039bbe0 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 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 1e9c217090b4e74c25cfd6bead0d750ce6797a73..572581c35149a967cb6232f815e6ea4158df9108 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 durationPoints = DurationUtils.INSTANCE.getDurationPoints(step, startTB, endTB); List 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 5cd65d3fa2de31b1a57b4b8e5ace6153ec5c0aee..6748f13d9adcdd82376da95f014a71ddca827dcf 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> nodes = new ArrayList<>(); private int axisYStep; -} + + public void setNodeValue(int columnNum, int rowNum, Long value) { + List 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 ff92fa364e4356b8428cb9c1373226c6e315f650..c9dcf266489e03b50c9e5a0acee2d2e99d99d361 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> 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 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 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 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 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; } }