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 "", errView on GitHub (pinned to 5069bf80b0)
Solutions
- Send values whose type matches item.Key.DataType
- Validate the filter set client-side before calling these endpoints
- 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
- Validate funnel/step analytics payloads against attribute types
- Use typed inputs in forms
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
- invalid value for key %s: %v
- unsupported operator %s
- unsupported operation, exists and not exists can only be app
- unsupported operator %s
- invalid scope item type: %s
AI-assisted analysis of SigNoz/signoz@5069bf80b0 (2026-08-28).
Data as JSON: /api/errors/f518cddb8592238d.
Report an issue: GitHub.