SigNoz/signoz · error

invalid value for key %s: %v

Error message

invalid value for key %s: %v

What it means

BuildTracesFilterQuery (v4 traces builder) failed to validate/cast a filter value against the key's declared DataType via utils.ValidateAndCastValue. The named key's value could not be converted, so the filter cannot be rendered into ClickHouse SQL.

Source

Thrown at pkg/query-service/app/traces/v4/query_builder.go:126

	if fs != nil && len(fs.Items) != 0 {
		for _, item := range fs.Items {

			// skip if it's a resource attribute or Span search scope attribute
			// adding skipAllowed because traceFunnels requires the resource one as well.
			if skipAllowed && (item.Key.Type == v3.AttributeKeyTypeResource || item.Key.Type == v3.AttributeKeyTypeSpanSearchScope) {
				continue
			}

			val := item.Value
			// generate the key
			columnName := getColumnName(item.Key, true)
			var fmtVal string
			item.Operator = v3.FilterOperator(strings.ToLower(strings.TrimSpace(string(item.Operator))))
			if item.Operator != v3.FilterOperatorExists && item.Operator != v3.FilterOperatorNotExists {
				var err error
				val, err = utils.ValidateAndCastValue(val, item.Key.DataType)
				if err != nil {
					return "", fmt.Errorf("invalid value for key %s: %v", item.Key.Key, err)
				}
			}
			if val != nil {
				fmtVal = utils.ClickHouseFormattedValue(val)
			}
			if operator, ok := tracesOperatorMappingV3[item.Operator]; ok {
				switch item.Operator {
				case v3.FilterOperatorContains, v3.FilterOperatorNotContains:
					// we also want to treat %, _ as literals for contains
					val := utils.QuoteEscapedStringForContains(fmt.Sprintf("%s", item.Value), false)
					conditions = append(conditions, fmt.Sprintf("%s %s '%%%s%%'", columnName, operator, val))
				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

View on GitHub (pinned to 5069bf80b0)

Solutions

  1. Send values whose type matches item.Key.DataType
  2. Validate the filter set client-side before calling these endpoints
  3. Refresh attribute metadata to get accurate DataTypes

Example fix

// before
{"key":{"key":"status_code","dataType":"int64"},"value":"500"}

// after
{"key":{"key":"status_code","dataType":"int64"},"value":500}
Defensive patterns

Strategy: validation

Validate before calling

for _, item := range fs.Items {
    if item.Operator != v3.FilterOperatorExists && item.Operator != v3.FilterOperatorNexists {
        if _, err := utils.ValidateAndCastValue(item.Value, item.Key.DataType); err != nil {
            return fmt.Errorf("fix value for %s", item.Key.Key)
        }
    }
}

Type guard

func filtersCastClean(fs *v3.FilterSet) bool {
    for _, it := range fs.Items {
        if _, err := utils.ValidateAndCastValue(it.Value, it.Key.DataType); err != nil {
            return false
        }
    }
    return true
}

Prevention

When it happens

Trigger: A traces FilterSet where a value's JSON/Go type conflicts with item.Key.DataType (string sent for int64 key, etc.) with any operator except exists/nexists. This function backs ValidateTraces, funnel analytics, step analytics, and slowest/errored trace endpoints, so those endpoints surface it too.

Common situations: Funnel or step-analytics payloads with hand-built filters; stringified numbers from client forms; attribute dataType drift after re-ingestion.

Related errors


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