apache/skywalking · error · IllegalExpressionException

Series No Labeled, left and right series value size not equa

Error message

Series No Labeled, left and right series value size not equal.

What it means

In LROp.seriesNoLabeled, after both non-labeled series are non-empty, the number of data points in the left series' first MQEValues must equal the right's. Values are paired purely by index (for loop over i), so unequal lengths make the pairing meaningless and the exception is thrown.

Source

Thrown at oap-server/mqe-rt/src/main/java/org/apache/skywalking/mqe/rt/operation/LROp.java:216

                        mqeValue.getDoubleValue(), opType
                    );
                    mqeValue.setDoubleValue(newValue);
                }
            }
        }
        return manyResult;
    }

    private static ExpressionResult seriesNoLabeled(ExpressionResult seriesLeft,
                                                    ExpressionResult seriesRight,
                                                    int opType, LROp calculate) throws IllegalExpressionException {
        if (seriesLeft.getResults().isEmpty() || seriesRight.getResults().isEmpty()) {
            throw new IllegalExpressionException("Series No Labeled, left or right result is empty.");
        }
        MQEValues mqeValuesL = seriesLeft.getResults().get(0);
        MQEValues mqeValuesR = seriesRight.getResults().get(0);
        if (mqeValuesL.getValues().size() != mqeValuesR.getValues().size()) {
            throw new IllegalExpressionException("Series No Labeled, left and right series value size not equal.");
        }
        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);
                continue;
            }
            //time should be mapped
            double newValue = calculate.apply(valueL.getDoubleValue(), valueR.getDoubleValue(), opType);
            mqeValuesL.getValues().get(i).setDoubleValue(newValue);
        }

        return seriesLeft;
    }

    private static ExpressionResult seriesLabeledWithNoLabeled(ExpressionResult seriesLeft,

View on GitHub (pinned to 102af09b4a)

Solutions

  1. Query both operands alone and compare results[0].values sizes to find which series is shorter/longer
  2. Use the same step and duration for both metrics in the expression
  3. Pick metrics with identical down-sampling and reporting cadence, or fill gaps via aggregation levels that guarantee aligned buckets
  4. If alignment cannot be guaranteed, compute the operation client-side after fetching both series, aligning on timestamp

Example fix

// before
query: metric_a + metric_b  // a: step=MINUTE points=60, b: step=HOUR points=1
// after (same step on both sides)
query: metric_a + metric_b  // with query step=MINUTE and both metrics minute-downsampled
Defensive patterns

Strategy: validation

Validate before calling

boolean sameSize = l.getResults().get(0).getValues().size()
                   == r.getResults().get(0).getValues().size();

Try / catch

catch (IllegalExpressionException e) { /* compare point counts of each operand to locate the mismatch */ }

Prevention

When it happens

Trigger: 'seriesA op seriesB' where both return data but with different point counts — typically because the two metrics were queried with different step/duration, one series has missing buckets, or the underlying metrics have different retention/down-sampling.

Common situations: Comparing metrics of different down-sampling (day vs hour) or different step in one expression; one metric missing time buckets because it was reported intermittently; OAP metrics TTL differences between the two metrics; mixed B08 vs B10 metrics where one has gaps.

Related errors


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