forked from mirror/client_golang
ensure same collectorID calculated on reg and unreg
Signed-off-by: Leo Antunes <leo@costela.net>
This commit is contained in:
parent
b2924667e3
commit
4be0ab45ec
|
@ -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{}{}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue