pkg/xcontext/metrics/prometheus/hacks.go (24 lines of code) (raw):
// Copyright (c) Facebook, Inc. and its affiliates.
//
// This source code is licensed under the MIT license found in the
// LICENSE file in the root directory of this source tree.
package prometheus
import (
"sync"
"github.com/prometheus/client_golang/prometheus"
"github.com/xaionaro-go/unsafetools"
)
// prometheus does not support full unregister. Therefore we add code
// to do so.
//
// See also: https://github.com/prometheus/client_golang/issues/203
func unregister(registerer prometheus.Registerer, c prometheus.Collector) bool {
if !registerer.Unregister(c) {
return false
}
descChan := make(chan *prometheus.Desc, 10)
go func() {
c.Describe(descChan)
close(descChan)
}()
locker := unsafetools.FieldByName(registerer, "mtx").(*sync.RWMutex)
dimHashesByName := *unsafetools.FieldByName(registerer, "dimHashesByName").(*map[string]uint64)
locker.Lock()
defer locker.Unlock()
for desc := range descChan {
delete(dimHashesByName, *unsafetools.FieldByName(desc, "fqName").(*string))
}
return true
}