SigNoz/signoz · error
invalid attribute type: %s
Error message
invalid attribute type: %s
What it means
AttributeKey.Validate() checks Type only when IsColumn is true, and fails unless it is "resource" (AttributeKeyTypeResource), "tag" (AttributeKeyTypeTag), "unspecified", or "scope" (AttributeKeyTypeInstrumentationScope). Column-typed keys must declare which attribute namespace they come from so the query builder can resolve the ClickHouse column.
Source
Thrown at pkg/query-service/model/v3/v3.go:411
func (a AttributeKey) CacheKey() string {
return fmt.Sprintf("%s-%s-%s-%t", a.Key, a.DataType, a.Type, a.IsColumn)
}
func (a AttributeKey) Validate() error {
switch a.DataType {
case AttributeKeyDataTypeBool, AttributeKeyDataTypeInt64, AttributeKeyDataTypeFloat64, AttributeKeyDataTypeString, AttributeKeyDataTypeArrayFloat64, AttributeKeyDataTypeArrayString, AttributeKeyDataTypeArrayInt64, AttributeKeyDataTypeArrayBool, AttributeKeyDataTypeUnspecified:
break
default:
return fmt.Errorf("invalid attribute dataType: %s", a.DataType)
}
if a.IsColumn {
switch a.Type {
case AttributeKeyTypeResource, AttributeKeyTypeTag, AttributeKeyTypeUnspecified, AttributeKeyTypeInstrumentationScope:
break
default:
return fmt.Errorf("invalid attribute type: %s", a.Type)
}
}
if a.Key == "" {
return fmt.Errorf("key is empty")
}
return nil
}
type FilterAttributeValueResponse struct {
StringAttributeValues []string `json:"stringAttributeValues"`
NumberAttributeValues []interface{} `json:"numberAttributeValues"`
BoolAttributeValues []bool `json:"boolAttributeValues"`
RelatedValues *FilterAttributeValueResponse `json:"relatedValues,omitempty"`
}
type QueryRangeParamsV3 struct {View on GitHub (pinned to 5069bf80b0)
Solutions
- When isColumn is true, set type to "tag", "resource", "scope", or "unspecified"
- Prefer using server-returned AttributeKey objects (from autocomplete APIs) verbatim in filters so type/isColumn stay consistent
- If you don't need column semantics, set isColumn:false and omit type
Example fix
// before
{"key":"service.name","dataType":"string","isColumn":true,"type":""}
// after
{"key":"service.name","dataType":"string","isColumn":true,"type":"resource"} Defensive patterns
Strategy: validation
Validate before calling
if key.IsColumn { switch key.Type { case v3.AttributeKeyTypeResource, v3.AttributeKeyTypeTag, v3.AttributeKeyTypeUnspecified, v3.AttributeKeyTypeInstrumentationScope: default: return fmt.Errorf("bad key type %q", key.Type) } } Type guard
func columnKeyHasValidType(k v3.AttributeKey) bool { return !k.IsColumn || k.Type == v3.AttributeKeyTypeResource || k.Type == v3.AttributeKeyTypeTag || k.Type == v3.AttributeKeyTypeUnspecified || k.Type == v3.AttributeKeyTypeInstrumentationScope } Prevention
- Only set isColumn:true for keys the server flagged as columns
- Copy type from the server's attribute metadata
When it happens
Trigger: Sending a builder query where a filter/group-by key has isColumn:true and type set to "span", "metric", "", or another invalid value. Keys with isColumn:false skip this check entirely.
Common situations: Marking user-selected attributes as columns while leaving type empty, mixing up TagType values with AttributeKeyType, or older payloads predating instrumentation-scope support.
Understand the failure class
Background: Invalid enum value errors: "Unknown type", "Invalid scope", "must be one of" — when a string is not on the library's allowed list — this error's family across 23 libraries.
Related errors
- invalid operator: %s
- invalid reduce to operator: %s
- invalid query type: %s
- invalid attribute dataType: %s
- key is empty
AI-assisted analysis of SigNoz/signoz@5069bf80b0 (2026-08-28).
Data as JSON: /api/errors/3ff756b69dd47c21.
Report an issue: GitHub.