@@ -20,8 +20,6 @@ import (
20
20
"sync"
21
21
22
22
"k8s.io/apimachinery/pkg/api/meta"
23
- "k8s.io/apimachinery/pkg/types"
24
-
25
23
"k8s.io/kube-state-metrics/v2/pkg/metric"
26
24
)
27
25
@@ -33,7 +31,7 @@ type MetricsStore struct {
33
31
// metric families, containing a slice of metrics. We need to keep metrics
34
32
// grouped by metric families in order to zip families with their help text in
35
33
// MetricsStore.WriteAll().
36
- metrics map [types. UID ][][] byte
34
+ metrics sync. Map
37
35
38
36
// generateMetricsFunc generates metrics based on a given Kubernetes object
39
37
// and returns them grouped by metric family.
@@ -42,17 +40,14 @@ type MetricsStore struct {
42
40
// later on zipped with with their corresponding metric families in
43
41
// MetricStore.WriteAll().
44
42
headers []string
45
-
46
- // Protects metrics
47
- mutex sync.RWMutex
48
43
}
49
44
50
45
// NewMetricsStore returns a new MetricsStore
51
46
func NewMetricsStore (headers []string , generateFunc func (interface {}) []metric.FamilyInterface ) * MetricsStore {
52
47
return & MetricsStore {
53
48
generateMetricsFunc : generateFunc ,
54
49
headers : headers ,
55
- metrics : map [types. UID ][][] byte {},
50
+ metrics : sync. Map {},
56
51
}
57
52
}
58
53
@@ -66,17 +61,14 @@ func (s *MetricsStore) Add(obj interface{}) error {
66
61
return err
67
62
}
68
63
69
- s .mutex .Lock ()
70
- defer s .mutex .Unlock ()
71
-
72
64
families := s .generateMetricsFunc (obj )
73
65
familyStrings := make ([][]byte , len (families ))
74
66
75
67
for i , f := range families {
76
68
familyStrings [i ] = f .ByteSlice ()
77
69
}
78
70
79
- s .metrics [ o .GetUID ()] = familyStrings
71
+ s .metrics . Store ( o .GetUID (), familyStrings )
80
72
81
73
return nil
82
74
}
@@ -95,10 +87,7 @@ func (s *MetricsStore) Delete(obj interface{}) error {
95
87
return err
96
88
}
97
89
98
- s .mutex .Lock ()
99
- defer s .mutex .Unlock ()
100
-
101
- delete (s .metrics , o .GetUID ())
90
+ s .metrics .Delete (o .GetUID ())
102
91
103
92
return nil
104
93
}
@@ -126,9 +115,7 @@ func (s *MetricsStore) GetByKey(_ string) (item interface{}, exists bool, err er
126
115
// Replace will delete the contents of the store, using instead the
127
116
// given list.
128
117
func (s * MetricsStore ) Replace (list []interface {}, _ string ) error {
129
- s .mutex .Lock ()
130
- s .metrics = map [types.UID ][][]byte {}
131
- s .mutex .Unlock ()
118
+ s .metrics .Clear ()
132
119
133
120
for _ , o := range list {
134
121
err := s .Add (o )
0 commit comments