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