apache/skywalking · error · IllegalArgumentException

Unsupported predicted value type: {}

Error message

Unsupported predicted value type: {}

What it means

IllegalArgumentException from MQEVisitorBase.getValueByType when a 'predict' (forecast) MQE query asks for a value type other than VALUE, UPPER or LOWER. PredictServiceMetrics.PredictSingleValue exposes a base value plus upper/lower confidence bounds; anything else (an unexpected token/type code reaching this private helper) is not representable and is rejected.

Source

Thrown at oap-server/mqe-rt/src/main/java/org/apache/skywalking/mqe/rt/MQEVisitorBase.java:617

                    }
                }
                timeValues.put(pointOfTime, dataTable);
            }
        }
        return buildLabledMqeValuesList(timeValues, queryLabels, pointOfTimes);
    }

    private long getValueByType(PredictServiceMetrics.PredictSingleValue predictSingleValue,
                                int valueType) {
        switch (valueType) {
            case MQEParser.VALUE:
                return predictSingleValue.getValue();
            case MQEParser.UPPER:
                return predictSingleValue.getUpperValue();
            case MQEParser.LOWER:
                return predictSingleValue.getLowerValue();
            default:
                throw new IllegalArgumentException("Unsupported predicted value type: " + valueType);
        }
    }

    protected List<MQEValues> buildLabledMqeValuesList(Map<String, DataTable> timeValues, List<KeyValue> queryLabels,
                                                       ArrayList<String> pointOfTimes) {
        List<MQEValues> mqeValuesList = new ArrayList<>();
        List<String> labelConditions = composeLabelConditions(queryLabels, timeValues.values());
        for (String labelCondition : labelConditions) {
            MQEValues mqeValues = new MQEValues();
            for (String pointOfTime : pointOfTimes) {
                DataTable dataTable = timeValues.getOrDefault(pointOfTime, new DataTable());
                Long metricValue = dataTable.get(labelCondition);
                MQEValue mqeValue = new MQEValue();
                //use timeBucket as id here
                mqeValue.setId(pointOfTime);
                if (metricValue != null) {
                    mqeValue.setDoubleValue(metricValue);
                } else {

View on GitHub (pinned to 102af09b4a)

Solutions

  1. Align versions: rebuild/redeploy so mqe-rt and server-core come from the same OAP release (no mixed jars in oap-libs)
  2. If you are extending the MQE grammar, add the new value type to this switch (VALUE/UPPER/LOWER pattern) and provide it in PredictSingleValue
  3. As a workaround, re-issue the predict query with the default value output (omit the bound selector) to stay on the VALUE branch
  4. Report upstream with the exact MQE expression if it reproduces on a clean single-version install
Defensive patterns

Strategy: try-catch

Try / catch

catch (IllegalArgumentException e) { /* indicate version skew; rebuild with consistent OAP modules and retry */ }

Prevention

When it happens

Trigger: A predict expression like 'predict(metric, pt10m, 0.8)' evaluated through a code path that requests a bound the visitor does not map — in practice triggered by internal type-code drift (e.g. a new grammar token reaching this switch) rather than ordinary user syntax, because the public predict grammar only exposes value/upper/lower.

Common situations: Almost always a version-mismatch bug surface: OAP server-core query types and mqe-rt visitor built from mismatched versions, or a custom fork adding a new value-type token without extending this switch. End users hitting it should suspect an incomplete upgrade.

Related errors


AI-assisted analysis of apache/skywalking@102af09b4a (2026-08-14). Data as JSON: /api/errors/e4f02cb63e909466. Report an issue: GitHub.