Only iniate collectors once

When /metrics is called for specific collectors, the collectors are
initialed every time. Which means that we spend a lot of time
re-initiating the same collectors again and again. Especially, some
collectors make the assumptions that that are initiated once - e.g.
systemd collector generates info message upon initiation.

Signed-off-by: Julien Pivotto <roidelapluie@inuits.eu>
This commit is contained in:
Julien Pivotto 2021-06-04 10:56:42 +02:00
parent e1db354611
commit 2e20d668f2
1 changed files with 17 additions and 8 deletions

View File

@ -50,9 +50,11 @@ const (
)
var (
factories = make(map[string]func(logger log.Logger) (Collector, error))
collectorState = make(map[string]*bool)
forcedCollectors = map[string]bool{} // collectors which have been explicitly enabled or disabled
factories = make(map[string]func(logger log.Logger) (Collector, error))
initiatedCollectorsMtx = sync.Mutex{}
initiatedCollectors = make(map[string]Collector)
collectorState = make(map[string]*bool)
forcedCollectors = map[string]bool{} // collectors which have been explicitly enabled or disabled
)
func registerCollector(collector string, isDefaultEnabled bool, factory func(logger log.Logger) (Collector, error)) {
@ -115,14 +117,21 @@ func NewNodeCollector(logger log.Logger, filters ...string) (*NodeCollector, err
f[filter] = true
}
collectors := make(map[string]Collector)
initiatedCollectorsMtx.Lock()
defer initiatedCollectorsMtx.Unlock()
for key, enabled := range collectorState {
if *enabled {
collector, err := factories[key](log.With(logger, "collector", key))
if err != nil {
return nil, err
}
if len(f) == 0 || f[key] {
if collector, ok := initiatedCollectors[key]; ok {
collectors[key] = collector
} else {
collector, err := factories[key](log.With(logger, "collector", key))
if err != nil {
return nil, err
}
if len(f) == 0 || f[key] {
collectors[key] = collector
initiatedCollectors[key] = collector
}
}
}
}