SigNoz/signoz · error

order must be asc or desc

Error message

order must be asc or desc

What it means

QueryRuleStateHistory.Validate restricts the Order param for rule state history to exactly 'asc' or 'desc'; any other value (including empty, uppercase, or 'ascending') is rejected.

Source

Thrown at pkg/query-service/model/alerting.go:167

type QueryRuleStateHistory struct {
	Start   int64         `json:"start"`
	End     int64         `json:"end"`
	State   string        `json:"state"`
	Filters *v3.FilterSet `json:"filters"`
	Offset  int64         `json:"offset"`
	Limit   int64         `json:"limit"`
	Order   string        `json:"order"`
}

func (r *QueryRuleStateHistory) Validate() error {
	if r.Start == 0 || r.End == 0 {
		return fmt.Errorf("start and end are required")
	}
	if r.Offset < 0 || r.Limit < 0 {
		return fmt.Errorf("offset and limit must be greater than 0")
	}
	if r.Order != "asc" && r.Order != "desc" {
		return fmt.Errorf("order must be asc or desc")
	}
	return nil
}

type RuleStateHistoryContributor struct {
	Fingerprint       uint64       `json:"fingerprint" ch:"fingerprint"`
	Labels            LabelsString `json:"labels" ch:"labels"`
	Count             uint64       `json:"count" ch:"count"`
	RelatedTracesLink string       `json:"relatedTracesLink"`
	RelatedLogsLink   string       `json:"relatedLogsLink"`
}

type RuleStateTransition struct {
	RuleID         string     `json:"ruleID" ch:"rule_id"`
	State          AlertState `json:"state" ch:"state"`
	FiringTime     int64      `json:"firingTime" ch:"firing_time"`
	ResolutionTime int64      `json:"resolutionTime" ch:"resolution_time"`
}

View on GitHub (pinned to 5069bf80b0)

Solutions

  1. Send order=asc or order=desc exactly (lowercase)
  2. Default to 'desc' client-side when the user hasn't chosen
  3. Lowercase and trim user input before sending

Example fix

// before
GET /api/rules/<id>/state_history?order=ASC&start=..&end=..

// after
GET /api/rules/<id>/state_history?order=asc&start=..&end=..
Defensive patterns

Strategy: validation

Validate before calling

if r.Order != "asc" && r.Order != "desc" {
    r.Order = "desc"
}

Type guard

func isValidOrder(s string) bool { return s == "asc" || s == "desc" }

Prevention

When it happens

Trigger: Sending order=ASC, order=ascending, or omitting order entirely while calling getRuleStateHistory.

Common situations: Clients defaulting to verbose direction names; case-sensitive strings from user input; missing param because the developer assumed a server-side default.

Related errors


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