apache/skywalking · error · IllegalExpressionException

Series Labeled with No Labeled, no labeled result is empty.

Error message

Series Labeled with No Labeled, no labeled result is empty.

What it means

Thrown by LROp.seriesLabeledWithNoLabeled when a labeled TIME_SERIES_VALUES is combined with a non-labeled series: the right (non-labeled) side's results list must not be empty, because its single series is used as the operand for every labeled group on the left.

Source

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

            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,
                                                               ExpressionResult seriesRight,
                                                               int opType, LROp calculate) throws IllegalExpressionException {
        if (seriesRight.getResults().isEmpty()) {
            throw new IllegalExpressionException("Series Labeled with No Labeled, no labeled result is empty.");
        }
        MQEValues mqeValuesR = seriesRight.getResults().get(0);
        for (MQEValues mqeValuesL : seriesLeft.getResults()) {
            if (mqeValuesL.getValues().size() != mqeValuesR.getValues().size()) {
                throw new IllegalExpressionException("Series Labeled with No 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);
                mqeValuesL.getValues().get(i).setDoubleValue(newValue);
            }
        }

View on GitHub (pinned to 102af09b4a)

Solutions

  1. Run the non-labeled operand alone and confirm it returns data
  2. Ensure both metrics cover the same time range and step
  3. Remove the relabels if both metrics actually share identical labels — the labeled-with-labeled path tolerates partial label overlap better
  4. Use viewAsSeq to fall through to whichever series has data when gaps are expected

Example fix

// before
query: relabels(a, tag:(k,v)) + b   // b empty in range
// after: query a window where b has data, or
query: relabels(a, tag:(k,v)) + sum_per_minute(b)
Defensive patterns

Strategy: validation

Validate before calling

boolean ok = !seriesRight.getResults().isEmpty(); // the non-labeled side

Try / catch

catch (IllegalExpressionException e) { surfaceQueryError(e); }

Prevention

When it happens

Trigger: MQE expression 'relabels(seriesLabeled, ...) + seriesPlain' (or two series metrics, one carrying labels) where the non-labeled right operand returns zero results.

Common situations: The unlabeled base metric has no data in the time range while the labeled one does (or vice versa); relabels applied to one side making the label status asymmetric; metric ingestion stopped for one metric after an agent/OAP upgrade.

Related errors


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