Merge pull request #128100 from yongruilin/fix-allow-label

refactor: Defer metrics label value allow list initialization
This commit is contained in:
Kubernetes Prow Robot
2024-10-17 18:23:18 +01:00
committed by GitHub
11 changed files with 155 additions and 79 deletions

View File

@@ -137,11 +137,6 @@ func NewCounterVec(opts *CounterOpts, labels []string) *CounterVec {
opts.StabilityLevel.setDefaults() opts.StabilityLevel.setDefaults()
fqName := BuildFQName(opts.Namespace, opts.Subsystem, opts.Name) fqName := BuildFQName(opts.Namespace, opts.Subsystem, opts.Name)
allowListLock.RLock()
if allowList, ok := labelValueAllowLists[fqName]; ok {
opts.LabelValueAllowLists = allowList
}
allowListLock.RUnlock()
cv := &CounterVec{ cv := &CounterVec{
CounterVec: noopCounterVec, CounterVec: noopCounterVec,
@@ -194,7 +189,17 @@ func (v *CounterVec) WithLabelValues(lvs ...string) CounterMetric {
} }
if v.LabelValueAllowLists != nil { if v.LabelValueAllowLists != nil {
v.LabelValueAllowLists.ConstrainToAllowedList(v.originalLabels, lvs) v.LabelValueAllowLists.ConstrainToAllowedList(v.originalLabels, lvs)
} else {
v.initializeLabelAllowListsOnce.Do(func() {
allowListLock.RLock()
if allowList, ok := labelValueAllowLists[v.FQName()]; ok {
v.LabelValueAllowLists = allowList
allowList.ConstrainToAllowedList(v.originalLabels, lvs)
} }
allowListLock.RUnlock()
})
}
return v.CounterVec.WithLabelValues(lvs...) return v.CounterVec.WithLabelValues(lvs...)
} }
@@ -208,6 +213,15 @@ func (v *CounterVec) With(labels map[string]string) CounterMetric {
} }
if v.LabelValueAllowLists != nil { if v.LabelValueAllowLists != nil {
v.LabelValueAllowLists.ConstrainLabelMap(labels) v.LabelValueAllowLists.ConstrainLabelMap(labels)
} else {
v.initializeLabelAllowListsOnce.Do(func() {
allowListLock.RLock()
if allowList, ok := labelValueAllowLists[v.FQName()]; ok {
v.LabelValueAllowLists = allowList
allowList.ConstrainLabelMap(labels)
}
allowListLock.RUnlock()
})
} }
return v.CounterVec.With(labels) return v.CounterVec.With(labels)
} }

View File

