@@ -33,8 +33,7 @@ type Broker struct {
33
33
responses chan * responsePromise
34
34
done chan bool
35
35
36
- registeredMetrics map [string ]struct {}
37
-
36
+ metricRegistry metrics.Registry
38
37
incomingByteRate metrics.Meter
39
38
requestRate metrics.Meter
40
39
fetchRate metrics.Meter
@@ -174,6 +173,8 @@ func (b *Broker) Open(conf *Config) error {
174
173
175
174
b .lock .Lock ()
176
175
176
+ b .metricRegistry = newCleanupRegistry (conf .MetricRegistry )
177
+
177
178
go withRecover (func () {
178
179
defer func () {
179
180
b .lock .Unlock ()
@@ -208,15 +209,15 @@ func (b *Broker) Open(conf *Config) error {
208
209
b .conf = conf
209
210
210
211
// Create or reuse the global metrics shared between brokers
211
- b .incomingByteRate = metrics .GetOrRegisterMeter ("incoming-byte-rate" , conf . MetricRegistry )
212
- b .requestRate = metrics .GetOrRegisterMeter ("request-rate" , conf . MetricRegistry )
213
- b .fetchRate = metrics .GetOrRegisterMeter ("consumer-fetch-rate" , conf . MetricRegistry )
214
- b .requestSize = getOrRegisterHistogram ("request-size" , conf . MetricRegistry )
215
- b .requestLatency = getOrRegisterHistogram ("request-latency-in-ms" , conf . MetricRegistry )
216
- b .outgoingByteRate = metrics .GetOrRegisterMeter ("outgoing-byte-rate" , conf . MetricRegistry )
217
- b .responseRate = metrics .GetOrRegisterMeter ("response-rate" , conf . MetricRegistry )
218
- b .responseSize = getOrRegisterHistogram ("response-size" , conf . MetricRegistry )
219
- b .requestsInFlight = metrics .GetOrRegisterCounter ("requests-in-flight" , conf . MetricRegistry )
212
+ b .incomingByteRate = metrics .GetOrRegisterMeter ("incoming-byte-rate" , b . metricRegistry )
213
+ b .requestRate = metrics .GetOrRegisterMeter ("request-rate" , b . metricRegistry )
214
+ b .fetchRate = metrics .GetOrRegisterMeter ("consumer-fetch-rate" , b . metricRegistry )
215
+ b .requestSize = getOrRegisterHistogram ("request-size" , b . metricRegistry )
216
+ b .requestLatency = getOrRegisterHistogram ("request-latency-in-ms" , b . metricRegistry )
217
+ b .outgoingByteRate = metrics .GetOrRegisterMeter ("outgoing-byte-rate" , b . metricRegistry )
218
+ b .responseRate = metrics .GetOrRegisterMeter ("response-rate" , b . metricRegistry )
219
+ b .responseSize = getOrRegisterHistogram ("response-size" , b . metricRegistry )
220
+ b .requestsInFlight = metrics .GetOrRegisterCounter ("requests-in-flight" , b . metricRegistry )
220
221
// Do not gather metrics for seeded broker (only used during bootstrap) because they share
221
222
// the same id (-1) and are already exposed through the global metrics above
222
223
if b .id >= 0 && ! metrics .UseNilMetrics {
@@ -326,7 +327,7 @@ func (b *Broker) Close() error {
326
327
b .done = nil
327
328
b .responses = nil
328
329
329
- b .unregisterMetrics ()
330
+ b .metricRegistry . UnregisterAll ()
330
331
331
332
if err == nil {
332
333
DebugLogger .Printf ("Closed connection to broker %s\n " , b .addr )
@@ -442,7 +443,7 @@ func (b *Broker) AsyncProduce(request *ProduceRequest, cb ProduceCallback) error
442
443
return
443
444
}
444
445
445
- if err := versionedDecode (packets , res , request .version (), b .conf . MetricRegistry ); err != nil {
446
+ if err := versionedDecode (packets , res , request .version (), b .metricRegistry ); err != nil {
446
447
// Malformed response
447
448
cb (nil , err )
448
449
return
@@ -987,7 +988,7 @@ func (b *Broker) sendInternal(rb protocolBody, promise *responsePromise) error {
987
988
}
988
989
989
990
req := & request {correlationID : b .correlationID , clientID : b .conf .ClientID , body : rb }
990
- buf , err := encode (req , b .conf . MetricRegistry )
991
+ buf , err := encode (req , b .metricRegistry )
991
992
if err != nil {
992
993
return err
993
994
}
@@ -1037,7 +1038,7 @@ func (b *Broker) sendAndReceive(req protocolBody, res protocolBody) error {
1037
1038
func (b * Broker ) handleResponsePromise (req protocolBody , res protocolBody , promise * responsePromise ) error {
1038
1039
select {
1039
1040
case buf := <- promise .packets :
1040
- return versionedDecode (buf , res , req .version (), b .conf . MetricRegistry )
1041
+ return versionedDecode (buf , res , req .version (), b .metricRegistry )
1041
1042
case err := <- promise .errors :
1042
1043
return err
1043
1044
}
@@ -1129,7 +1130,7 @@ func (b *Broker) responseReceiver() {
1129
1130
}
1130
1131
1131
1132
decodedHeader := responseHeader {}
1132
- err = versionedDecode (header , & decodedHeader , response .headerVersion , b .conf . MetricRegistry )
1133
+ err = versionedDecode (header , & decodedHeader , response .headerVersion , b .metricRegistry )
1133
1134
if err != nil {
1134
1135
b .updateIncomingCommunicationMetrics (bytesReadHeader , requestLatency )
1135
1136
dead = err
@@ -1251,7 +1252,7 @@ func (b *Broker) sendAndReceiveSASLHandshake(saslType SASLMechanism, version int
1251
1252
rb := & SaslHandshakeRequest {Mechanism : string (saslType ), Version : version }
1252
1253
1253
1254
req := & request {correlationID : b .correlationID , clientID : b .conf .ClientID , body : rb }
1254
- buf , err := encode (req , b .conf . MetricRegistry )
1255
+ buf , err := encode (req , b .metricRegistry )
1255
1256
if err != nil {
1256
1257
return err
1257
1258
}
@@ -1288,7 +1289,7 @@ func (b *Broker) sendAndReceiveSASLHandshake(saslType SASLMechanism, version int
1288
1289
b .updateIncomingCommunicationMetrics (n + 8 , time .Since (requestTime ))
1289
1290
res := & SaslHandshakeResponse {}
1290
1291
1291
- err = versionedDecode (payload , res , 0 , b .conf . MetricRegistry )
1292
+ err = versionedDecode (payload , res , 0 , b .metricRegistry )
1292
1293
if err != nil {
1293
1294
Logger .Printf ("Failed to parse SASL handshake : %s\n " , err .Error ())
1294
1295
return err
@@ -1630,38 +1631,19 @@ func (b *Broker) registerMetrics() {
1630
1631
b .brokerThrottleTime = b .registerHistogram ("throttle-time-in-ms" )
1631
1632
}
1632
1633
1633
- func (b * Broker ) unregisterMetrics () {
1634
- for name := range b .registeredMetrics {
1635
- b .conf .MetricRegistry .Unregister (name )
1636
- }
1637
- b .registeredMetrics = nil
1638
- }
1639
-
1640
1634
func (b * Broker ) registerMeter (name string ) metrics.Meter {
1641
1635
nameForBroker := getMetricNameForBroker (name , b )
1642
- if b .registeredMetrics == nil {
1643
- b .registeredMetrics = map [string ]struct {}{}
1644
- }
1645
- b .registeredMetrics [nameForBroker ] = struct {}{}
1646
- return metrics .GetOrRegisterMeter (nameForBroker , b .conf .MetricRegistry )
1636
+ return metrics .GetOrRegisterMeter (nameForBroker , b .metricRegistry )
1647
1637
}
1648
1638
1649
1639
func (b * Broker ) registerHistogram (name string ) metrics.Histogram {
1650
1640
nameForBroker := getMetricNameForBroker (name , b )
1651
- if b .registeredMetrics == nil {
1652
- b .registeredMetrics = map [string ]struct {}{}
1653
- }
1654
- b .registeredMetrics [nameForBroker ] = struct {}{}
1655
- return getOrRegisterHistogram (nameForBroker , b .conf .MetricRegistry )
1641
+ return getOrRegisterHistogram (nameForBroker , b .metricRegistry )
1656
1642
}
1657
1643
1658
1644
func (b * Broker ) registerCounter (name string ) metrics.Counter {
1659
1645
nameForBroker := getMetricNameForBroker (name , b )
1660
- if b .registeredMetrics == nil {
1661
- b .registeredMetrics = map [string ]struct {}{}
1662
- }
1663
- b .registeredMetrics [nameForBroker ] = struct {}{}
1664
- return metrics .GetOrRegisterCounter (nameForBroker , b .conf .MetricRegistry )
1646
+ return metrics .GetOrRegisterCounter (nameForBroker , b .metricRegistry )
1665
1647
}
1666
1648
1667
1649
func validServerNameTLS (addr string , cfg * tls.Config ) * tls.Config {
0 commit comments