{"record":{"id":"033f1534d50469ca","repo":"thanos-io/thanos","slug":"initialize-query-range-limits","errorCode":null,"errorMessage":"initialize query range limits","messagePattern":"initialize query range limits","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/queryfrontend/roundtrip.go","lineNumber":45,"sourceCode":"\trangeQueryOp   = \"query_range\"\n\tinstantQueryOp = \"query\"\n\tlabelNamesOp   = \"label_names\"\n\tlabelValuesOp  = \"label_values\"\n\tseriesOp       = \"series\"\n)\n\nvar 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,","sourceCodeStart":27,"sourceCodeEnd":63,"githubUrl":"https://github.com/thanos-io/thanos/blob/35b8b991177def87ed52dcf10f9b6d87f07282c8/pkg/queryfrontend/roundtrip.go#L27-L63","documentation":"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.","triggerScenarios":"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).","commonSituations":"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.","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"],"exampleFix":"// before\nlimits := queryrange.Limits{MaxQueryIntoStep: -1}\nov, err := validation.NewOverrides(limits, nil)\n// after\nlimits := queryrange.Limits{MaxQueryIntoStep: 60}\nov, err := validation.NewOverrides(limits, nil)\nif err != nil {\n    return nil, errors.Wrap(err, \"initialize query range limits\")\n}","handlingStrategy":"try-catch","validationCode":"if config.QueryRangeConfig.Limits != nil {\n    if _, err := validation.NewOverrides(*config.QueryRangeConfig.Limits, nil); err != nil {\n        return fmt.Errorf(\"query range limits invalid: %w\", err)\n    }\n}","typeGuard":"func queryRangeLimitsConfigured(c Config) bool { return c.QueryRangeConfig.Limits != nil }","tryCatchPattern":"tw, err := NewTripperware(config, ...\nif err != nil && strings.Contains(err.Error(), \"initialize query range limits\") {\n    log.Fatalf(\"fix query_range limits config: %v\", err)\n}","preventionTips":["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"],"tags":["config","query-frontend","limits","initialization"],"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"}