apache/skywalking · error · IllegalExpressionException
Single Labeled to Single Labeled, right labeled result has m
Error message
Single Labeled to Single Labeled, right labeled result has more than one value.
What it means
In LROp.single2SingleLabeled (both operands labeled SINGLE_VALUE), the right operand's label groups are indexed into a map keyed by the HashSet of labels. When a left label group finds a matching right group, that right group must contain exactly one MQEValue; otherwise this exception is thrown because the pairing is ambiguous.
Source
Thrown at oap-server/mqe-rt/src/main/java/org/apache/skywalking/mqe/rt/operation/LROp.java:142
private static ExpressionResult single2SingleLabeled(ExpressionResult singleLeft,
ExpressionResult singleRight,
int opType, LROp calculate) throws IllegalExpressionException {
Map<Set<KeyValue>, List<MQEValue>> labelMapR = new HashMap<>();
singleRight.getResults().forEach(mqeValuesR -> {
labelMapR.put(new HashSet<>(mqeValuesR.getMetric().getLabels()), mqeValuesR.getValues());
});
for (MQEValues mqeValuesL : singleLeft.getResults()) {
if (mqeValuesL.getValues().size() != 1) {
throw new IllegalExpressionException("Single Labeled to Single Labeled, left labeled result is empty or has more than one value.");
}
//reserve left metric info
MQEValue valueL = mqeValuesL.getValues().get(0);
List<MQEValue> mqeValuesR = labelMapR.get(new HashSet<>(mqeValuesL.getMetric().getLabels()));
if (mqeValuesR == null) {
valueL.setEmptyValue(true);
} else {
if (mqeValuesR.size() != 1) {
throw new IllegalExpressionException("Single Labeled to Single Labeled, right labeled result has more than one value.");
}
MQEValue valueR = mqeValuesR.get(0);
if (valueL.isEmptyValue() || valueR.isEmptyValue()) {
valueL.setEmptyValue(true);
continue;
}
double value = calculate.apply(valueL.getDoubleValue(), valueR.getDoubleValue(), opType);
valueL.setDoubleValue(value);
}
}
return singleLeft;
}
//series or list or labeled single value with scalar
private static ExpressionResult many2OneBinaryOp(ExpressionResult manyResult,
ExpressionResult singleResult,
int opType, LROp calculate) throws IllegalExpressionException {View on GitHub (pinned to 102af09b4a)
Solutions
- Query the right operand alone and check that every label group matching a left label has exactly one value
- Tighten the relabels rules on the right side so each label combination maps to a single value
- Aggregate the right operand (sum/avg/latest) before applying labels
- Drop extra labels on the right side so groups do not fold multiple values together
Example fix
// before query: relabels(sum(a), tag:(k,v)) + relabels(b, tag:(k,v)) // b has 2 values for (k,v) // after query: relabels(sum(a), tag:(k,v)) + relabels(sum(b), tag:(k,v))
Defensive patterns
Strategy: validation
Validate before calling
Map<Set<KeyValue>, Integer> sizes = right.getResults().stream()
.collect(toMap(g -> new HashSet<>(g.getMetric().getLabels()), g -> g.getValues().size()));
boolean ok = sizes.values().stream().allMatch(s -> s == 1); Try / catch
catch (IllegalExpressionException e) { surfaceQueryError(e); } Prevention
- Ensure each right-side label combination resolves to a single value
- Sum/aggregate the right operand before labeling it
When it happens
Trigger: Both sides of a binary op are labeled scalars and share at least one label combination whose RIGHT-side group contains 2+ values. Non-matching label groups do NOT throw — they set emptyValue on the left — so the error only fires on matched labels with multi-valued right groups.
Common situations: relabels collapsing multiple right-side series into one label group that then matches a left label; a labeled right metric whose OAL/MAL definition emits several values per label set after a config change; mixing a labeled scalar with a metric that still carries extra labels that were meant to be dropped.
Related errors
- Single Labeled to Single Labeled, left labeled result is emp
- Single to Single, left result is empty or has more than one
- Single to Single, right result is empty or has more than one
- Many to One, single result is empty or has more than one val
- One to Many, single result is empty or has more than one val
AI-assisted analysis of apache/skywalking@102af09b4a (2026-08-14).
Data as JSON: /api/errors/723c4a0a7e0fc248.
Report an issue: GitHub.