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

  1. Use v3.FilterOperator constants present in tracesOperatorMappingV3
  2. Normalize (trim, lowercase) operator strings before sending
  3. 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

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


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