{"record":{"id":"d838063aa0b6fe73","repo":"thanos-io/thanos","slug":"initialize-labels-limits","errorCode":null,"errorMessage":"initialize labels limits","messagePattern":"initialize labels limits","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/queryfrontend/roundtrip.go","lineNumber":52,"sourceCode":"var labelValuesPattern = regexp.MustCompile(\"/api/v1/label/.+/values$\")\n\n// NewTripperware returns a Tripperware which sends requests to different sub tripperwares based on the query type.\nfunc NewTripperware(config Config, reg prometheus.Registerer, logger log.Logger) (queryrange.Tripperware, error) {\n\tvar (\n\t\tqueryRangeLimits, labelsLimits queryrange.Limits\n\t\terr                            error\n\t)\n\tif config.QueryRangeConfig.Limits != nil {\n\t\tqueryRangeLimits, err = validation.NewOverrides(*config.QueryRangeConfig.Limits, nil)\n\t\tif err != nil {\n\t\t\treturn nil, errors.Wrap(err, \"initialize query range limits\")\n\t\t}\n\t}\n\n\tif config.LabelsConfig.Limits != nil {\n\t\tlabelsLimits, err = validation.NewOverrides(*config.LabelsConfig.Limits, nil)\n\t\tif err != nil {\n\t\t\treturn nil, errors.Wrap(err, \"initialize labels limits\")\n\t\t}\n\t}\n\n\tqueryRangeCodec := NewThanosQueryRangeCodec(config.QueryRangeConfig.PartialResponseStrategy)\n\tlabelsCodec := NewThanosLabelsCodec(config.LabelsConfig.PartialResponseStrategy, config.DefaultTimeRange)\n\tqueryInstantCodec := NewThanosQueryInstantCodec(config.QueryRangeConfig.PartialResponseStrategy)\n\n\tqueryRangeTripperware, err := newQueryRangeTripperware(\n\t\tconfig.QueryRangeConfig,\n\t\tqueryRangeLimits,\n\t\tqueryRangeCodec,\n\t\tconfig.NumShards,\n\t\tconfig.CortexHandlerConfig.QueryStatsEnabled,\n\t\tprometheus.WrapRegistererWith(prometheus.Labels{\"tripperware\": \"query_range\"}, reg), logger, config.ForwardHeaders)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n","sourceCodeStart":34,"sourceCodeEnd":70,"githubUrl":"https://github.com/thanos-io/thanos/blob/35b8b991177def87ed52dcf10f9b6d87f07282c8/pkg/queryfrontend/roundtrip.go#L34-L70","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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"],"exampleFix":"// before\nlimits := queryrange.Limits{MaxQueryParallelism: 0}\nov, err := validation.NewOverrides(limits, nil)\n// after\nlimits := queryrange.Limits{MaxQueryParallelism: 14}\nov, err := validation.NewOverrides(limits, nil)\nif err != nil {\n    return nil, errors.Wrap(err, \"initialize labels limits\")\n}","handlingStrategy":"try-catch","validationCode":"if config.LabelsConfig.Limits != nil {\n    if _, err := validation.NewOverrides(*config.LabelsConfig.Limits, nil); err != nil {\n        return fmt.Errorf(\"labels limits invalid: %w\", err)\n    }\n}","typeGuard":"func labelsLimitsConfigured(c Config) bool { return c.LabelsConfig.Limits != nil }","tryCatchPattern":"tw, err := NewTripperware(config, ...\nif err != nil && strings.Contains(err.Error(), \"initialize labels limits\") {\n    log.Fatalf(\"fix labels limits config: %v\", err)\n}","preventionTips":["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"],"tags":["config","query-frontend","limits","labels"],"backgroundTag":"module-init-failed","analyzedSha":"35b8b991177def87ed52dcf10f9b6d87f07282c8","analyzedAt":"2026-09-07T01:49:59.689Z","contentChangedAt":"2026-09-07T01:49:59.689Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}