thanos-io/thanos · error

initialize labels limits

Error message

initialize labels limits

What it means

NewTripperware initializes labels-tripperware limits via validation.NewOverrides when config.LabelsConfig.Limits is non-nil. A failure (invalid default values, malformed overrides) is wrapped with 'initialize labels limits', aborting startup because the label API's limit configuration cannot be constructed.

Solutions

  1. Read the wrapped inner error to identify the invalid labels limit field
  2. Correct the value under the labels limits section (e.g. max_series, split interval limits)
  3. Leave labels limits unset if defaults are acceptable, so the nil check skips initialization
  4. Construct Limits via its flag/defaults mechanism rather than by hand to avoid missing fields

Example fix

// before
limits := queryrange.Limits{MaxQueryParallelism: 0}
ov, err := validation.NewOverrides(limits, nil)
// after
limits := queryrange.Limits{MaxQueryParallelism: 14}
ov, err := validation.NewOverrides(limits, nil)
if err != nil {
    return nil, errors.Wrap(err, "initialize labels limits")
}
Defensive patterns

Strategy: try-catch

Validate before calling

if config.LabelsConfig.Limits != nil {
    if _, err := validation.NewOverrides(*config.LabelsConfig.Limits, nil); err != nil {
        return fmt.Errorf("labels limits invalid: %w", err)
    }
}

Type guard

func labelsLimitsConfigured(c Config) bool { return c.LabelsConfig.Limits != nil }

Try / catch

tw, err := NewTripperware(config, ...
if err != nil && strings.Contains(err.Error(), "initialize labels limits") {
    log.Fatalf("fix labels limits config: %v", err)
}

Prevention

When it happens

Trigger: NewTripperware is called with LabelsConfig.Limits non-nil and validation.NewOverrides(*config.LabelsConfig.Limits, nil) returns an error — invalid field values in the labels limits struct.

Common situations: Bad values under labels/labels_cache limits in config YAML; invalid durations or negative max series limits; test code constructing LabelsConfig.Limits with incomplete defaults.

Related errors


AI-assisted analysis of thanos-io/thanos@35b8b99117 (2026-09-07). Data as JSON: /api/errors/d838063aa0b6fe73. Report an issue: GitHub.

Appendix: source

Thrown at pkg/queryfrontend/roundtrip.go:52

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,
		config.NumShards,
		config.CortexHandlerConfig.QueryStatsEnabled,
		prometheus.WrapRegistererWith(prometheus.Labels{"tripperware": "query_range"}, reg), logger, config.ForwardHeaders)
	if err != nil {
		return nil, err
	}

View on GitHub (pinned to 35b8b99117)