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

  1. Read the wrapped inner error to find the offending limits field
  2. Fix the invalid value under query_range.limits (durations, max_query_parallelism, etc.)
  3. If custom limits are not needed, leave query_range.limits unset so the nil check skips NewOverrides
  4. 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

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


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)