Skip to content

Commit

Permalink
ensure same collectorID calculated on reg and unreg
Browse files Browse the repository at this point in the history
  • Loading branch information
costela committed Oct 17, 2019
1 parent dfafbc6 commit e7e15b4
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 2 deletions.
4 changes: 2 additions & 2 deletions prometheus/registry.go
Expand Up @@ -361,15 +361,15 @@ func (r *Registry) Unregister(c Collector) bool {
var (
descChan = make(chan *Desc, capDescChan)
descIDs = map[uint64]struct{}{}
collectorID uint64 // Just a sum of the desc IDs.
collectorID uint64 // All desc IDs XOR'd together.
)
go func() {
c.Describe(descChan)
close(descChan)
}()
for desc := range descChan {
if _, exists := descIDs[desc.id]; !exists {
collectorID += desc.id
collectorID ^= desc.id
descIDs[desc.id] = struct{}{}
}
}
Expand Down
17 changes: 17 additions & 0 deletions prometheus/registry_test.go
Expand Up @@ -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
// concurrently calls Observe on random elements of a HistogramVec while the
// same HistogramVec is registered concurrently and the Gather method of the
Expand Down

0 comments on commit e7e15b4

Please sign in to comment.