{"record":{"id":"b8013ffcf7c5ad33","repo":"thanos-io/thanos","slug":"cannot-parse-q-to-a-valid-duration","errorCode":null,"errorMessage":"cannot parse %q to a valid duration","messagePattern":"cannot parse %q to a valid duration","errorType":"http","errorClass":null,"httpStatus":400,"severity":"error","filePath":"pkg/api/query/v1.go","lineNumber":1613,"sourceCode":"\t}\n\tif t, err := time.Parse(time.RFC3339Nano, s); err == nil {\n\t\treturn t, nil\n\t}\n\treturn time.Time{}, errors.Errorf(\"cannot parse %q to a valid timestamp\", s)\n}\n\nfunc parseDuration(s string) (time.Duration, error) {\n\tif d, err := strconv.ParseFloat(s, 64); err == nil {\n\t\tts := d * float64(time.Second)\n\t\tif ts > float64(math.MaxInt64) || ts < float64(math.MinInt64) {\n\t\t\treturn 0, errors.Errorf(\"cannot parse %q to a valid duration. It overflows int64\", s)\n\t\t}\n\t\treturn time.Duration(ts), nil\n\t}\n\tif d, err := model.ParseDuration(s); err == nil {\n\t\treturn time.Duration(d), nil\n\t}\n\treturn 0, errors.Errorf(\"cannot parse %q to a valid duration\", s)\n}\n\n// parseLimitParam returning 0 means no limit is to be applied.\nfunc parseLimitParam(s string) (int, error) {\n\tif s == \"\" {\n\t\treturn 0, nil\n\t}\n\n\tlimit, err := strconv.Atoi(s)\n\tif err != nil {\n\t\treturn 0, errors.Errorf(\"cannot parse %q to a valid limit\", s)\n\t}\n\tif limit < 0 {\n\t\treturn 0, errors.New(\"limit must be non-negative\")\n\t}\n\n\treturn limit, nil\n}","sourceCodeStart":1595,"sourceCodeEnd":1631,"githubUrl":"https://github.com/thanos-io/thanos/blob/35b8b991177def87ed52dcf10f9b6d87f07282c8/pkg/api/query/v1.go#L1595-L1631","documentation":"parseDuration input validation: the query API parameter string s could not be interpreted as a duration (neither a float of seconds nor a Prometheus duration like 1h30m). The offending query parameter value is at fault.","triggerScenarios":"Passing a malformed duration such as `?timeout=abc`, `timeout=5x`, or `timeout=1h30` to any endpoint using parseDuration (e.g. query timeout).","commonSituations":"Typos in duration units, humanized strings like '5 minutes' not matching Prometheus syntax (`5m`), localization artifacts, or passing empty/unset values that skip validation.","solutions":["Pass durations in Prometheus format (e.g. 1h, 5m) or seconds as a number","Check the query parameter for typos"],"exampleFix":"// before\nGET /api/v1/query?query=up&timeout=5 minutes\n// after\nGET /api/v1/query?query=up&timeout=5m","handlingStrategy":"validation","validationCode":"function validDuration(s) {\n  const d = Number(s);\n  return !Number.isNaN(d) || /^\\d+(ms|s|m|h|d|w|y)$/.test(s);\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Use model.ParseDuration-compatible syntax (e.g. 1h30m is NOT valid here — prefer single-unit or numeric seconds).","Never pass human-language durations; convert first.","Trim whitespace from parameters before sending."],"tags":["duration","bad-request","query-api","parsing"],"backgroundTag":"invalid-duration-format","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"}