in oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/expr/rt/AlarmMQEVisitor.java [88:156]
public ExpressionResult visitMetric(MQEParser.MetricContext ctx) {
ExpressionResult result = new ExpressionResult();
String metricName = ctx.metricName().getText();
String snapshotMetricName = ctx.getText();
Optional<ValueColumnMetadata.ValueColumn> valueColumn = ValueColumnMetadata.INSTANCE.readValueColumnDefinition(
metricName);
if (valueColumn.isEmpty()) {
result.setType(ExpressionResultType.UNKNOWN);
result.setError("Metric: [" + metricName + "] does not exist.");
return result;
}
Column.ValueDataType dataType = valueColumn.get().getDataType();
//if no data, build empty value MQEValuesList for calculation
List<MQEValues> mqeValuesList;
if (dataType == Column.ValueDataType.COMMON_VALUE) {
if (ctx.parent instanceof MQEParser.BaselineOPContext) {
MQEParser.BaselineOPContext parent = (MQEParser.BaselineOPContext) ctx.parent;
mqeValuesList = super.queryBaseline(
entity.getName(), metricName, windowTimes, parent.baseline_type()
.getStart()
.getType());
snapshotMetricName = parent.getText();
} else {
Map<String, Double> timeValues = commonValuesMap.get(metricName);
if (CollectionUtils.isEmpty(timeValues)) {
mqeValuesList = buildEmptyMQEValuesList();
} else {
mqeValuesList = buildMqeValuesList(timeValues);
}
}
} else if (dataType == Column.ValueDataType.LABELED_VALUE) {
List<KeyValue> queryLabels = buildLabels(ctx.labelList());
if (ctx.parent instanceof MQEParser.BaselineOPContext) {
MQEParser.BaselineOPContext parent = (MQEParser.BaselineOPContext) ctx.parent;
mqeValuesList = super.queryLabeledBaseline(
entity.getName(), metricName, queryLabels, windowTimes, parent.baseline_type()
.getStart()
.getType());
snapshotMetricName = parent.getText();
} else {
Map<String, DataTable> timeValues = labeledValuesMap.get(metricName);
if (CollectionUtils.isEmpty(timeValues)) {
mqeValuesList = buildEmptyMQEValuesList();
} else {
mqeValuesList = buildLabledMqeValuesList(timeValues, queryLabels, windowTimes);
}
}
result.setLabeledResult(true);
} else {
result.setType(ExpressionResultType.UNKNOWN);
result.setError("Unsupported value type: " + dataType);
return result;
}
if (!(ctx.parent instanceof MQEParser.TrendOPContext)) {
//Trim the redundant data
result.getResults().forEach(resultValues -> {
List<MQEValue> mqeValues = resultValues.getValues();
if (maxTrendRange > 0 && mqeValues.size() > maxTrendRange) {
resultValues.setValues(mqeValues.subList(maxTrendRange, mqeValues.size()));
}
});
}
result.setResults(mqeValuesList);
result.setType(ExpressionResultType.TIME_SERIES_VALUES);
this.mqeMetricsSnapshot.addProperty(snapshotMetricName, GSON.toJson(mqeValuesList));
return result;
}