@@ -106,16 +106,43 @@ type groupMetricsCollection struct {
106106 tokenRequestCounter prometheus.Counter
107107 runningKVRequestCounter prometheus.Gauge
108108 consumeTokenHistogram prometheus.Observer
109- sourceMetricsMu sync.RWMutex
110- sourceMetrics map [string ]* requestSourceMetrics
109+ sourceState * requestSourceMetricsState
111110}
112111
113112type requestSourceMetrics struct {
114113 rru prometheus.Counter
115114 wru prometheus.Counter
116115}
117116
118- func initMetrics (oldName , name string ) * groupMetricsCollection {
117+ type requestSourceMetricsState struct {
118+ resourceGroupName string
119+ mu sync.RWMutex
120+ closed bool
121+ items map [string ]* requestSourceMetrics
122+ }
123+
124+ func newRequestSourceMetricsState (resourceGroupName string ) * requestSourceMetricsState {
125+ return & requestSourceMetricsState {
126+ resourceGroupName : resourceGroupName ,
127+ items : make (map [string ]* requestSourceMetrics ),
128+ }
129+ }
130+
131+ func (s * requestSourceMetricsState ) cleanup () {
132+ if s == nil {
133+ return
134+ }
135+ s .mu .Lock ()
136+ defer s .mu .Unlock ()
137+ s .closed = true
138+ for requestSource := range s .items {
139+ metrics .RequestSourceRUCounter .DeleteLabelValues (s .resourceGroupName , requestSource , "rru" )
140+ metrics .RequestSourceRUCounter .DeleteLabelValues (s .resourceGroupName , requestSource , "wru" )
141+ delete (s .items , requestSource )
142+ }
143+ }
144+
145+ func initMetrics (oldName , name string , sourceState * requestSourceMetricsState ) * groupMetricsCollection {
119146 const (
120147 otherType = "others"
121148 throttledType = "throttled"
@@ -129,37 +156,50 @@ func initMetrics(oldName, name string) *groupMetricsCollection {
129156 tokenRequestCounter : metrics .ResourceGroupTokenRequestCounter .WithLabelValues (oldName , name ),
130157 runningKVRequestCounter : metrics .GroupRunningKVRequestCounter .WithLabelValues (name ),
131158 consumeTokenHistogram : metrics .TokenConsumedHistogram .WithLabelValues (name ),
132- sourceMetrics : make ( map [ string ] * requestSourceMetrics ) ,
159+ sourceState : sourceState ,
133160 }
134161}
135162
136- func (mc * groupMetricsCollection ) getOrCreateRequestSourceMetrics (resourceGroupName , requestSource string ) * requestSourceMetrics {
137- mc .sourceMetricsMu .RLock ()
138- sourceMetrics , ok := mc .sourceMetrics [requestSource ]
139- mc .sourceMetricsMu .RUnlock ()
163+ func (mc * groupMetricsCollection ) getOrCreateRequestSourceMetrics (requestSource string ) * requestSourceMetrics {
164+ if mc .sourceState == nil {
165+ return nil
166+ }
167+ mc .sourceState .mu .RLock ()
168+ sourceMetrics , ok := mc .sourceState .items [requestSource ]
169+ closed := mc .sourceState .closed
170+ mc .sourceState .mu .RUnlock ()
140171 if ok {
141172 return sourceMetrics
142173 }
174+ if closed {
175+ return nil
176+ }
143177
144- mc .sourceMetricsMu .Lock ()
145- defer mc .sourceMetricsMu .Unlock ()
146- sourceMetrics , ok = mc .sourceMetrics [requestSource ]
178+ mc .sourceState .mu .Lock ()
179+ defer mc .sourceState .mu .Unlock ()
180+ if mc .sourceState .closed {
181+ return nil
182+ }
183+ sourceMetrics , ok = mc .sourceState .items [requestSource ]
147184 if ok {
148185 return sourceMetrics
149186 }
150187 sourceMetrics = & requestSourceMetrics {
151- rru : metrics .RequestSourceRUCounter .WithLabelValues (resourceGroupName , requestSource , "rru" ),
152- wru : metrics .RequestSourceRUCounter .WithLabelValues (resourceGroupName , requestSource , "wru" ),
188+ rru : metrics .RequestSourceRUCounter .WithLabelValues (mc . sourceState . resourceGroupName , requestSource , "rru" ),
189+ wru : metrics .RequestSourceRUCounter .WithLabelValues (mc . sourceState . resourceGroupName , requestSource , "wru" ),
153190 }
154- mc .sourceMetrics [requestSource ] = sourceMetrics
191+ mc .sourceState . items [requestSource ] = sourceMetrics
155192 return sourceMetrics
156193}
157194
158- func (mc * groupMetricsCollection ) addRequestSourceRU (resourceGroupName , requestSource string , consumption * rmpb.Consumption ) {
195+ func (mc * groupMetricsCollection ) addRequestSourceRU (requestSource string , consumption * rmpb.Consumption ) {
159196 if consumption == nil {
160197 return
161198 }
162- sourceMetrics := mc .getOrCreateRequestSourceMetrics (resourceGroupName , requestSource )
199+ sourceMetrics := mc .getOrCreateRequestSourceMetrics (requestSource )
200+ if sourceMetrics == nil {
201+ return
202+ }
163203 if consumption .RRU > 0 {
164204 sourceMetrics .rru .Add (consumption .RRU )
165205 }
@@ -168,14 +208,8 @@ func (mc *groupMetricsCollection) addRequestSourceRU(resourceGroupName, requestS
168208 }
169209}
170210
171- func (mc * groupMetricsCollection ) cleanupRequestSourceMetrics (resourceGroupName string ) {
172- mc .sourceMetricsMu .Lock ()
173- defer mc .sourceMetricsMu .Unlock ()
174- for requestSource := range mc .sourceMetrics {
175- metrics .RequestSourceRUCounter .DeleteLabelValues (resourceGroupName , requestSource , "rru" )
176- metrics .RequestSourceRUCounter .DeleteLabelValues (resourceGroupName , requestSource , "wru" )
177- delete (mc .sourceMetrics , requestSource )
178- }
211+ func (mc * groupMetricsCollection ) cleanupRequestSourceMetrics () {
212+ mc .sourceState .cleanup ()
179213}
180214
181215type tokenCounter struct {
@@ -209,6 +243,7 @@ func newGroupCostController(
209243 mainCfg * RUConfig ,
210244 lowRUNotifyChan chan notifyMsg ,
211245 tokenBucketUpdateChan chan * groupCostController ,
246+ sourceState * requestSourceMetricsState ,
212247) (* groupCostController , error ) {
213248 switch group .Mode {
214249 case rmpb .GroupMode_RUMode :
@@ -218,7 +253,10 @@ func newGroupCostController(
218253 default :
219254 return nil , errs .ErrClientResourceGroupConfigUnavailable .FastGenByArgs ("not supports the resource type" )
220255 }
221- ms := initMetrics (group .Name , group .Name )
256+ if sourceState == nil {
257+ sourceState = newRequestSourceMetricsState (group .Name )
258+ }
259+ ms := initMetrics (group .Name , group .Name , sourceState )
222260 gc := & groupCostController {
223261 meta : group ,
224262 name : group .Name ,
@@ -630,7 +668,7 @@ func (gc *groupCostController) onRequestWaitImpl(
630668 waitDuration += d
631669 }
632670
633- gc .metrics .addRequestSourceRU (gc . name , info .RequestSource (), delta )
671+ gc .metrics .addRequestSourceRU (info .RequestSource (), delta )
634672
635673 gc .mu .Lock ()
636674 // Calculate the penalty of the store
@@ -677,7 +715,7 @@ func (gc *groupCostController) onResponseImpl(
677715 add (gc .mu .globalCounter , count )
678716 gc .mu .Unlock ()
679717
680- gc .metrics .addRequestSourceRU (gc . name , req .RequestSource (), delta )
718+ gc .metrics .addRequestSourceRU (req .RequestSource (), delta )
681719
682720 return delta , nil
683721}
@@ -720,7 +758,7 @@ func (gc *groupCostController) onResponseWaitImpl(
720758 add (gc .mu .globalCounter , count )
721759 gc .mu .Unlock ()
722760
723- gc .metrics .addRequestSourceRU (gc . name , req .RequestSource (), delta )
761+ gc .metrics .addRequestSourceRU (req .RequestSource (), delta )
724762
725763 return delta , waitDuration , nil
726764}
0 commit comments