From 2e20d668f25a03ffd8411ad060fa1813f63aae89 Mon Sep 17 00:00:00 2001 From: Julien Pivotto Date: Fri, 4 Jun 2021 10:56:42 +0200 Subject: [PATCH] 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 --- collector/collector.go | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/collector/collector.go b/collector/collector.go index fac94c18..57994fbd 100644 --- a/collector/collector.go +++ b/collector/collector.go @@ -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 + } } } }