thanos-io/thanos · error
initialize query range limits
Error message
initialize query range limits
What it means
NewTripperware builds the query-frontend HTTP tripperware chain. When config.QueryRangeConfig.Limits is set, it constructs queryrange limits via validation.NewOverrides; any error there (e.g. invalid default limit values or per-tenant override structure) is wrapped with this message. It signals the query-range limits configuration could not be initialized, aborting frontend startup.
Solutions
- Read the wrapped inner error to find the offending limits field
- Fix the invalid value under query_range.limits (durations, max_query_parallelism, etc.)
- If custom limits are not needed, leave query_range.limits unset so the nil check skips NewOverrides
- Validate the limits struct programmatically before calling NewTripperware
Example fix
// before
limits := queryrange.Limits{MaxQueryIntoStep: -1}
ov, err := validation.NewOverrides(limits, nil)
// after
limits := queryrange.Limits{MaxQueryIntoStep: 60}
ov, err := validation.NewOverrides(limits, nil)
if err != nil {
return nil, errors.Wrap(err, "initialize query range limits")
} Defensive patterns
Strategy: try-catch
Validate before calling
if config.QueryRangeConfig.Limits != nil {
if _, err := validation.NewOverrides(*config.QueryRangeConfig.Limits, nil); err != nil {
return fmt.Errorf("query range limits invalid: %w", err)
}
} Type guard
func queryRangeLimitsConfigured(c Config) bool { return c.QueryRangeConfig.Limits != nil } Try / catch
tw, err := NewTripperware(config, ...
if err != nil && strings.Contains(err.Error(), "initialize query range limits") {
log.Fatalf("fix query_range limits config: %v", err)
} Prevention
- Build Limits via RegisterFlags/defaults instead of hand-constructing structs
- Validate durations and max-query fields in config tests before deploy
- Log the inner wrapped error, not just the wrap message, to find the offending field
When it happens
Trigger: NewTripperware is called (by runQueryFrontend or tests) with QueryRangeConfig.Limits non-nil and validation.NewOverrides(*config.QueryRangeConfig.Limits, nil) returns an error — typically a malformed limits struct (invalid duration values, negative limits, invalid default values).
Common situations: Invalid per-tenant or default limit fields under query_range.limits in YAML; env-expanded values producing unparseable durations; programmatic construction of Limits with zero/invalid fields in tests.
Related errors
- initialize labels limits
- create syncer
- The ingester.max-global-series-per-user limit is…
- parsing config YAML file
- marshal content of cache backend configuration
AI-assisted analysis of thanos-io/thanos@35b8b99117 (2026-09-07).
Data as JSON: /api/errors/033f1534d50469ca.
Report an issue: GitHub.
Appendix: source
Thrown at pkg/queryfrontend/roundtrip.go:45
rangeQueryOp = "query_range"
instantQueryOp = "query"
labelNamesOp = "label_names"
labelValuesOp = "label_values"
seriesOp = "series"
)
var labelValuesPattern = regexp.MustCompile("/api/v1/label/.+/values$")
// NewTripperware returns a Tripperware which sends requests to different sub tripperwares based on the query type.
func NewTripperware(config Config, reg prometheus.Registerer, logger log.Logger) (queryrange.Tripperware, error) {
var (
queryRangeLimits, labelsLimits queryrange.Limits
err error
)
if config.QueryRangeConfig.Limits != nil {
queryRangeLimits, err = validation.NewOverrides(*config.QueryRangeConfig.Limits, nil)
if err != nil {
return nil, errors.Wrap(err, "initialize query range limits")
}
}
if config.LabelsConfig.Limits != nil {
labelsLimits, err = validation.NewOverrides(*config.LabelsConfig.Limits, nil)
if err != nil {
return nil, errors.Wrap(err, "initialize labels limits")
}
}
queryRangeCodec := NewThanosQueryRangeCodec(config.QueryRangeConfig.PartialResponseStrategy)
labelsCodec := NewThanosLabelsCodec(config.LabelsConfig.PartialResponseStrategy, config.DefaultTimeRange)
queryInstantCodec := NewThanosQueryInstantCodec(config.QueryRangeConfig.PartialResponseStrategy)
queryRangeTripperware, err := newQueryRangeTripperware(
config.QueryRangeConfig,
queryRangeLimits,
queryRangeCodec,View on GitHub (pinned to 35b8b99117)