{"record":{"id":"dcc2029f45feba57","repo":"thanos-io/thanos","slug":"parse-raw-query-s","errorCode":null,"errorMessage":"parse raw query %s","messagePattern":"parse raw query (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/promclient/promclient.go","lineNumber":430,"sourceCode":"\t\treturn errors.Errorf(\"unknown partial response strategy %v\", p.PartialResponseStrategy)\n\t}\n\n\t// TODO(bwplotka): Apply change from bool to strategy in Query API as well.\n\tvalues.Add(\"partial_response\", partialResponseValue)\n\n\treturn nil\n}\n\ntype Explanation struct {\n\tName     string         `json:\"name\"`\n\tChildren []*Explanation `json:\"children,omitempty\"`\n}\n\n// QueryInstant performs an instant query using a default HTTP client and returns results in model.Vector type.\nfunc (c *Client) QueryInstant(ctx context.Context, base *url.URL, query string, t time.Time, opts QueryOptions) (model.Vector, []string, *Explanation, error) {\n\tparams, err := url.ParseQuery(base.RawQuery)\n\tif err != nil {\n\t\treturn nil, nil, nil, errors.Wrapf(err, \"parse raw query %s\", base.RawQuery)\n\t}\n\tparams.Add(\"query\", query)\n\tparams.Add(\"time\", t.Format(time.RFC3339Nano))\n\tif !opts.DoNotAddThanosParams {\n\t\tif err := opts.AddTo(params); err != nil {\n\t\t\treturn nil, nil, nil, errors.Wrap(err, \"add thanos opts query params\")\n\t\t}\n\t}\n\n\tu := *base\n\tu.Path = path.Join(u.Path, \"/api/v1/query\")\n\tu.RawQuery = params.Encode()\n\n\tlevel.Debug(c.logger).Log(\"msg\", \"querying instant\", \"url\", u.String())\n\n\tspan, ctx := tracing.StartSpan(ctx, \"/prom_query_instant HTTP[client]\")\n\tdefer span.Finish()\n","sourceCodeStart":412,"sourceCodeEnd":448,"githubUrl":"https://github.com/thanos-io/thanos/blob/35b8b991177def87ed52dcf10f9b6d87f07282c8/pkg/promclient/promclient.go#L412-L448","documentation":"QueryInstant parses the base URL's existing RawQuery with url.ParseQuery before adding the query/time parameters. If that raw query string is malformed (bad percent-encoding, invalid separator), it returns this error wrapping the parse failure and including the raw query string.","triggerScenarios":"The *url.URL passed to QueryInstant contains a RawQuery that url.ParseQuery rejects — e.g. '%' not followed by hex digits, or invalid separators left over from manual URL construction.","commonSituations":"Building base URLs by string concatenation with hand-written query strings; copying URLs from logs/browsers with encoded characters mishandled; templates injecting unencoded values into the query part.","solutions":["Inspect the raw query printed in the error to find the malformed segment","Use url.Values.Encode() or url.Parse on the full base URL instead of hand-built query strings","Strip or fix the base URL's RawQuery if pre-existing params are not needed","Percent-encode any dynamically inserted query values"],"exampleFix":"// before\nu, _ := url.Parse(\"http://thanos:9090/api/v1/query?query=%zz\") // invalid escape\n// after\nu, _ := url.Parse(\"http://thanos:9090/api/v1/query\") // let the client add params","handlingStrategy":"validation","validationCode":"if base.RawQuery != \"\" {\n    if _, err := url.ParseQuery(base.RawQuery); err != nil {\n        return fmt.Errorf(\"base url has malformed query: %w\", err)\n    }\n}","typeGuard":"func hasValidRawQuery(u *url.URL) bool {\n    _, err := url.ParseQuery(u.RawQuery)\n    return err == nil\n}","tryCatchPattern":"vec, _, _, err := client.QueryInstant(ctx, base, query, t, opts)\nif err != nil && strings.Contains(err.Error(), \"parse raw query\") {\n    base.RawQuery = \"\" // drop malformed params and retry\n    vec, _, _, err = client.QueryInstant(ctx, base, query, t, opts)\n}","preventionTips":["Build base URLs via url.Parse and url.Values, never string concat","Strip pre-existing RawQuery when you intend to supply params yourself","Percent-encode any interpolated values"],"tags":["url","query","parsing"],"backgroundTag":"invalid-url-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"}