diff --git a/pkg/operator/go.mod b/pkg/operator/go.mod index 428d24502..e2723e126 100644 --- a/pkg/operator/go.mod +++ b/pkg/operator/go.mod @@ -91,7 +91,7 @@ require ( github.com/golang/snappy v0.0.4 // indirect github.com/google/btree v1.0.1 // indirect github.com/google/gnostic v0.6.9 // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/grafana/regexp v0.0.0-20220304095617-2e8d9baf4ac2 // indirect github.com/hashicorp/go-uuid v1.0.2 // indirect @@ -145,14 +145,15 @@ require ( go.uber.org/goleak v1.2.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.24.0 // indirect - golang.org/x/crypto v0.22.0 // indirect - golang.org/x/net v0.24.0 // indirect + golang.org/x/crypto v0.23.0 // indirect + golang.org/x/net v0.25.0 // indirect golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094 // indirect - golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde // indirect - golang.org/x/sys v0.19.0 // indirect - golang.org/x/term v0.19.0 // indirect - golang.org/x/text v0.14.0 // indirect + golang.org/x/sync v0.7.0 // indirect + golang.org/x/sys v0.20.0 // indirect + golang.org/x/term v0.20.0 // indirect + golang.org/x/text v0.15.0 // indirect golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9 // indirect + golang.org/x/tools v0.21.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect diff --git a/pkg/operator/go.sum b/pkg/operator/go.sum index 8d3949f18..d5387d647 100644 --- a/pkg/operator/go.sum +++ b/pkg/operator/go.sum @@ -578,8 +578,8 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -1207,8 +1207,8 @@ golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.0.0-20220131195533-30dcbda58838/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1253,8 +1253,8 @@ golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1322,8 +1322,8 @@ golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= -golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= +golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1362,8 +1362,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde h1:ejfdSekXMDxDLbRrJMwUk6KnSLZ2McaUCVcIKM+N6jc= -golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1475,13 +1475,13 @@ golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= -golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= +golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1491,8 +1491,8 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1578,8 +1578,8 @@ golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.21.0 h1:qc0xYgIbsSDt9EyWz05J5wfa7LOVW0YTLOXrqdLAWIw= +golang.org/x/tools v0.21.0/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/pkg/operator/operator/discover/discover.go b/pkg/operator/operator/discover/discover.go index 1698f6c86..4439b855b 100644 --- a/pkg/operator/operator/discover/discover.go +++ b/pkg/operator/operator/discover/discover.go @@ -16,6 +16,7 @@ import ( "hash/fnv" "net" "net/url" + "regexp" "sort" "strings" "sync" @@ -120,29 +121,31 @@ func EncodeBase64(s string) string { } type BaseParams struct { - Client kubernetes.Interface - RelabelRule string - RelabelIndex string - Name string - KubeConfig string - Namespaces []string - Path string - Scheme string - ProxyURL string - Period string - Timeout string - ForwardLocalhost bool - DisableCustomTimestamp bool - DataID *bkv1beta1.DataID - Relabels []*relabel.Config - BasicAuth *promv1.BasicAuth - TLSConfig *promv1.TLSConfig - BearerTokenFile string - BearerTokenSecret *corev1.SecretKeySelector - ExtraLabels map[string]string - System bool - UrlValues url.Values - MetricRelabelConfigs []yaml.MapSlice + Client kubernetes.Interface + RelabelRule string + RelabelIndex string + Name string + KubeConfig string + Namespaces []string + Path string + Scheme string + ProxyURL string + Period string + Timeout string + ForwardLocalhost bool + DisableCustomTimestamp bool + DataID *bkv1beta1.DataID + Relabels []*relabel.Config + BasicAuth *promv1.BasicAuth + TLSConfig *promv1.TLSConfig + BearerTokenFile string + BearerTokenSecret *corev1.SecretKeySelector + ExtraLabels map[string]string + System bool + UrlValues url.Values + MetricRelabelConfigs []yaml.MapSlice + AnnotationMatchSelector map[string]string + AnnotationDropSelector map[string]string } type BaseDiscover struct { @@ -520,6 +523,27 @@ func metaFromSource(s string) (string, string, error) { return parts[1], parts[2], nil } +func matchSelector(labels []labels.Label, selector map[string]string) bool { + var count int + for k, v := range selector { + re, err := regexp.Compile(v) + if err != nil { + logger.Errorf("failed to compile expr '%s', err: %v", v, err) + continue + } + for _, lbs := range labels { + if lbs.Name == k { + if !re.MatchString(lbs.Value) { + return false + } + count++ + break + } + } + } + return count == len(selector) +} + // handleTargetGroup 遍历自身的所有 target group 计算得到活跃的 target 并删除消失的 target func (d *BaseDiscover) handleTargetGroup(targetGroup *targetgroup.Group) { d.mm.IncHandledTgCounter() @@ -550,6 +574,22 @@ func (d *BaseDiscover) handleTargetGroup(targetGroup *targetgroup.Group) { } } + // annotations 白名单过滤 + if len(d.AnnotationMatchSelector) > 0 { + if !matchSelector(lbls, d.AnnotationMatchSelector) { + logger.Debugf("annotation selector not match: %v", d.AnnotationMatchSelector) + continue + } + } + + // annotations 黑名单过滤 + if len(d.AnnotationDropSelector) > 0 { + if matchSelector(lbls, d.AnnotationDropSelector) { + logger.Debugf("annotation selector drop: %v", d.AnnotationDropSelector) + continue + } + } + sort.Sort(lbls) res, orig, err := d.populateLabels(lbls) if err != nil { diff --git a/pkg/operator/operator/discover/discover_test.go b/pkg/operator/operator/discover/discover_test.go index fb0f3125f..87789f4dc 100644 --- a/pkg/operator/operator/discover/discover_test.go +++ b/pkg/operator/operator/discover/discover_test.go @@ -12,6 +12,7 @@ package discover import ( "testing" + "github.com/prometheus/prometheus/model/labels" "github.com/stretchr/testify/assert" ) @@ -65,3 +66,76 @@ func TestForwardAddressIncorrectly(t *testing.T) { }) } } + +func TestMatchSelector(t *testing.T) { + cases := []struct { + labels []labels.Label + selector map[string]string + matched bool + }{ + { + labels: []labels.Label{ + {Name: "label1", Value: "value1"}, + {Name: "label2", Value: "value2"}, + }, + selector: map[string]string{ + "label1": "value1", + }, + matched: true, + }, + { + labels: []labels.Label{ + {Name: "label1", Value: "value1"}, + {Name: "label2", Value: "value2"}, + }, + selector: map[string]string{ + "label1": "value1", + "label2": "value2", + }, + matched: true, + }, + { + labels: []labels.Label{ + {Name: "label1", Value: "value1"}, + {Name: "label2", Value: "value2"}, + }, + selector: map[string]string{ + "label1": "value1", + "label2": "value3", + }, + matched: false, + }, + { + labels: []labels.Label{ + {Name: "label1", Value: "value1"}, + }, + selector: map[string]string{ + "label1": "value1", + "label2": "value2", + }, + matched: false, + }, + { + labels: []labels.Label{ + {Name: "label1", Value: "value1"}, + }, + selector: map[string]string{ + "label1": "value.*", + }, + matched: true, + }, + { + labels: []labels.Label{ + {Name: "label1", Value: "value1"}, + }, + selector: nil, + matched: true, + }, + } + + for _, c := range cases { + t.Run("", func(t *testing.T) { + assert.Equal(t, c.matched, matchSelector(c.labels, c.selector)) + }) + } +} diff --git a/pkg/operator/operator/operator.go b/pkg/operator/operator/operator.go index c5e2ce649..a6b0294c4 100644 --- a/pkg/operator/operator/operator.go +++ b/pkg/operator/operator/operator.go @@ -13,6 +13,7 @@ import ( "context" "net/http" "os" + "strings" "sync" "time" @@ -44,8 +45,11 @@ const ( monitorKindServiceMonitor = "ServiceMonitor" monitorKindPodMonitor = "PodMonitor" - relabelRuleKey = "bkm_relabel_rule" - relabelIndexKey = "bkm_relabel_index" + annotationRelabelRule = "relabelRule" + annotationRelabelIndex = "relabelIndex" + + annotationMonitorMatchSelector = "monitorMatchSelector" + annotationMonitorDropSelector = "monitorDropSelector" ) // Operator 负责部署和调度任务 @@ -485,6 +489,19 @@ func ifHonorTimestamps(b *bool) bool { return *b } +func parseSelector(s string) map[string]string { + selector := make(map[string]string) + parts := strings.Split(s, ",") + for _, part := range parts { + kv := strings.Split(strings.TrimSpace(part), "=") + if len(kv) != 2 { + continue + } + selector[kv[0]] = kv[1] + } + return selector +} + func (c *Operator) createServiceMonitorDiscovers(serviceMonitor *promv1.ServiceMonitor) []discover.Discover { var ( namespaces []string @@ -547,29 +564,31 @@ func (c *Operator) createServiceMonitorDiscovers(serviceMonitor *promv1.ServiceM endpointDiscover := discover.NewEndpointDiscover(c.ctx, monitorMeta, c.objectsController.NodeNameExists, &discover.EndpointParams{ BaseParams: &discover.BaseParams{ - Client: c.client, - RelabelRule: serviceMonitor.Annotations[relabelRuleKey], - RelabelIndex: serviceMonitor.Annotations[relabelIndexKey], - Name: monitorMeta.ID(), - DataID: dataID, - KubeConfig: ConfKubeConfig, - Namespaces: namespaces, - Relabels: resultLabels, - Path: endpoint.Path, - Scheme: endpoint.Scheme, - TLSConfig: endpoint.TLSConfig.DeepCopy(), - BasicAuth: endpoint.BasicAuth.DeepCopy(), - BearerTokenFile: endpoint.BearerTokenFile, - BearerTokenSecret: endpoint.BearerTokenSecret.DeepCopy(), - Period: string(endpoint.Interval), - ProxyURL: proxyURL, - Timeout: string(endpoint.ScrapeTimeout), - ExtraLabels: specLabels, - ForwardLocalhost: kits.CheckIfForwardLocalhost(serviceMonitor.Annotations), - DisableCustomTimestamp: !ifHonorTimestamps(endpoint.HonorTimestamps), - System: systemResource, - UrlValues: endpoint.Params, - MetricRelabelConfigs: metricRelabelings, + Client: c.client, + RelabelRule: serviceMonitor.Annotations[annotationRelabelRule], + RelabelIndex: serviceMonitor.Annotations[annotationRelabelIndex], + AnnotationMatchSelector: parseSelector(serviceMonitor.Annotations[annotationMonitorMatchSelector]), + AnnotationDropSelector: parseSelector(serviceMonitor.Annotations[annotationMonitorDropSelector]), + Name: monitorMeta.ID(), + DataID: dataID, + KubeConfig: ConfKubeConfig, + Namespaces: namespaces, + Relabels: resultLabels, + Path: endpoint.Path, + Scheme: endpoint.Scheme, + TLSConfig: endpoint.TLSConfig.DeepCopy(), + BasicAuth: endpoint.BasicAuth.DeepCopy(), + BearerTokenFile: endpoint.BearerTokenFile, + BearerTokenSecret: endpoint.BearerTokenSecret.DeepCopy(), + Period: string(endpoint.Interval), + ProxyURL: proxyURL, + Timeout: string(endpoint.ScrapeTimeout), + ExtraLabels: specLabels, + ForwardLocalhost: kits.CheckIfForwardLocalhost(serviceMonitor.Annotations), + DisableCustomTimestamp: !ifHonorTimestamps(endpoint.HonorTimestamps), + System: systemResource, + UrlValues: endpoint.Params, + MetricRelabelConfigs: metricRelabelings, }, }) @@ -748,28 +767,30 @@ func (c *Operator) createPodMonitorDiscovers(podMonitor *promv1.PodMonitor) []di } podDiscover := discover.NewPodDiscover(c.ctx, monitorMeta, c.objectsController.NodeNameExists, &discover.PodParams{ BaseParams: &discover.BaseParams{ - Client: c.client, - RelabelRule: podMonitor.Annotations[relabelRuleKey], - RelabelIndex: podMonitor.Annotations[relabelIndexKey], - Name: monitorMeta.ID(), - DataID: dataID, - KubeConfig: ConfKubeConfig, - Namespaces: namespaces, - Relabels: resultLabels, - Path: endpoint.Path, - Scheme: endpoint.Scheme, - BasicAuth: endpoint.BasicAuth.DeepCopy(), - BearerTokenSecret: endpoint.BearerTokenSecret.DeepCopy(), - TLSConfig: &promv1.TLSConfig{SafeTLSConfig: safeTlsConfig}, - Period: string(endpoint.Interval), - Timeout: string(endpoint.ScrapeTimeout), - ProxyURL: proxyURL, - ExtraLabels: specLabels, - ForwardLocalhost: kits.CheckIfForwardLocalhost(podMonitor.Annotations), - DisableCustomTimestamp: !ifHonorTimestamps(endpoint.HonorTimestamps), - System: systemResource, - UrlValues: endpoint.Params, - MetricRelabelConfigs: metricRelabelings, + Client: c.client, + RelabelRule: podMonitor.Annotations[annotationRelabelRule], + RelabelIndex: podMonitor.Annotations[annotationRelabelIndex], + AnnotationMatchSelector: parseSelector(podMonitor.Annotations[annotationMonitorMatchSelector]), + AnnotationDropSelector: parseSelector(podMonitor.Annotations[annotationMonitorDropSelector]), + Name: monitorMeta.ID(), + DataID: dataID, + KubeConfig: ConfKubeConfig, + Namespaces: namespaces, + Relabels: resultLabels, + Path: endpoint.Path, + Scheme: endpoint.Scheme, + BasicAuth: endpoint.BasicAuth.DeepCopy(), + BearerTokenSecret: endpoint.BearerTokenSecret.DeepCopy(), + TLSConfig: &promv1.TLSConfig{SafeTLSConfig: safeTlsConfig}, + Period: string(endpoint.Interval), + Timeout: string(endpoint.ScrapeTimeout), + ProxyURL: proxyURL, + ExtraLabels: specLabels, + ForwardLocalhost: kits.CheckIfForwardLocalhost(podMonitor.Annotations), + DisableCustomTimestamp: !ifHonorTimestamps(endpoint.HonorTimestamps), + System: systemResource, + UrlValues: endpoint.Params, + MetricRelabelConfigs: metricRelabelings, }, TLSConfig: endpoint.TLSConfig, }) diff --git a/pkg/operator/operator/operator_test.go b/pkg/operator/operator/operator_test.go index deaf0d264..0e589484d 100644 --- a/pkg/operator/operator/operator_test.go +++ b/pkg/operator/operator/operator_test.go @@ -14,6 +14,7 @@ import ( "testing" "github.com/kylelemons/godebug/pretty" + "github.com/stretchr/testify/assert" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -99,3 +100,35 @@ func TestGetNodeAddresses(t *testing.T) { }) } } + +func TestParseSelector(t *testing.T) { + cases := []struct { + input string + output map[string]string + }{ + { + input: "__meta_kubernetes_endpoint_address_target_name=^eklet-.*,__meta_kubernetes_endpoint_address_target_kind=Node", + output: map[string]string{ + "__meta_kubernetes_endpoint_address_target_name": "^eklet-.*", + "__meta_kubernetes_endpoint_address_target_kind": "Node", + }, + }, + { + input: "__meta_kubernetes_endpoint_address_target_name=^eklet-.*,,", + output: map[string]string{ + "__meta_kubernetes_endpoint_address_target_name": "^eklet-.*", + }, + }, + { + input: "foo=bar, , ,k1=v1 ", + output: map[string]string{ + "foo": "bar", + "k1": "v1", + }, + }, + } + + for _, c := range cases { + assert.Equal(t, c.output, parseSelector(c.input)) + } +}