@@ -248,7 +248,8 @@ func TestCounterWithLabelValueAllowList(t *testing.T) {
for _, test := range tests { for _, test := range tests {
t.Run(test.desc, func(t *testing.T) { t.Run(test.desc, func(t *testing.T) {
SetLabelAllowListFromCLI(labelAllowValues) labelValueAllowLists = map[string]*MetricLabelAllowList{}
registry := newKubeRegistry(apimachineryversion.Info{ registry := newKubeRegistry(apimachineryversion.Info{
Major: "1", Major: "1",
Minor: "15", Minor: "15",
@@ -256,7 +257,7 @@ func TestCounterWithLabelValueAllowList(t *testing.T) {
}) })
c := NewCounterVec(opts, labels) c := NewCounterVec(opts, labels)
registry.MustRegister(c) registry.MustRegister(c)
SetLabelAllowListFromCLI(labelAllowValues)
for _, lv := range test.labelValues { for _, lv := range test.labelValues {
c.WithLabelValues(lv...).Inc() c.WithLabelValues(lv...).Inc()
} }

View File

@@ -105,11 +105,6 @@ func NewGaugeVec(opts *GaugeOpts, labels []string) *GaugeVec {
opts.StabilityLevel.setDefaults() opts.StabilityLevel.setDefaults()
fqName := BuildFQName(opts.Namespace, opts.Subsystem, opts.Name) fqName := BuildFQName(opts.Namespace, opts.Subsystem, opts.Name)
allowListLock.RLock()
if allowList, ok := labelValueAllowLists[fqName]; ok {
opts.LabelValueAllowLists = allowList
}
allowListLock.RUnlock()
cv := &GaugeVec{ cv := &GaugeVec{
GaugeVec: noopGaugeVec, GaugeVec: noopGaugeVec,
@@ -149,6 +144,15 @@ func (v *GaugeVec) WithLabelValuesChecked(lvs ...string) (GaugeMetric, error) {
} }
if v.LabelValueAllowLists != nil { if v.LabelValueAllowLists != nil {
v.LabelValueAllowLists.ConstrainToAllowedList(v.originalLabels, lvs) v.LabelValueAllowLists.ConstrainToAllowedList(v.originalLabels, lvs)
} else {
v.initializeLabelAllowListsOnce.Do(func() {
allowListLock.RLock()
if allowList, ok := labelValueAllowLists[v.FQName()]; ok {
v.LabelValueAllowLists = allowList
allowList.ConstrainToAllowedList(v.originalLabels, lvs)
}
allowListLock.RUnlock()
})
} }
elt, err := v.GaugeVec.GetMetricWithLabelValues(lvs...) elt, err := v.GaugeVec.GetMetricWithLabelValues(lvs...)
return elt, err return elt, err
@@ -186,6 +190,15 @@ func (v *GaugeVec) WithChecked(labels map[string]string) (GaugeMetric, error) {
} }
if v.LabelValueAllowLists != nil { if v.LabelValueAllowLists != nil {
v.LabelValueAllowLists.ConstrainLabelMap(labels) v.LabelValueAllowLists.ConstrainLabelMap(labels)
} else {
v.initializeLabelAllowListsOnce.Do(func() {
allowListLock.RLock()
if allowList, ok := labelValueAllowLists[v.FQName()]; ok {
v.LabelValueAllowLists = allowList
allowList.ConstrainLabelMap(labels)
}
allowListLock.RUnlock()
})
} }
elt, err := v.GaugeVec.GetMetricWith(labels) elt, err := v.GaugeVec.GetMetricWith(labels)
return elt, err return elt, err

View File

@@ -305,7 +305,8 @@ func TestGaugeWithLabelValueAllowList(t *testing.T) {
for _, test := range tests { for _, test := range tests {
t.Run(test.desc, func(t *testing.T) { t.Run(test.desc, func(t *testing.T) {
SetLabelAllowListFromCLI(labelAllowValues) labelValueAllowLists = map[string]*MetricLabelAllowList{}
registry := newKubeRegistry(apimachineryversion.Info{ registry := newKubeRegistry(apimachineryversion.Info{
Major: "1", Major: "1",
Minor: "15", Minor: "15",
@@ -313,7 +314,7 @@ func TestGaugeWithLabelValueAllowList(t *testing.T) {
}) })
g := NewGaugeVec(opts, labels) g := NewGaugeVec(opts, labels)
registry.MustRegister(g) registry.MustRegister(g)
SetLabelAllowListFromCLI(labelAllowValues)
for _, lv := range test.labelValues { for _, lv := range test.labelValues {
g.WithLabelValues(lv...).Set(100.0) g.WithLabelValues(lv...).Set(100.0)
} }

View File

@@ -96,11 +96,6 @@ func NewHistogramVec(opts *HistogramOpts, labels []string) *HistogramVec {
opts.StabilityLevel.setDefaults() opts.StabilityLevel.setDefaults()
fqName := BuildFQName(opts.Namespace, opts.Subsystem, opts.Name) fqName := BuildFQName(opts.Namespace, opts.Subsystem, opts.Name)
allowListLock.RLock()
if allowList, ok := labelValueAllowLists[fqName]; ok {
opts.LabelValueAllowLists = allowList
}
allowListLock.RUnlock()
v := &HistogramVec{ v := &HistogramVec{
HistogramVec: noopHistogramVec, HistogramVec: noopHistogramVec,
@@ -148,6 +143,15 @@ func (v *HistogramVec) WithLabelValues(lvs ...string) ObserverMetric {
} }
if v.LabelValueAllowLists != nil { if v.LabelValueAllowLists != nil {
v.LabelValueAllowLists.ConstrainToAllowedList(v.originalLabels, lvs) v.LabelValueAllowLists.ConstrainToAllowedList(v.originalLabels, lvs)
} else {
v.initializeLabelAllowListsOnce.Do(func() {
allowListLock.RLock()
if allowList, ok := labelValueAllowLists[v.FQName()]; ok {
v.LabelValueAllowLists = allowList
allowList.ConstrainToAllowedList(v.originalLabels, lvs)
}
allowListLock.RUnlock()
})
} }
return v.HistogramVec.WithLabelValues(lvs...) return v.HistogramVec.WithLabelValues(lvs...)
} }
@@ -162,6 +166,15 @@ func (v *HistogramVec) With(labels map[string]string) ObserverMetric {
} }
if v.LabelValueAllowLists != nil { if v.LabelValueAllowLists != nil {
v.LabelValueAllowLists.ConstrainLabelMap(labels) v.LabelValueAllowLists.ConstrainLabelMap(labels)
} else {
v.initializeLabelAllowListsOnce.Do(func() {
allowListLock.RLock()
if allowList, ok := labelValueAllowLists[v.FQName()]; ok {
v.LabelValueAllowLists = allowList
allowList.ConstrainLabelMap(labels)
}
allowListLock.RUnlock()
})
} }
return v.HistogramVec.With(labels) return v.HistogramVec.With(labels)
} }

View File

@@ -271,7 +271,7 @@ func TestHistogramWithLabelValueAllowList(t *testing.T) {
for _, test := range tests { for _, test := range tests {
t.Run(test.desc, func(t *testing.T) { t.Run(test.desc, func(t *testing.T) {
SetLabelAllowListFromCLI(labelAllowValues) labelValueAllowLists = map[string]*MetricLabelAllowList{}
registry := newKubeRegistry(apimachineryversion.Info{ registry := newKubeRegistry(apimachineryversion.Info{
Major: "1", Major: "1",
Minor: "15", Minor: "15",
@@ -279,6 +279,7 @@ func TestHistogramWithLabelValueAllowList(t *testing.T) {
}) })
c := NewHistogramVec(opts, labels) c := NewHistogramVec(opts, labels)
registry.MustRegister(c) registry.MustRegister(c)
SetLabelAllowListFromCLI(labelAllowValues)
for _, lv := range test.labelValues { for _, lv := range test.labelValues {
c.WithLabelValues(lv...).Observe(1.0) c.WithLabelValues(lv...).Observe(1.0)

View File

@@ -53,6 +53,7 @@ type KubeOpts struct {
deprecateOnce sync.Once deprecateOnce sync.Once
annotateOnce sync.Once annotateOnce sync.Once
StabilityLevel StabilityLevel StabilityLevel StabilityLevel
initializeLabelAllowListsOnce sync.Once
LabelValueAllowLists *MetricLabelAllowList LabelValueAllowLists *MetricLabelAllowList
} }
@@ -170,6 +171,7 @@ type HistogramOpts struct {
deprecateOnce sync.Once deprecateOnce sync.Once
annotateOnce sync.Once annotateOnce sync.Once
StabilityLevel StabilityLevel StabilityLevel StabilityLevel
initializeLabelAllowListsOnce sync.Once
LabelValueAllowLists *MetricLabelAllowList LabelValueAllowLists *MetricLabelAllowList
} }
@@ -217,6 +219,7 @@ type TimingHistogramOpts struct {
deprecateOnce sync.Once deprecateOnce sync.Once
annotateOnce sync.Once annotateOnce sync.Once
StabilityLevel StabilityLevel StabilityLevel StabilityLevel
initializeLabelAllowListsOnce sync.Once
LabelValueAllowLists *MetricLabelAllowList LabelValueAllowLists *MetricLabelAllowList
} }
@@ -268,6 +271,7 @@ type SummaryOpts struct {
deprecateOnce sync.Once deprecateOnce sync.Once
annotateOnce sync.Once annotateOnce sync.Once
StabilityLevel StabilityLevel StabilityLevel StabilityLevel
initializeLabelAllowListsOnce sync.Once
LabelValueAllowLists *MetricLabelAllowList LabelValueAllowLists *MetricLabelAllowList
} }

View File

@@ -109,11 +109,6 @@ func NewSummaryVec(opts *SummaryOpts, labels []string) *SummaryVec {
opts.StabilityLevel.setDefaults() opts.StabilityLevel.setDefaults()
fqName := BuildFQName(opts.Namespace, opts.Subsystem, opts.Name) fqName := BuildFQName(opts.Namespace, opts.Subsystem, opts.Name)
allowListLock.RLock()
if allowList, ok := labelValueAllowLists[fqName]; ok {
opts.LabelValueAllowLists = allowList
}
allowListLock.RUnlock()
v := &SummaryVec{ v := &SummaryVec{
SummaryOpts: opts, SummaryOpts: opts,
@@ -160,6 +155,15 @@ func (v *SummaryVec) WithLabelValues(lvs ...string) ObserverMetric {
} }
if v.LabelValueAllowLists != nil { if v.LabelValueAllowLists != nil {
v.LabelValueAllowLists.ConstrainToAllowedList(v.originalLabels, lvs) v.LabelValueAllowLists.ConstrainToAllowedList(v.originalLabels, lvs)
} else {
v.initializeLabelAllowListsOnce.Do(func() {
allowListLock.RLock()
if allowList, ok := labelValueAllowLists[v.FQName()]; ok {
v.LabelValueAllowLists = allowList
allowList.ConstrainToAllowedList(v.originalLabels, lvs)
}
allowListLock.RUnlock()
})
} }
return v.SummaryVec.WithLabelValues(lvs...) return v.SummaryVec.WithLabelValues(lvs...)
} }
@@ -174,6 +178,15 @@ func (v *SummaryVec) With(labels map[string]string) ObserverMetric {
} }
if v.LabelValueAllowLists != nil { if v.LabelValueAllowLists != nil {
v.LabelValueAllowLists.ConstrainLabelMap(labels) v.LabelValueAllowLists.ConstrainLabelMap(labels)
} else {
v.initializeLabelAllowListsOnce.Do(func() {
allowListLock.RLock()
if allowList, ok := labelValueAllowLists[v.FQName()]; ok {
v.LabelValueAllowLists = allowList
allowList.ConstrainLabelMap(labels)
}
allowListLock.RUnlock()
})
} }
return v.SummaryVec.With(labels) return v.SummaryVec.With(labels)
} }

View File

@@ -235,7 +235,7 @@ func TestSummaryWithLabelValueAllowList(t *testing.T) {
for _, test := range tests { for _, test := range tests {
t.Run(test.desc, func(t *testing.T) { t.Run(test.desc, func(t *testing.T) {
SetLabelAllowListFromCLI(labelAllowValues) labelValueAllowLists = map[string]*MetricLabelAllowList{}
registry := newKubeRegistry(apimachineryversion.Info{ registry := newKubeRegistry(apimachineryversion.Info{
Major: "1", Major: "1",
Minor: "15", Minor: "15",
@@ -243,6 +243,7 @@ func TestSummaryWithLabelValueAllowList(t *testing.T) {
}) })
c := NewSummaryVec(opts, labels) c := NewSummaryVec(opts, labels)
registry.MustRegister(c) registry.MustRegister(c)
SetLabelAllowListFromCLI(labelAllowValues)
for _, lv := range test.labelValues { for _, lv := range test.labelValues {
c.WithLabelValues(lv...).Observe(1.0) c.WithLabelValues(lv...).Observe(1.0)

View File

@@ -125,11 +125,6 @@ func NewTestableTimingHistogramVec(nowFunc func() time.Time, opts *TimingHistogr
opts.StabilityLevel.setDefaults() opts.StabilityLevel.setDefaults()
fqName := BuildFQName(opts.Namespace, opts.Subsystem, opts.Name) fqName := BuildFQName(opts.Namespace, opts.Subsystem, opts.Name)
allowListLock.RLock()
if allowList, ok := labelValueAllowLists[fqName]; ok {
opts.LabelValueAllowLists = allowList
}
allowListLock.RUnlock()
v := &TimingHistogramVec{ v := &TimingHistogramVec{
TimingHistogramVec: noopTimingHistogramVec, TimingHistogramVec: noopTimingHistogramVec,
@@ -175,6 +170,15 @@ func (v *TimingHistogramVec) WithLabelValuesChecked(lvs ...string) (GaugeMetric,
} }
if v.LabelValueAllowLists != nil { if v.LabelValueAllowLists != nil {
v.LabelValueAllowLists.ConstrainToAllowedList(v.originalLabels, lvs) v.LabelValueAllowLists.ConstrainToAllowedList(v.originalLabels, lvs)
} else {
v.initializeLabelAllowListsOnce.Do(func() {
allowListLock.RLock()
if allowList, ok := labelValueAllowLists[v.FQName()]; ok {
v.LabelValueAllowLists = allowList
allowList.ConstrainToAllowedList(v.originalLabels, lvs)
}
allowListLock.RUnlock()
})
} }
ops, err := v.TimingHistogramVec.GetMetricWithLabelValues(lvs...) ops, err := v.TimingHistogramVec.GetMetricWithLabelValues(lvs...)
if err != nil { if err != nil {
@@ -214,6 +218,15 @@ func (v *TimingHistogramVec) WithChecked(labels map[string]string) (GaugeMetric,
} }
if v.LabelValueAllowLists != nil { if v.LabelValueAllowLists != nil {
v.LabelValueAllowLists.ConstrainLabelMap(labels) v.LabelValueAllowLists.ConstrainLabelMap(labels)
} else {
v.initializeLabelAllowListsOnce.Do(func() {
allowListLock.RLock()
if allowList, ok := labelValueAllowLists[v.FQName()]; ok {
v.LabelValueAllowLists = allowList
allowList.ConstrainLabelMap(labels)
}
allowListLock.RUnlock()
})
} }
ops, err := v.TimingHistogramVec.GetMetricWith(labels) ops, err := v.TimingHistogramVec.GetMetricWith(labels)
return ops.(GaugeMetric), err return ops.(GaugeMetric), err

View File

@@ -313,7 +313,8 @@ func TestTimingHistogramWithLabelValueAllowList(t *testing.T) {
for _, test := range tests { for _, test := range tests {
t.Run(test.desc, func(t *testing.T) { t.Run(test.desc, func(t *testing.T) {
SetLabelAllowListFromCLI(labelAllowValues) labelValueAllowLists = map[string]*MetricLabelAllowList{}
registry := newKubeRegistry(apimachineryversion.Info{ registry := newKubeRegistry(apimachineryversion.Info{
Major: "1", Major: "1",
Minor: "15", Minor: "15",
@@ -323,6 +324,7 @@ func TestTimingHistogramWithLabelValueAllowList(t *testing.T) {
clk := testclock.NewFakePassiveClock(t0) clk := testclock.NewFakePassiveClock(t0)
c := NewTestableTimingHistogramVec(clk.Now, opts, labels) c := NewTestableTimingHistogramVec(clk.Now, opts, labels)
registry.MustRegister(c) registry.MustRegister(c)
SetLabelAllowListFromCLI(labelAllowValues)
var v0 float64 = 13 var v0 float64 = 13
for _, lv := range test.labelValues { for _, lv := range test.labelValues {
c.WithLabelValues(lv...).Set(v0) c.WithLabelValues(lv...).Set(v0)