@@ -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 {
@@ -319,7 +320,7 @@ func (b *Broker) Close() error {
319
320
b .done = nil
320
321
b .responses = nil
321
322
322
- b .unregisterMetrics ()
323
+ b .metricRegistry . UnregisterAll ()
323
324
324
325
if err == nil {
325
326
DebugLogger .Printf ("Closed connection to broker %s\n " , b .addr )
@@ -435,7 +436,7 @@ func (b *Broker) AsyncProduce(request *ProduceRequest, cb ProduceCallback) error
435
436
return
436
437
}
437
438
438
- if err := versionedDecode (packets , res , request .version (), b .conf . MetricRegistry ); err != nil {
439
+ if err := versionedDecode (packets , res , request .version (), b .metricRegistry ); err != nil {
439
440
// Malformed response
440
441
cb (nil , err )
441
442
return
@@ -979,7 +980,7 @@ func (b *Broker) sendInternal(rb protocolBody, promise *responsePromise) error {
979
980
}
980
981
981
982
req := & request {correlationID : b .correlationID , clientID : b .conf .ClientID , body : rb }
982
- buf , err := encode (req , b .conf . MetricRegistry )
983
+ buf , err := encode (req , b .metricRegistry )
983
984
if err != nil {
984
985
return err
985
986
}
@@ -1029,7 +1030,7 @@ func (b *Broker) sendAndReceive(req protocolBody, res protocolBody) error {
1029
1030
func (b * Broker ) handleResponsePromise (req protocolBody , res protocolBody , promise * responsePromise ) error {
1030
1031
select {
1031
1032
case buf := <- promise .packets :
1032
- return versionedDecode (buf , res , req .version (), b .conf . MetricRegistry )
1033
+ return versionedDecode (buf , res , req .version (), b .metricRegistry )
1033
1034
case err := <- promise .errors :
1034
1035
return err
1035
1036
}
@@ -1121,7 +1122,7 @@ func (b *Broker) responseReceiver() {
1121
1122
}
1122
1123
1123
1124
decodedHeader := responseHeader {}
1124
- err = versionedDecode (header , & decodedHeader , response .headerVersion , b .conf . MetricRegistry )
1125
+ err = versionedDecode (header , & decodedHeader , response .headerVersion , b .metricRegistry )
1125
1126
if err != nil {
1126
1127
b .updateIncomingCommunicationMetrics (bytesReadHeader , requestLatency )
1127
1128
dead = err
@@ -1243,7 +1244,7 @@ func (b *Broker) sendAndReceiveSASLHandshake(saslType SASLMechanism, version int
1243
1244
rb := & SaslHandshakeRequest {Mechanism : string (saslType ), Version : version }
1244
1245
1245
1246
req := & request {correlationID : b .correlationID , clientID : b .conf .ClientID , body : rb }
1246
- buf , err := encode (req , b .conf . MetricRegistry )
1247
+ buf , err := encode (req , b .metricRegistry )
1247
1248
if err != nil {
1248
1249
return err
1249
1250
}
@@ -1280,7 +1281,7 @@ func (b *Broker) sendAndReceiveSASLHandshake(saslType SASLMechanism, version int
1280
1281
b .updateIncomingCommunicationMetrics (n + 8 , time .Since (requestTime ))
1281
1282
res := & SaslHandshakeResponse {}
1282
1283
1283
- err = versionedDecode (payload , res , 0 , b .conf . MetricRegistry )
1284
+ err = versionedDecode (payload , res , 0 , b .metricRegistry )
1284
1285
if err != nil {
1285
1286
Logger .Printf ("Failed to parse SASL handshake : %s\n " , err .Error ())
1286
1287
return err
@@ -1622,38 +1623,19 @@ func (b *Broker) registerMetrics() {
1622
1623
b .brokerThrottleTime = b .registerHistogram ("throttle-time-in-ms" )
1623
1624
}
1624
1625
1625
- func (b * Broker ) unregisterMetrics () {
1626
- for name := range b .registeredMetrics {
1627
- b .conf .MetricRegistry .Unregister (name )
1628
- }
1629
- b .registeredMetrics = nil
1630
- }
1631
-
1632
1626
func (b * Broker ) registerMeter (name string ) metrics.Meter {
1633
1627
nameForBroker := getMetricNameForBroker (name , b )
1634
- if b .registeredMetrics == nil {
1635
- b .registeredMetrics = map [string ]struct {}{}
1636
- }
1637
- b .registeredMetrics [nameForBroker ] = struct {}{}
1638
- return metrics .GetOrRegisterMeter (nameForBroker , b .conf .MetricRegistry )
1628
+ return metrics .GetOrRegisterMeter (nameForBroker , b .metricRegistry )
1639
1629
}
1640
1630
1641
1631
func (b * Broker ) registerHistogram (name string ) metrics.Histogram {
1642
1632
nameForBroker := getMetricNameForBroker (name , b )
1643
- if b .registeredMetrics == nil {
1644
- b .registeredMetrics = map [string ]struct {}{}
1645
- }
1646
- b .registeredMetrics [nameForBroker ] = struct {}{}
1647
- return getOrRegisterHistogram (nameForBroker , b .conf .MetricRegistry )
1633
+ return getOrRegisterHistogram (nameForBroker , b .metricRegistry )
1648
1634
}
1649
1635
1650
1636
func (b * Broker ) registerCounter (name string ) metrics.Counter {
1651
1637
nameForBroker := getMetricNameForBroker (name , b )
1652
- if b .registeredMetrics == nil {
1653
- b .registeredMetrics = map [string ]struct {}{}
1654
- }
1655
- b .registeredMetrics [nameForBroker ] = struct {}{}
1656
- return metrics .GetOrRegisterCounter (nameForBroker , b .conf .MetricRegistry )
1638
+ return metrics .GetOrRegisterCounter (nameForBroker , b .metricRegistry )
1657
1639
}
1658
1640
1659
1641
func validServerNameTLS (addr string , cfg * tls.Config ) * tls.Config {
0 commit comments