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
- Run the non-labeled operand alone and confirm it returns data
- Ensure both metrics cover the same time range and step
- Remove the relabels if both metrics actually share identical labels — the labeled-with-labeled path tolerates partial label overlap better
- 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
- Check the unlabeled operand returns data before mixing labeled and unlabeled series
- Keep step/duration aligned across both metrics
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
- Series No Labeled with Labeled, no labeled result is empty.
- Single Labeled to Single Labeled, left labeled result is emp
- Single Labeled to Single Labeled, right labeled result has m
- Series No Labeled, left or right result is empty.
- Series No Labeled, left and right series value size not equa
AI-assisted analysis of apache/skywalking@102af09b4a (2026-08-14).
Data as JSON: /api/errors/43f1e7aaeba07b16.
Report an issue: GitHub.