From f78c8eb1c63e04debc5faaaf2813dbc11d2c0ec4 Mon Sep 17 00:00:00 2001 From: Julian van den Berkmortel Date: Tue, 16 Nov 2021 08:52:07 +0100 Subject: [PATCH] Add CompositeFamilyGeneratorFilter struct for combining multiple filters --- main.go | 6 +++++- main_test.go | 10 +++++++--- pkg/allowdenylist/allowdenylist.go | 3 ++- pkg/builder/builder.go | 1 + pkg/builder/builder_test.go | 4 +--- pkg/metric_generator/filter.go | 23 ++++++++++++++++++++++- 6 files changed, 38 insertions(+), 9 deletions(-) diff --git a/main.go b/main.go index 65ba55e3..3b52b76f 100644 --- a/main.go +++ b/main.go @@ -26,6 +26,8 @@ import ( "strconv" "time" + generator "k8s.io/kube-state-metrics/v2/pkg/metric_generator" + "github.com/oklog/run" "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" @@ -130,7 +132,9 @@ func main() { klog.Infof("metric allow-denylisting: %v", allowDenyList.Status()) - storeBuilder.WithFamilyGeneratorFilter(allowDenyList) + storeBuilder.WithFamilyGeneratorFilter(generator.NewCompositeFamilyGeneratorFilter( + allowDenyList, + )) storeBuilder.WithGenerateStoresFunc(storeBuilder.DefaultGenerateStoresFunc(), opts.UseAPIServerCache) diff --git a/main_test.go b/main_test.go index 1661475b..fc21c38c 100644 --- a/main_test.go +++ b/main_test.go @@ -28,6 +28,8 @@ import ( "testing" "time" + generator "k8s.io/kube-state-metrics/v2/pkg/metric_generator" + "github.com/prometheus/client_golang/prometheus" v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" @@ -69,12 +71,14 @@ func BenchmarkKubeStateMetrics(b *testing.B) { builder.WithNamespaces(options.DefaultNamespaces, "") builder.WithGenerateStoresFunc(builder.DefaultGenerateStoresFunc(), false) - // TODO: replace with a generic family generator filter which composes both the AllowDenyList and OptInList - l, err := allowdenylist.New(map[string]struct{}{}, map[string]struct{}{}) + allowDenyListFilter, err := allowdenylist.New(map[string]struct{}{}, map[string]struct{}{}) if err != nil { b.Fatal(err) } - builder.WithFamilyGeneratorFilter(l) + + builder.WithFamilyGeneratorFilter(generator.NewCompositeFamilyGeneratorFilter( + allowDenyListFilter, + )) builder.WithAllowAnnotations(map[string][]string{}) builder.WithAllowLabels(map[string][]string{}) diff --git a/pkg/allowdenylist/allowdenylist.go b/pkg/allowdenylist/allowdenylist.go index 312363f8..27188018 100644 --- a/pkg/allowdenylist/allowdenylist.go +++ b/pkg/allowdenylist/allowdenylist.go @@ -17,10 +17,11 @@ limitations under the License. package allowdenylist import ( - generator "k8s.io/kube-state-metrics/v2/pkg/metric_generator" "regexp" "strings" + generator "k8s.io/kube-state-metrics/v2/pkg/metric_generator" + "github.com/pkg/errors" ) diff --git a/pkg/builder/builder.go b/pkg/builder/builder.go index 2a7d0833..cd28bf1a 100644 --- a/pkg/builder/builder.go +++ b/pkg/builder/builder.go @@ -18,6 +18,7 @@ package builder import ( "context" + generator "k8s.io/kube-state-metrics/v2/pkg/metric_generator" "github.com/prometheus/client_golang/prometheus" diff --git a/pkg/builder/builder_test.go b/pkg/builder/builder_test.go index 69e9836d..9b420d47 100644 --- a/pkg/builder/builder_test.go +++ b/pkg/builder/builder_test.go @@ -23,7 +23,6 @@ import ( clientset "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/cache" - "k8s.io/kube-state-metrics/v2/pkg/allowdenylist" "k8s.io/kube-state-metrics/v2/pkg/builder" generator "k8s.io/kube-state-metrics/v2/pkg/metric_generator" ) @@ -40,8 +39,7 @@ var ( // This test case ensures we don't break compatibility for external consumers. func TestBuilderWithCustomStore(t *testing.T) { b := builder.NewBuilder() - // TODO: replace with a generic family generator filter which composes both the AllowDenyList and OptInList - b.WithFamilyGeneratorFilter(&allowdenylist.AllowDenyList{}) + b.WithFamilyGeneratorFilter(generator.NewCompositeFamilyGeneratorFilter()) b.WithEnabledResources([]string{"pods"}) b.WithGenerateStoresFunc(customStore) diff --git a/pkg/metric_generator/filter.go b/pkg/metric_generator/filter.go index 630f8f25..10a5636a 100644 --- a/pkg/metric_generator/filter.go +++ b/pkg/metric_generator/filter.go @@ -25,6 +25,22 @@ type FamilyGeneratorFilter interface { Test(generator FamilyGenerator) bool } +// CompositeFamilyGeneratorFilter is composite for combining multiple filters +type CompositeFamilyGeneratorFilter struct { + filters []FamilyGeneratorFilter +} + +// Test tests the generator by passing it through the filters contained within the composite +// and return false if the generator does not match all the filters +func (composite CompositeFamilyGeneratorFilter) Test(generator FamilyGenerator) bool { + for _, filter := range composite.filters { + if !filter.Test(generator) { + return false + } + } + return true +} + // FilterFamilyGenerators filters a given slice of family generators based upon a given filter // and returns a slice containing the family generators which passed the filter criteria func FilterFamilyGenerators(filter FamilyGeneratorFilter, families []FamilyGenerator) []FamilyGenerator { @@ -37,4 +53,9 @@ func FilterFamilyGenerators(filter FamilyGeneratorFilter, families []FamilyGener } return filtered -} \ No newline at end of file +} + +// NewCompositeFamilyGeneratorFilter combines multiple family generators filters into one composite filter +func NewCompositeFamilyGeneratorFilter(filters ...FamilyGeneratorFilter) CompositeFamilyGeneratorFilter { + return CompositeFamilyGeneratorFilter{filters} +}