SigNoz/signoz · error

unsupported operator %s

Error message

unsupported operator %s

What it means

buildTracesFilterQuery (v3 traces builder) received a filter operator that has no mapping in tracesOperatorMappingV3, so no ClickHouse SQL operator can be produced for it.

Source

Thrown at pkg/query-service/app/traces/v3/query_builder.go:190

				case v3.FilterOperatorRegex, v3.FilterOperatorNotRegex:
					conditions = append(conditions, fmt.Sprintf(operator, columnName, fmtVal))
				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 {
						columnType, columnDataType := getClickhouseTracesColumnDataTypeAndType(item.Key)
						conditions = append(conditions, fmt.Sprintf(operator, columnDataType, columnType, 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 ")

	if len(queryString) > 0 {
		queryString = " AND " + queryString
	}
	return queryString, nil
}

func ExistsSubQueryForFixedColumn(key v3.AttributeKey, op v3.FilterOperator) (string, error) {
	if key.DataType == v3.AttributeKeyDataTypeString {
		if op == v3.FilterOperatorExists {
			return fmt.Sprintf("%s %s ''", key.Key, tracesOperatorMappingV3[v3.FilterOperatorNotEqual]), nil
		} else {
			return fmt.Sprintf("%s %s ''", key.Key, tracesOperatorMappingV3[v3.FilterOperatorEqual]), nil
		}

View on GitHub (pinned to 5069bf80b0)

Solutions

  1. Use one of the v3.FilterOperator constants that exist in tracesOperatorMappingV3 (=, !=, >, >=, <, <=, contains, ncontains, in, nin, exists, nexists, like)
  2. Trim/lowercase operator strings before sending
  3. Upgrade the client to use the current v3 filter operator constants

Example fix

// before
{"operator":"neq","value":"x"}

// after
{"operator":"!=","value":"x"}
Defensive patterns

Strategy: validation

Validate before calling

if _, ok := tracesOperatorMappingV3[item.Operator]; !ok {
    return fmt.Errorf("unsupported operator %s", item.Operator)
}

Type guard

func isSupportedTraceOp(op v3.FilterOperator) bool {
    _, ok := tracesOperatorMappingV3[op]
    return ok
}

Prevention

When it happens

Trigger: Passing an operator string not present in tracesOperatorMappingV3 (e.g. an empty operator, a typo like 'neq', or an operator only supported for logs/metrics) in a traces FilterSet.

Common situations: Copy-pasting filter JSON between log and trace queries; older clients sending operator names that were renamed across SigNoz versions.

Related errors


AI-assisted analysis of SigNoz/signoz@5069bf80b0 (2026-08-28). Data as JSON: /api/errors/ae3863fa0cfdc8d3. Report an issue: GitHub.