SigNoz/signoz · error

unsupported operator

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.

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.

Appendix: 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)