ensure same collectorID calculated on reg and unreg

Signed-off-by: Leo Antunes <leo@costela.net>
This commit is contained in:
Leo Antunes 2019-10-17 12:34:06 +02:00
parent b2924667e3
commit 4be0ab45ec
2 changed files with 19 additions and 2 deletions

View File

@ -361,7 +361,7 @@ func (r *Registry) Unregister(c Collector) bool {
var ( var (
descChan = make(chan *Desc, capDescChan) descChan = make(chan *Desc, capDescChan)
descIDs = map[uint64]struct{}{} descIDs = map[uint64]struct{}{}
collectorID uint64 // Just a sum of the desc IDs. collectorID uint64 // All desc IDs XOR'd together.
) )
go func() { go func() {
c.Describe(descChan) c.Describe(descChan)
@ -369,7 +369,7 @@ func (r *Registry) Unregister(c Collector) bool {
}() }()
for desc := range descChan { for desc := range descChan {
if _, exists := descIDs[desc.id]; !exists { if _, exists := descIDs[desc.id]; !exists {
collectorID += desc.id collectorID ^= desc.id
descIDs[desc.id] = struct{}{} descIDs[desc.id] = struct{}{}
} }
} }

View File

@ -863,6 +863,23 @@ func TestAlreadyRegistered(t *testing.T) {
} }
} }
// TestRegisterUnregisterCollector ensures registering and unregistering a
// collector doesn't leave any dangling metrics.
// We use NewGoCollector as a nice concrete example of a collector with
// multiple metrics.
func TestRegisterUnregisterCollector(t *testing.T) {
col := prometheus.NewGoCollector()
reg := prometheus.NewRegistry()
reg.MustRegister(col)
reg.Unregister(col)
if metrics, err := reg.Gather(); err != nil {
t.Error("error gathering sample metric")
} else if len(metrics) != 0 {
t.Error("should have unregistered metric")
}
}
// TestHistogramVecRegisterGatherConcurrency is an end-to-end test that // TestHistogramVecRegisterGatherConcurrency is an end-to-end test that
// concurrently calls Observe on random elements of a HistogramVec while the // concurrently calls Observe on random elements of a HistogramVec while the
// same HistogramVec is registered concurrently and the Gather method of the // same HistogramVec is registered concurrently and the Gather method of the