From 5808627227d68c93a932bd2bc76ecae2c6883e6d Mon Sep 17 00:00:00 2001 From: Wan Kai Date: Mon, 22 Apr 2024 12:25:12 +0800 Subject: [PATCH] * MQE query: make metadata not return `null`. (#12142) * MQE labeled metrics Binary Operation: return empty value if the labels not match rather than report error. --- docs/en/api/metrics-query-expression.md | 3 +- docs/en/changes/changes.md | 2 + .../skywalking/mqe/rt/MQEVisitorBase.java | 10 +--- .../mqe/rt/operation/AggregateLabelsOp.java | 9 +--- .../skywalking/mqe/rt/operation/LROp.java | 51 +++++++------------ .../mqe/rt/operation/LogicalFunctionOp.java | 2 - .../skywalking/mqe/rt/type/MQEValues.java | 2 +- .../skywalking/mqe/rt/type/Metadata.java | 5 ++ .../expr/rt/AlarmMQEVerifyVisitor.java | 29 +---------- .../provider/expr/rt/AlarmMQEVisitor.java | 34 ++----------- .../oap/query/graphql/mqe/rt/MQEVisitor.java | 16 ++---- .../src/main/resources/query-protocol | 2 +- 12 files changed, 43 insertions(+), 122 deletions(-) diff --git a/docs/en/api/metrics-query-expression.md b/docs/en/api/metrics-query-expression.md index dfba7c2e41..c1641e01e7 100644 --- a/docs/en/api/metrics-query-expression.md +++ b/docs/en/api/metrics-query-expression.md @@ -82,7 +82,8 @@ For the result type of the expression, please refer to the following table. ### Binary Operation Rules The following table lists if the different result types of the input expressions could do this operation and the result type after the operation. The expression could be on the left or right side of the operator. -**Note**: If the expressions on both sides of the operator are the `TIME_SERIES_VALUES with labels`, they should have the same labels for calculation. +**Note**: If the expressions result on both sides of the operator are `with labels`, they should have the same labels for calculation. +If the labels match, will reserve left expression result labels and the calculated value. Otherwise, will return empty value. | Expression | Expression | Yes/No | ExpressionResultType | |-------------------------|---------------------------|--------|--------------------------| diff --git a/docs/en/changes/changes.md b/docs/en/changes/changes.md index 6b0a0a70d1..03aa9ab5bc 100644 --- a/docs/en/changes/changes.md +++ b/docs/en/changes/changes.md @@ -111,6 +111,8 @@ * Add Service Hierarchy auto matching layer relationships (upper -> lower) as following: - ACTIVEMQ -> K8S_SERVICE * Calculate Nginx service HTTP Latency by MQE. +* MQE query: make metadata not return `null`. +* MQE labeled metrics Binary Operation: return empty value if the labels not match rather than report error. #### UI diff --git a/oap-server/mqe-rt/src/main/java/org/apache/skywalking/mqe/rt/MQEVisitorBase.java b/oap-server/mqe-rt/src/main/java/org/apache/skywalking/mqe/rt/MQEVisitorBase.java index a07bd94993..23b2d677d6 100644 --- a/oap-server/mqe-rt/src/main/java/org/apache/skywalking/mqe/rt/MQEVisitorBase.java +++ b/oap-server/mqe-rt/src/main/java/org/apache/skywalking/mqe/rt/MQEVisitorBase.java @@ -149,6 +149,7 @@ public abstract class MQEVisitorBase extends MQEParserBaseVisitor label.getKey().equals(labelNameContext.getText()))) { labelNames.add(labelNameContext.getText()); - } else { - expResult.setError( - "The label [" + labelNameContext.getText() + "] does not exist in the result."); - return expResult; } } } @@ -221,11 +218,6 @@ public abstract class MQEVisitorBase extends MQEParserBaseVisitor targetLabels = parseLabelValue(targetLabel, Const.COMMA); List replaceLabels = parseLabelValue(replaceLabel, Const.COMMA); diff --git a/oap-server/mqe-rt/src/main/java/org/apache/skywalking/mqe/rt/operation/AggregateLabelsOp.java b/oap-server/mqe-rt/src/main/java/org/apache/skywalking/mqe/rt/operation/AggregateLabelsOp.java index fbcf3e4e61..e9b8144142 100644 --- a/oap-server/mqe-rt/src/main/java/org/apache/skywalking/mqe/rt/operation/AggregateLabelsOp.java +++ b/oap-server/mqe-rt/src/main/java/org/apache/skywalking/mqe/rt/operation/AggregateLabelsOp.java @@ -31,7 +31,6 @@ import org.apache.skywalking.mqe.rt.operation.aggregatelabels.AvgAggregateLabels import org.apache.skywalking.mqe.rt.operation.aggregatelabels.MaxAggregateLabelsFunc; import org.apache.skywalking.mqe.rt.operation.aggregatelabels.MinAggregateLabelsFunc; import org.apache.skywalking.mqe.rt.operation.aggregatelabels.SumAggregateLabelsFunc; -import org.apache.skywalking.mqe.rt.type.Metadata; import org.apache.skywalking.oap.server.core.query.type.KeyValue; import org.apache.skywalking.oap.server.library.util.CollectionUtils; @@ -98,9 +97,7 @@ public class AggregateLabelsOp { } } MQEValues mqeValues = new MQEValues(); - Metadata metadata = new Metadata(); - metadata.setLabels(labels); - mqeValues.setMetric(metadata); + mqeValues.getMetric().setLabels(labels); mqeValues.setValues(combineTo); expResult.getResults().add(mqeValues); }); @@ -108,10 +105,8 @@ public class AggregateLabelsOp { } private static List getLabels(final List labelNames, final MQEValues mqeValues) { - List a = - labelNames.stream().map(labelName -> mqeValues.getMetric().getLabels().stream().filter(label -> labelName.equals(label.getKey())) + return labelNames.stream().map(labelName -> mqeValues.getMetric().getLabels().stream().filter(label -> labelName.equals(label.getKey())) .findAny().orElseGet(() -> new KeyValue(labelName, ""))).collect(toList()); - return a; } } diff --git a/oap-server/mqe-rt/src/main/java/org/apache/skywalking/mqe/rt/operation/LROp.java b/oap-server/mqe-rt/src/main/java/org/apache/skywalking/mqe/rt/operation/LROp.java index c83a89504a..c86ae61893 100644 --- a/oap-server/mqe-rt/src/main/java/org/apache/skywalking/mqe/rt/operation/LROp.java +++ b/oap-server/mqe-rt/src/main/java/org/apache/skywalking/mqe/rt/operation/LROp.java @@ -107,7 +107,6 @@ public interface LROp { } else { double value = calculate.apply(left.getDoubleValue(), right.getDoubleValue(), opType); mqeValue.setDoubleValue(value); - mqeValue.setEmptyValue(false); } return result; } @@ -115,31 +114,24 @@ public interface LROp { private static ExpressionResult single2SingleLabeled(ExpressionResult singleLeft, ExpressionResult singleRight, int opType, LROp calculate) throws IllegalExpressionException { - Map> labelMapR = new HashMap<>(); - if (singleLeft.getResults().size() != singleRight.getResults().size()) { - throw new IllegalExpressionException( - "Operation between labeled metrics should have the same label."); - } + Map, List> labelMapR = new HashMap<>(); singleRight.getResults().forEach(mqeValuesR -> { - // For now, we only have a single anonymous label named `_` - labelMapR.put(mqeValuesR.getMetric().getLabels().get(0), mqeValuesR.getValues()); + labelMapR.put(new HashSet<>(mqeValuesR.getMetric().getLabels()), mqeValuesR.getValues()); }); for (MQEValues mqeValuesL : singleLeft.getResults()) { //reserve left metric info MQEValue valueL = mqeValuesL.getValues().get(0); - List mqeValuesR = labelMapR.get(mqeValuesL.getMetric().getLabels().get(0)); + List mqeValuesR = labelMapR.get(new HashSet<>(mqeValuesL.getMetric().getLabels())); if (mqeValuesR == null) { - throw new IllegalExpressionException( - "Operation between labeled metrics should have the same label."); - } - MQEValue valueR = mqeValuesR.get(0); - if (valueL.isEmptyValue() || valueR.isEmptyValue()) { valueL.setEmptyValue(true); - valueL.setDoubleValue(0); } else { + MQEValue valueR = mqeValuesR.get(0); + if (valueL.isEmptyValue() || valueR.isEmptyValue()) { + valueL.setEmptyValue(true); + continue; + } double value = calculate.apply(valueL.getDoubleValue(), valueR.getDoubleValue(), opType); valueL.setDoubleValue(value); - valueL.setEmptyValue(false); } } @@ -193,14 +185,12 @@ public interface LROp { int opType, LROp calculate) { MQEValues mqeValuesL = seriesLeft.getResults().get(0); MQEValues mqeValuesR = seriesRight.getResults().get(0); - mqeValuesL.setMetric(null); for (int i = 0; i < mqeValuesL.getValues().size(); i++) { //clean metric info MQEValue valueL = mqeValuesL.getValues().get(i); MQEValue valueR = mqeValuesR.getValues().get(i); if (valueL.isEmptyValue() || valueR.isEmptyValue()) { valueL.setEmptyValue(true); - valueL.setDoubleValue(0); continue; } //time should be mapped @@ -222,7 +212,6 @@ public interface LROp { MQEValue valueR = mqeValuesR.getValues().get(i); if (valueL.isEmptyValue() || valueR.isEmptyValue()) { valueL.setEmptyValue(true); - valueL.setDoubleValue(0); continue; } double newValue = calculate.apply(valueL.getDoubleValue(), valueR.getDoubleValue(), opType); @@ -244,7 +233,6 @@ public interface LROp { MQEValue valueR = mqeValuesR.getValues().get(i); if (valueL.isEmptyValue() || valueR.isEmptyValue()) { valueL.setEmptyValue(true); - valueL.setDoubleValue(0); continue; } double newValue = calculate.apply(valueL.getDoubleValue(), valueR.getDoubleValue(), opType); @@ -259,30 +247,25 @@ public interface LROp { ExpressionResult seriesRight, int opType, LROp calculate) throws IllegalExpressionException { Map, List> labelMapR = new HashMap<>(); - if (seriesLeft.getResults().size() != seriesRight.getResults().size()) { - throw new IllegalExpressionException( - "Operation between labeled metrics should have the same label."); - } seriesRight.getResults().forEach(mqeValuesR -> { labelMapR.put(new HashSet<>(mqeValuesR.getMetric().getLabels()), mqeValuesR.getValues()); }); for (MQEValues mqeValuesL : seriesLeft.getResults()) { for (int i = 0; i < mqeValuesL.getValues().size(); i++) { - //reserve left metric info + //reserve left metric info, if right metric not exist, set empty value MQEValue valueL = mqeValuesL.getValues().get(i); List mqeValuesR = labelMapR.get(new HashSet<>(mqeValuesL.getMetric().getLabels())); if (mqeValuesR == null) { - throw new IllegalExpressionException( - "Operation between labeled metrics should have the same label."); - } - MQEValue valueR = mqeValuesR.get(i); - if (valueL.isEmptyValue() || valueR.isEmptyValue()) { valueL.setEmptyValue(true); - valueL.setDoubleValue(0); - continue; + } else { + MQEValue valueR = mqeValuesR.get(i); + if (valueL.isEmptyValue() || valueR.isEmptyValue()) { + valueL.setEmptyValue(true); + continue; + } + double newValue = calculate.apply(valueL.getDoubleValue(), valueR.getDoubleValue(), opType); + mqeValuesL.getValues().get(i).setDoubleValue(newValue); } - double newValue = calculate.apply(valueL.getDoubleValue(), valueR.getDoubleValue(), opType); - mqeValuesL.getValues().get(i).setDoubleValue(newValue); } } diff --git a/oap-server/mqe-rt/src/main/java/org/apache/skywalking/mqe/rt/operation/LogicalFunctionOp.java b/oap-server/mqe-rt/src/main/java/org/apache/skywalking/mqe/rt/operation/LogicalFunctionOp.java index 4d6531c38f..912e6cf925 100644 --- a/oap-server/mqe-rt/src/main/java/org/apache/skywalking/mqe/rt/operation/LogicalFunctionOp.java +++ b/oap-server/mqe-rt/src/main/java/org/apache/skywalking/mqe/rt/operation/LogicalFunctionOp.java @@ -25,7 +25,6 @@ import org.apache.skywalking.mqe.rt.type.ExpressionResult; import org.apache.skywalking.mqe.rt.type.ExpressionResultType; import org.apache.skywalking.mqe.rt.type.MQEValue; import org.apache.skywalking.mqe.rt.type.MQEValues; -import org.apache.skywalking.mqe.rt.type.Metadata; import org.apache.skywalking.oap.server.library.util.CollectionUtils; import java.util.Objects; @@ -85,7 +84,6 @@ public class LogicalFunctionOp { MQEValue mqeValue = new MQEValue(); MQEValues mqeValues = new MQEValues(); - mqeValues.setMetric(new Metadata()); mqeValues.getValues().add(mqeValue); result.getResults().add(mqeValues); mqeValue.setDoubleValue(present ? 1 : 0); diff --git a/oap-server/mqe-rt/src/main/java/org/apache/skywalking/mqe/rt/type/MQEValues.java b/oap-server/mqe-rt/src/main/java/org/apache/skywalking/mqe/rt/type/MQEValues.java index 64c8c6f1fe..b98ed487f7 100644 --- a/oap-server/mqe-rt/src/main/java/org/apache/skywalking/mqe/rt/type/MQEValues.java +++ b/oap-server/mqe-rt/src/main/java/org/apache/skywalking/mqe/rt/type/MQEValues.java @@ -25,7 +25,7 @@ import lombok.Data; @Data public class MQEValues { - private Metadata metric; + private Metadata metric = new Metadata(); private List values = new ArrayList<>(); } diff --git a/oap-server/mqe-rt/src/main/java/org/apache/skywalking/mqe/rt/type/Metadata.java b/oap-server/mqe-rt/src/main/java/org/apache/skywalking/mqe/rt/type/Metadata.java index b23150be91..49592646cc 100644 --- a/oap-server/mqe-rt/src/main/java/org/apache/skywalking/mqe/rt/type/Metadata.java +++ b/oap-server/mqe-rt/src/main/java/org/apache/skywalking/mqe/rt/type/Metadata.java @@ -20,6 +20,7 @@ package org.apache.skywalking.mqe.rt.type; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; import lombok.Data; import org.apache.skywalking.oap.server.core.query.type.KeyValue; @@ -27,4 +28,8 @@ import org.apache.skywalking.oap.server.core.query.type.KeyValue; @Data public class Metadata { private List labels = new ArrayList<>(); + + public void sortLabelsByKey(Comparator comparator) { + labels.sort(Comparator.comparing(KeyValue::getKey, comparator)); + } } diff --git a/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/expr/rt/AlarmMQEVerifyVisitor.java b/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/expr/rt/AlarmMQEVerifyVisitor.java index 7a200f38f1..6b73c2cd3d 100644 --- a/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/expr/rt/AlarmMQEVerifyVisitor.java +++ b/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/expr/rt/AlarmMQEVerifyVisitor.java @@ -18,9 +18,7 @@ package org.apache.skywalking.oap.server.core.alarm.provider.expr.rt; -import java.util.ArrayList; import java.util.HashSet; -import java.util.List; import java.util.Optional; import java.util.Set; import lombok.Getter; @@ -31,14 +29,9 @@ import org.apache.skywalking.mqe.rt.type.ExpressionResult; import org.apache.skywalking.mqe.rt.type.ExpressionResultType; import org.apache.skywalking.mqe.rt.type.MQEValue; import org.apache.skywalking.mqe.rt.type.MQEValues; -import org.apache.skywalking.mqe.rt.type.Metadata; import org.apache.skywalking.oap.server.core.query.enumeration.Step; -import org.apache.skywalking.oap.server.core.query.type.KeyValue; import org.apache.skywalking.oap.server.core.storage.annotation.Column; import org.apache.skywalking.oap.server.core.storage.annotation.ValueColumnMetadata; -import org.apache.skywalking.oap.server.library.util.CollectionUtils; - -import static org.apache.skywalking.oap.server.core.analysis.metrics.DataLabel.GENERAL_LABEL_NAME; /** * Used for verify the alarm expression and get the metrics name when read the alarm rules. @@ -78,29 +71,11 @@ public class AlarmMQEVerifyVisitor extends MQEVisitorBase { MQEValue mqeValue = new MQEValue(); mqeValue.setEmptyValue(true); mockMqeValues.getValues().add(mqeValue); + result.getResults().add(mockMqeValues); + result.setType(ExpressionResultType.TIME_SERIES_VALUES); if (dataType == Column.ValueDataType.COMMON_VALUE) { - result.getResults().add(mockMqeValues); - result.setType(ExpressionResultType.TIME_SERIES_VALUES); return result; } else if (dataType == Column.ValueDataType.LABELED_VALUE) { - List queryLabels = buildLabels(ctx.labelList()); - ArrayList mqeValuesList = new ArrayList<>(); - if (CollectionUtils.isEmpty(queryLabels)) { - KeyValue label = new KeyValue(GENERAL_LABEL_NAME, GENERAL_LABEL_NAME); - Metadata metadata = new Metadata(); - metadata.getLabels().add(label); - mockMqeValues.setMetric(metadata); - mqeValuesList.add(mockMqeValues); - } else { - for (KeyValue queryLabel : queryLabels) { - Metadata metadata = new Metadata(); - metadata.getLabels().add(queryLabel); - mockMqeValues.setMetric(metadata); - mqeValuesList.add(mockMqeValues); - } - } - result.setType(ExpressionResultType.TIME_SERIES_VALUES); - result.setResults(mqeValuesList); result.setLabeledResult(true); return result; } else { diff --git a/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/expr/rt/AlarmMQEVisitor.java b/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/expr/rt/AlarmMQEVisitor.java index 12150fca5c..0d27a6743f 100644 --- a/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/expr/rt/AlarmMQEVisitor.java +++ b/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/expr/rt/AlarmMQEVisitor.java @@ -19,6 +19,7 @@ package org.apache.skywalking.oap.server.core.alarm.provider.expr.rt; import java.util.ArrayList; +import java.util.Comparator; import java.util.HashMap; import java.util.LinkedList; import java.util.List; @@ -30,7 +31,6 @@ import org.apache.skywalking.mqe.rt.type.ExpressionResult; import org.apache.skywalking.mqe.rt.type.ExpressionResultType; import org.apache.skywalking.mqe.rt.type.MQEValue; import org.apache.skywalking.mqe.rt.type.MQEValues; -import org.apache.skywalking.mqe.rt.type.Metadata; import org.apache.skywalking.oap.server.core.analysis.metrics.DataLabel; import org.apache.skywalking.oap.server.core.analysis.metrics.DataTable; import org.apache.skywalking.oap.server.core.analysis.metrics.DoubleValueHolder; @@ -46,7 +46,6 @@ import org.apache.skywalking.oap.server.core.storage.annotation.ValueColumnMetad import org.apache.skywalking.oap.server.library.util.CollectionUtils; import org.joda.time.LocalDateTime; -import static org.apache.skywalking.oap.server.core.analysis.metrics.DataLabel.GENERAL_LABEL_NAME; import static org.apache.skywalking.oap.server.core.storage.query.IMetricsQueryDAO.Util.composeLabelConditions; @Slf4j @@ -99,7 +98,7 @@ public class AlarmMQEVisitor extends MQEVisitorBase { List queryLabels = buildLabels(ctx.labelList()); Map timeValues = labeledValuesMap.get(metricName); if (CollectionUtils.isEmpty(timeValues)) { - mqeValuesList = buildEmptyLabeledMQEValuesList(queryLabels); + mqeValuesList = buildEmptyMQEValuesList(); } else { mqeValuesList = buildLabledMqeValuesList(timeValues, queryLabels); } @@ -191,7 +190,6 @@ public class AlarmMQEVisitor extends MQEVisitorBase { List mqeValuesList = new ArrayList<>(); MQEValues mqeValues = new MQEValues(); for (String time : windowTimes) { - Metadata metadata = new Metadata(); Double metricValue = timeValues.get(time); MQEValue mqeValue = new MQEValue(); //use timeBucket as id here @@ -201,7 +199,6 @@ public class AlarmMQEVisitor extends MQEVisitorBase { } else { mqeValue.setEmptyValue(true); } - mqeValues.setMetric(metadata); mqeValues.getValues().add(mqeValue); } mqeValuesList.add(mqeValues); @@ -215,7 +212,6 @@ public class AlarmMQEVisitor extends MQEVisitorBase { for (String labelCondition : labelConditions) { MQEValues mqeValues = new MQEValues(); for (String time : windowTimes) { - Metadata metadata = new Metadata(); DataTable dataTable = timeValues.getOrDefault(time, new DataTable()); Long metricValue = dataTable.get(labelCondition); MQEValue mqeValue = new MQEValue(); @@ -229,11 +225,12 @@ public class AlarmMQEVisitor extends MQEVisitorBase { DataLabel dataLabel = new DataLabel(); dataLabel.put(labelCondition); for (Map.Entry label : dataLabel.entrySet()) { - metadata.getLabels().add(new KeyValue(label.getKey(), label.getValue())); + mqeValues.getMetric().getLabels().add(new KeyValue(label.getKey(), label.getValue())); } - mqeValues.setMetric(metadata); mqeValues.getValues().add(mqeValue); } + //Sort labels by key in natural order by default + mqeValues.getMetric().sortLabelsByKey(Comparator.naturalOrder()); mqeValuesList.add(mqeValues); } return mqeValuesList; @@ -256,25 +253,4 @@ public class AlarmMQEVisitor extends MQEVisitorBase { mqeValuesList.add(initMQEValues()); return mqeValuesList; } - - private ArrayList buildEmptyLabeledMQEValuesList(List queryLabels) { - ArrayList mqeValuesList = new ArrayList<>(); - if (CollectionUtils.isEmpty(queryLabels)) { - MQEValues mqeValues = initMQEValues(); - KeyValue label = new KeyValue(GENERAL_LABEL_NAME, GENERAL_LABEL_NAME); - Metadata metadata = new Metadata(); - metadata.getLabels().add(label); - mqeValues.setMetric(metadata); - mqeValuesList.add(mqeValues); - } else { - for (KeyValue label : queryLabels) { - MQEValues mqeValues = initMQEValues(); - Metadata metadata = new Metadata(); - metadata.getLabels().add(label); - mqeValues.setMetric(metadata); - mqeValuesList.add(mqeValues); - } - } - return mqeValuesList; - } } diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/mqe/rt/MQEVisitor.java b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/mqe/rt/MQEVisitor.java index 15bbaf40e1..5a83f17aed 100644 --- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/mqe/rt/MQEVisitor.java +++ b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/mqe/rt/MQEVisitor.java @@ -20,6 +20,7 @@ package org.apache.skywalking.oap.query.graphql.mqe.rt; import java.io.IOException; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.Optional; @@ -28,7 +29,6 @@ import org.apache.skywalking.mqe.rt.exception.IllegalExpressionException; import org.apache.skywalking.mqe.rt.grammar.MQEParser; import org.apache.skywalking.mqe.rt.type.MQEValue; import org.apache.skywalking.mqe.rt.type.MQEValues; -import org.apache.skywalking.mqe.rt.type.Metadata; import org.apache.skywalking.oap.server.core.CoreModule; import org.apache.skywalking.oap.server.core.analysis.metrics.DataLabel; import org.apache.skywalking.oap.server.core.query.AggregationQueryService; @@ -195,10 +195,8 @@ public class MQEVisitor extends MQEVisitorBase { mqeValue.setDoubleValue(Double.parseDouble(selectedRecord.getValue())); mqeValueList.add(mqeValue); }); - Metadata metadata = new Metadata(); MQEValues mqeValues = new MQEValues(); mqeValues.setValues(mqeValueList); - mqeValues.setMetric(metadata); result.getResults().add(mqeValues); result.setType(ExpressionResultType.SORTED_LIST); } @@ -220,10 +218,8 @@ public class MQEVisitor extends MQEVisitorBase { mqeValue.setTraceID(record.getRefId()); mqeValueList.add(mqeValue); }); - Metadata metadata = new Metadata(); MQEValues mqeValues = new MQEValues(); mqeValues.setValues(mqeValueList); - mqeValues.setMetric(metadata); result.getResults().add(mqeValues); result.setType(ExpressionResultType.RECORD_LIST); } @@ -250,10 +246,8 @@ public class MQEVisitor extends MQEVisitorBase { mqeValue.setDoubleValue(kvInt.getValue()); mqeValueList.add(mqeValue); } - Metadata metadata = new Metadata(); MQEValues mqeValues = new MQEValues(); mqeValues.setValues(mqeValueList); - mqeValues.setMetric(metadata); result.getResults().add(mqeValues); result.setType(ExpressionResultType.TIME_SERIES_VALUES); } @@ -288,15 +282,15 @@ public class MQEVisitor extends MQEVisitorBase { } } - Metadata metadata = new Metadata(); + MQEValues mqeValues = new MQEValues(); DataLabel dataLabel = new DataLabel(); dataLabel.put(metricsValues.getLabel()); for (Map.Entry label : dataLabel.entrySet()) { - metadata.getLabels().add(new KeyValue(label.getKey(), label.getValue())); + mqeValues.getMetric().getLabels().add(new KeyValue(label.getKey(), label.getValue())); } - MQEValues mqeValues = new MQEValues(); + //Sort labels by key in natural order by default + mqeValues.getMetric().sortLabelsByKey(Comparator.naturalOrder()); mqeValues.setValues(mqeValueList); - mqeValues.setMetric(metadata); result.getResults().add(mqeValues); }); result.setType(ExpressionResultType.TIME_SERIES_VALUES); diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/resources/query-protocol b/oap-server/server-query-plugin/query-graphql-plugin/src/main/resources/query-protocol index f0bdba688a..f74557b29d 160000 --- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/resources/query-protocol +++ b/oap-server/server-query-plugin/query-graphql-plugin/src/main/resources/query-protocol @@ -1 +1 @@ -Subproject commit f0bdba688afecff2167d018ecdaf509d2c8598f7 +Subproject commit f74557b29dc7bef2830786c4fe3e39e4a0919c98