public ExpressionResult visitMetric()

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;
    }