{"record":{"id":"84c4e1f5ad72ff2c","repo":"thanos-io/thanos","slug":"parse-federation-labels","errorCode":null,"errorMessage":"parse federation labels","messagePattern":"parse federation labels","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/thanos/query.go","lineNumber":222,"sourceCode":"\tendpointGroups := extkingpin.Addrs(cmd.Flag(\"endpoint-group\", \"(Deprecated, Experimental): DNS name of statically configured Thanos API server groups (repeatable). Targets resolved from the DNS name will be queried in a round-robin, instead of a fanout manner. This flag should be used when connecting a Thanos Query to HA groups of Thanos components.\").PlaceHolder(\"<endpoint-group>\"))\n\n\tstrictEndpoints := extkingpin.Addrs(cmd.Flag(\"endpoint-strict\", \"(Deprecated): Addresses of only statically configured Thanos API servers that are always used, even if the health check fails. Useful if you have a caching layer on top.\").\n\t\tPlaceHolder(\"<endpoint-strict>\"))\n\n\tstrictEndpointGroups := extkingpin.Addrs(cmd.Flag(\"endpoint-group-strict\", \"(Deprecated, Experimental): DNS name of statically configured Thanos API server groups (repeatable) that are always used, even if the health check fails.\").PlaceHolder(\"<endpoint-group-strict>\"))\n\n\tinjectTestAddresses := extkingpin.Addrs(cmd.Flag(\"inject-test-addresses\", \"Inject test addresses for DNS resolver (repeatable).\").PlaceHolder(\"<inject-test-address>\").Hidden())\n\n\tlazyRetrievalMaxBufferedResponses := cmd.Flag(\"query.lazy-retrieval-max-buffered-responses\", \"The lazy retrieval strategy can buffer up to this number of responses. This is to limit the memory usage. This flag takes effect only when the lazy retrieval strategy is enabled.\").\n\t\tDefault(\"20\").Hidden().Int()\n\n\tvar storeRateLimits store.SeriesSelectLimits\n\tstoreRateLimits.RegisterFlags(cmd)\n\n\tcmd.Setup(func(g *run.Group, logger log.Logger, reg *prometheus.Registry, tracer opentracing.Tracer, _ <-chan struct{}, debugLogging bool) error {\n\t\tselectorLset, err := parseFlagLabels(*selectorLabels)\n\t\tif err != nil {\n\t\t\treturn errors.Wrap(err, \"parse federation labels\")\n\t\t}\n\n\t\tfor _, feature := range *featureList {\n\t\t\tif feature == promqlExperimentalFunctions {\n\t\t\t\tparser.EnableExperimentalFunctions = true\n\t\t\t\tlevel.Info(logger).Log(\"msg\", \"Experimental PromQL functions enabled.\", \"option\", promqlExperimentalFunctions)\n\t\t\t}\n\t\t\tif feature == promqlAtModifier {\n\t\t\t\tlevel.Warn(logger).Log(\"msg\", \"This option for --enable-feature is now permanently enabled and therefore a no-op.\", \"option\", promqlAtModifier)\n\t\t\t}\n\t\t\tif feature == promqlNegativeOffset {\n\t\t\t\tlevel.Warn(logger).Log(\"msg\", \"This option for --enable-feature is now permanently enabled and therefore a no-op.\", \"option\", promqlNegativeOffset)\n\t\t\t}\n\t\t\tif feature == queryPushdown {\n\t\t\t\tlevel.Warn(logger).Log(\"msg\", \"This option for --enable-feature is now permanently deprecated and therefore ignored.\", \"option\", queryPushdown)\n\t\t\t}\n\t\t}\n","sourceCodeStart":204,"sourceCodeEnd":240,"githubUrl":"https://github.com/thanos-io/thanos/blob/35b8b991177def87ed52dcf10f9b6d87f07282c8/cmd/thanos/query.go#L204-L240","documentation":"The query command parses the --selector-label flag (repeated external/federation labels that identify this query frontend) via parseFlagLabels; if the value is not a valid PromQL label set, it returns the error wrapped as \"parse federation labels\" during setup.","triggerScenarios":"Calling `thanos query --selector-label=...` where the flag value cannot be parsed as a valid promutil.Labels() set — e.g. missing quotes, unbalanced braces, invalid label name characters, or empty values.","commonSituations":"Shell stripping quotes (e.g. --selector-label='replica=\"r1\"' written without inner quotes in YAML), Kubernetes manifests where quoted values get mangled, or typos like '=' instead of '=\"...\"'.","solutions":["Quote each label value: --selector-label='cluster=\"eu1\"' (single outer quotes, double inner quotes).","Check the resolved value inside your deployment manifest (Helm/Kustomize may strip or double-quote).","Validate the label set with promtool or by running the flag through promutil.Labels locally.","Use --log.level=debug to see the raw flag values Thanos received."],"exampleFix":"// before\nargs: [\"query\", \"--selector-label=cluster=eu1\"]\n// after\nargs: [\"query\", \"--selector-label=cluster=\\\"eu1\\\"\"]","handlingStrategy":"validation","validationCode":"// Validate selector labels before launching\nimport \"github.com/thanos-io/thanos/pkg/store/labelproxy\"\nif _, err := parseFlagLabels(flagValue); err != nil {\n    return fmt.Errorf(\"selector-label invalid: %w\", err)\n}","typeGuard":null,"tryCatchPattern":"sel, err := promutil.ParseLabels(flagVal)\nif err != nil {\n    return fmt.Errorf(\"bad --selector-label %q: %w\", flagVal, err)\n}","preventionTips":["Always use single-quoted shell values with double-quoted label values: 'k=\"v\"'","In YAML args arrays, escape inner double quotes","Render templates (helm template) and inspect the final argv before deploy"],"tags":["flags","labels","parsing"],"backgroundTag":"invalid-argument-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"}