Skip to content

Commit 0ac74ed

Browse files
authored
Merge pull request kubernetes#128012 from yongruilin/fix-allow-metrics
fix: Remove unnecessary lock in metrics parsing allow-list manifest
2 parents a4c262b + c9979e6 commit 0ac74ed

File tree

2 files changed

+77
-9
lines changed

2 files changed

+77
-9
lines changed

staging/src/k8s.io/component-base/metrics/opts.go

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ func (o *SummaryOpts) toPromSummaryOpts() prometheus.SummaryOpts {
315315
}
316316

317317
type MetricLabelAllowList struct {
318-
labelToAllowList map[string]sets.String
318+
labelToAllowList map[string]sets.Set[string]
319319
}
320320

321321
func (allowList *MetricLabelAllowList) ConstrainToAllowedList(labelNameList, labelValueList []string) {
@@ -347,13 +347,13 @@ func SetLabelAllowListFromCLI(allowListMapping map[string]string) {
347347
for metricLabelName, labelValues := range allowListMapping {
348348
metricName := strings.Split(metricLabelName, ",")[0]
349349
labelName := strings.Split(metricLabelName, ",")[1]
350-
valueSet := sets.NewString(strings.Split(labelValues, ",")...)
350+
valueSet := sets.New[string](strings.Split(labelValues, ",")...)
351351

352352
allowList, ok := labelValueAllowLists[metricName]
353353
if ok {
354354
allowList.labelToAllowList[labelName] = valueSet
355355
} else {
356-
labelToAllowList := make(map[string]sets.String)
356+
labelToAllowList := make(map[string]sets.Set[string])
357357
labelToAllowList[labelName] = valueSet
358358
labelValueAllowLists[metricName] = &MetricLabelAllowList{
359359
labelToAllowList,
@@ -363,8 +363,6 @@ func SetLabelAllowListFromCLI(allowListMapping map[string]string) {
363363
}
364364

365365
func SetLabelAllowListFromManifest(manifest string) {
366-
allowListLock.Lock()
367-
defer allowListLock.Unlock()
368366
allowListMapping := make(map[string]string)
369367
data, err := os.ReadFile(filepath.Clean(manifest))
370368
if err != nil {

staging/src/k8s.io/component-base/metrics/opts_test.go

Lines changed: 74 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package metrics
1818

1919
import (
20+
"os"
2021
"reflect"
2122
"testing"
2223

@@ -64,8 +65,8 @@ func TestDefaultStabilityLevel(t *testing.T) {
6465

6566
func TestConstrainToAllowedList(t *testing.T) {
6667
allowList := &MetricLabelAllowList{
67-
labelToAllowList: map[string]sets.String{
68-
"label_a": sets.NewString("allow_value1", "allow_value2"),
68+
labelToAllowList: map[string]sets.Set[string]{
69+
"label_a": sets.New[string]("allow_value1", "allow_value2"),
6970
},
7071
}
7172
labelNameList := []string{"label_a", "label_b"}
@@ -97,8 +98,8 @@ func TestConstrainToAllowedList(t *testing.T) {
9798

9899
func TestConstrainLabelMap(t *testing.T) {
99100
allowList := &MetricLabelAllowList{
100-
labelToAllowList: map[string]sets.String{
101-
"label_a": sets.NewString("allow_value1", "allow_value2"),
101+
labelToAllowList: map[string]sets.Set[string]{
102+
"label_a": sets.New[string]("allow_value1", "allow_value2"),
102103
},
103104
}
104105
var tests = []struct {
@@ -138,3 +139,72 @@ func TestConstrainLabelMap(t *testing.T) {
138139
})
139140
}
140141
}
142+
143+
func TestSetLabelAllowListFromManifest(t *testing.T) {
144+
tests := []struct {
145+
name string
146+
manifest string
147+
manifestExist bool
148+
expectlabelValueAllowLists map[string]*MetricLabelAllowList
149+
}{
150+
{
151+
name: "successfully parse manifest",
152+
manifestExist: true,
153+
manifest: `metric1,label1: v1,v2
154+
metric2,label2: v3`,
155+
expectlabelValueAllowLists: map[string]*MetricLabelAllowList{
156+
"metric1": {
157+
labelToAllowList: map[string]sets.Set[string]{
158+
"label1": sets.New[string]("v1", "v2"),
159+
},
160+
},
161+
"metric2": {
162+
labelToAllowList: map[string]sets.Set[string]{
163+
"label2": sets.New[string]("v3"),
164+
},
165+
},
166+
},
167+
},
168+
{
169+
name: "failed to read manifest file",
170+
manifestExist: false,
171+
expectlabelValueAllowLists: map[string]*MetricLabelAllowList{},
172+
},
173+
{
174+
name: "failed to parse manifest",
175+
manifestExist: true,
176+
manifest: `allow-list:
177+
- metric1,label1:v1
178+
- metric2,label2:v2,v3`,
179+
expectlabelValueAllowLists: map[string]*MetricLabelAllowList{},
180+
},
181+
}
182+
183+
for _, tc := range tests {
184+
t.Run(tc.name, func(t *testing.T) {
185+
labelValueAllowLists = map[string]*MetricLabelAllowList{}
186+
manifestFilePath := "/non-existent-file.yaml"
187+
if tc.manifestExist {
188+
tempFile, err := os.CreateTemp("", "allow-list-test")
189+
if err != nil {
190+
t.Fatalf("failed to create temp file: %v", err)
191+
}
192+
defer func() {
193+
if err := os.Remove(tempFile.Name()); err != nil {
194+
t.Errorf("failed to remove temp file: %v", err)
195+
}
196+
}()
197+
198+
if _, err := tempFile.WriteString(tc.manifest); err != nil {
199+
t.Fatalf("failed to write to temp file: %v", err)
200+
}
201+
manifestFilePath = tempFile.Name()
202+
}
203+
204+
SetLabelAllowListFromManifest(manifestFilePath)
205+
if !reflect.DeepEqual(labelValueAllowLists, tc.expectlabelValueAllowLists) {
206+
t.Errorf("labelValueAllowLists = %+v, want %+v", labelValueAllowLists, tc.expectlabelValueAllowLists)
207+
}
208+
})
209+
}
210+
}

0 commit comments

Comments
 (0)