SigNoz/signoz · error
unsupported operator %s
Error message
unsupported operator %s
What it means
BuildTracesFilterQuery (v4 traces builder) received a filter operator absent from tracesOperatorMappingV3, so it cannot map the operator to ClickHouse SQL and aborts with the operator name.
Source
Thrown at pkg/query-service/app/traces/v4/query_builder.go:158
case v3.FilterOperatorExists, v3.FilterOperatorNotExists:
if item.Key.IsColumn {
subQuery, err := existsSubQueryForFixedColumn(item.Key, item.Operator)
if err != nil {
return "", err
}
conditions = append(conditions, subQuery)
} else {
cType := getClickHouseTracesColumnType(item.Key.Type)
cDataType := getClickHouseTracesColumnDataType(item.Key.DataType)
col := fmt.Sprintf("%s_%s", cType, cDataType)
conditions = append(conditions, fmt.Sprintf(operator, col, item.Key.Key))
}
default:
conditions = append(conditions, fmt.Sprintf("%s %s %s", columnName, operator, fmtVal))
}
} else {
return "", fmt.Errorf("unsupported operator %s", item.Operator)
}
}
}
queryString := strings.Join(conditions, " AND ")
return queryString, nil
}
func handleEmptyValuesInGroupBy(groupBy []v3.AttributeKey) (string, error) {
// TODO(nitya): in future when we support user based mat column handle them
// skipping now as we don't support creating them
filterItems := []v3.FilterItem{}
if len(groupBy) != 0 {
for _, item := range groupBy {
if !item.IsColumn {
filterItems = append(filterItems, v3.FilterItem{
Key: item,
Operator: v3.FilterOperatorExists,View on GitHub (pinned to 5069bf80b0)
Solutions
- Use v3.FilterOperator constants present in tracesOperatorMappingV3
- Normalize (trim, lowercase) operator strings before sending
- Validate operators client-side against the supported list
Example fix
// before
{"operator":"contains","key":{"key":"service.name"}} // if unsupported
// after
{"operator":"like","key":{"key":"service.name"}} Defensive patterns
Strategy: validation
Validate before calling
if _, ok := tracesOperatorMappingV3[item.Operator]; !ok {
return fmt.Errorf("operator %s not supported on traces", item.Operator)
} Type guard
func isTraceOp(op v3.FilterOperator) bool {
_, ok := tracesOperatorMappingV3[op]
return ok
} Prevention
- Never share filter JSON across data sources blindly
- Keep operator whitelist in the client in sync with the server
When it happens
Trigger: Passing an unknown/unsupported operator string (typos, empty operator, logs-only operators) in the FilterSet of any v4 traces endpoint: ValidateTraces, funnel/step analytics, slow or errored traces.
Common situations: Reusing filter JSON from logs queries on trace endpoints; clients built against older operator constant names.
Related errors
- unsupported operator %s
- unsupported operation, exists and not exists can only be app
- invalid scope item type: %s
- multiple orderBy criteria are not supported for trace querie
- select columns cannot be empty for panelType %s
AI-assisted analysis of SigNoz/signoz@5069bf80b0 (2026-08-28).
Data as JSON: /api/errors/4f50020bb3cfb139.
Report an issue: GitHub.