discovery/kubernetes: Fix valid label selector causing config error

Label selector can be
"set-based"(https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#set-based-requirement)
but such a selector causes Prometheus start failure with the "unexpected
error: parsing YAML file ...: invalid selector: 'foo in (bar,baz)';
can't understand 'baz)'"-like error.

This is caused by the `fields.ParseSelector(string)` function that
simply splits an expression as a CSV-list, so a comma confuses such a
parsing method and lead to the error.

Use `labels.Parse(string)` to use a valid lexer to parse a selector
expression.

Closes #8284.

Signed-off-by: Alexey Shumkin <Alex.Crezoff@gmail.com>
This commit is contained in:
Alexey Shumkin 2020-12-14 16:49:50 +03:00
parent c08009139a
commit 73ddf603af
No known key found for this signature in database
GPG key ID: 48EFA0A7C5DF6943
2 changed files with 7 additions and 1 deletions

View file

@ -6,3 +6,8 @@ scrape_configs:
- role: "pod" - role: "pod"
label: "foo=bar" label: "foo=bar"
field: "metadata.status=Running" field: "metadata.status=Running"
- role: pod
selectors:
- role: "pod"
label: "foo in (bar,baz)"
field: "metadata.status=Running"

View file

@ -33,6 +33,7 @@ import (
"k8s.io/api/networking/v1beta1" "k8s.io/api/networking/v1beta1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/fields"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/watch" "k8s.io/apimachinery/pkg/watch"
"k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes"
@ -203,7 +204,7 @@ func (c *SDConfig) UnmarshalYAML(unmarshal func(interface{}) error) error {
if err != nil { if err != nil {
return err return err
} }
_, err = fields.ParseSelector(selector.Label) _, err = labels.Parse(selector.Label)
if err != nil { if err != nil {
return err return err
} }