Skip to content

Commit

Permalink
fix: prevent metrics leak when authenticate fails
Browse files Browse the repository at this point in the history
Broker register metrics name to `registeredMetrics` and then
authenticate to broker by socket, when authenticate failed many times,
the `registeredMetrics` is slice and will append a metrics name many
times
  • Loading branch information
Stephan14 committed Apr 13, 2022
1 parent 1776783 commit 08a8b06
Showing 1 changed file with 14 additions and 5 deletions.
19 changes: 14 additions & 5 deletions broker.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ type Broker struct {
responses chan *responsePromise
done chan bool

registeredMetrics []string
registeredMetrics map[string]struct{}

incomingByteRate metrics.Meter
requestRate metrics.Meter
Expand Down Expand Up @@ -1683,27 +1683,36 @@ func (b *Broker) registerMetrics() {
}

func (b *Broker) unregisterMetrics() {
for _, name := range b.registeredMetrics {
for name := range b.registeredMetrics {
b.conf.MetricRegistry.Unregister(name)
}
b.registeredMetrics = nil
}

func (b *Broker) registerMeter(name string) metrics.Meter {
nameForBroker := getMetricNameForBroker(name, b)
b.registeredMetrics = append(b.registeredMetrics, nameForBroker)
if b.registeredMetrics == nil {
b.registeredMetrics = map[string]struct{}{}
}
b.registeredMetrics[nameForBroker] = struct{}{}
return metrics.GetOrRegisterMeter(nameForBroker, b.conf.MetricRegistry)
}

func (b *Broker) registerHistogram(name string) metrics.Histogram {
nameForBroker := getMetricNameForBroker(name, b)
b.registeredMetrics = append(b.registeredMetrics, nameForBroker)
if b.registeredMetrics == nil {
b.registeredMetrics = map[string]struct{}{}
}
b.registeredMetrics[nameForBroker] = struct{}{}
return getOrRegisterHistogram(nameForBroker, b.conf.MetricRegistry)
}

func (b *Broker) registerCounter(name string) metrics.Counter {
nameForBroker := getMetricNameForBroker(name, b)
b.registeredMetrics = append(b.registeredMetrics, nameForBroker)
if b.registeredMetrics == nil {
b.registeredMetrics = map[string]struct{}{}
}
b.registeredMetrics[nameForBroker] = struct{}{}
return metrics.GetOrRegisterCounter(nameForBroker, b.conf.MetricRegistry)
}

Expand Down

0 comments on commit 08a8b06

Please sign in to comment.