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
- Read the wrapped inner error to identify the invalid labels limit field
- Correct the value under the labels limits section (e.g. max_series, split interval limits)
- Leave labels limits unset if defaults are acceptable, so the nil check skips initialization
- 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
- Mirror the query_range limits setup when adding labels limits; keep both structs valid
- Prefer flag/defaults registration over manual struct literals in tests
- Inspect the inner error to locate the invalid field quickly
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
- split queries interval should be greater than 0 when…
- labels.default-time-range cannot be set to 0
- initialize query range limits
- unrecognized label
- unsupported format for label
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)