apache/skywalking · error · IllegalExpressionException

Series No Labeled with Labeled, left and right series value

Error message

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

What it means

In LROp.seriesNoLabeledWithLabeled, every labeled group on the RIGHT must have the same value count as the single left series — values are paired by index within each group. Any right label group whose length differs from the left series throws this exception.

Source

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

                }
                double newValue = calculate.apply(valueL.getDoubleValue(), valueR.getDoubleValue(), opType);
                mqeValuesL.getValues().get(i).setDoubleValue(newValue);
            }
        }

        return seriesLeft;
    }

    private static ExpressionResult seriesNoLabeledWithLabeled(ExpressionResult seriesLeft,
                                                               ExpressionResult seriesRight,
                                                               int opType, LROp calculate) throws IllegalExpressionException {
        if (seriesLeft.getResults().isEmpty()) {
            throw new IllegalExpressionException("Series No Labeled with Labeled, no labeled result is empty.");
        }
        MQEValues mqeValuesL = seriesLeft.getResults().get(0);
        for (MQEValues mqeValuesR : seriesRight.getResults()) {
            if (mqeValuesL.getValues().size() != mqeValuesR.getValues().size()) {
                throw new IllegalExpressionException("Series No Labeled with Labeled, left and right series value size not equal.");
            }
            for (int i = 0; i < mqeValuesL.getValues().size(); i++) {
                //reserve left metric info
                MQEValue valueL = mqeValuesL.getValues().get(i);
                MQEValue valueR = mqeValuesR.getValues().get(i);
                if (valueL.isEmptyValue() || valueR.isEmptyValue()) {
                    valueL.setEmptyValue(true);
                    continue;
                }
                double newValue = calculate.apply(valueL.getDoubleValue(), valueR.getDoubleValue(), opType);
                mqeValuesR.getValues().get(i).setDoubleValue(newValue);
            }
        }

        return seriesRight;
    }

    private static ExpressionResult seriesLabeledWithLabeled(ExpressionResult seriesLeft,

View on GitHub (pinned to 102af09b4a)

Solutions

  1. Query the labeled operand alone and compare each label group's length with the plain series
  2. Align step/duration; use identical down-sampling on both metrics
  3. Restrict the relabels to label values whose series are dense
  4. Align on timestamps client-side if server-side index pairing cannot be guaranteed

Example fix

// before
query: b - relabels(a, tag:(k,v_sparse))  // v_sparse group shorter than b
// after
query: b - relabels(a, tag:(k,v_dense))
Defensive patterns

Strategy: validation

Validate before calling

int leftSize = seriesLeft.getResults().get(0).getValues().size();
boolean ok = seriesRight.getResults().stream()
    .allMatch(g -> g.getValues().size() == leftSize);

Try / catch

catch (IllegalExpressionException e) { /* iterate right label groups to find length mismatch */ }

Prevention

When it happens

Trigger: 'plainSeries op labeledSeries' where at least one right label group's point count differs from the left series' count — sparse label groups, different down-sampling, or missing buckets in specific label combinations.

Common situations: Comparing a base metric against per-label metrics where some labels report intermittently; label cardinality added after a relabels change pulling in a sparse label; step mismatch between the labeled metric's original query and the plain metric.

Related errors


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