From fe9ec398f909506040f68d813163ced013815ace Mon Sep 17 00:00:00 2001 From: matt durham Date: Thu, 5 Oct 2023 09:12:03 -0400 Subject: [PATCH] Add caching back in. --- collector/collector.go | 27 ++++++++++++++++++--------- collector/config.go | 3 ++- node_exporter.go | 1 + 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/collector/collector.go b/collector/collector.go index 224ebfa6..73313f99 100644 --- a/collector/collector.go +++ b/collector/collector.go @@ -50,11 +50,13 @@ const ( ) var ( - factories = make(map[string]func(config *NodeCollectorConfig, logger log.Logger) (Collector, error)) - collectorStateGlobal = make(map[string]bool) - collectorFlagState = make(map[string]*bool) - availableCollectors = make([]string, 0) - forcedCollectors = map[string]bool{} // collectors which have been explicitly enabled or disabled + factories = make(map[string]func(config *NodeCollectorConfig, logger log.Logger) (Collector, error)) + initiatedCollectorsMtx = sync.Mutex{} + initiatedCollectors = make(map[string]Collector) + collectorStateGlobal = make(map[string]bool) + collectorFlagState = make(map[string]*bool) + availableCollectors = make([]string, 0) + forcedCollectors = map[string]bool{} // collectors which have been explicitly enabled or disabled ) func GetDefaults() map[string]bool { @@ -140,15 +142,22 @@ func NewNodeCollector(config *NodeCollectorConfig, logger log.Logger, filters .. } collectors := make(map[string]Collector) + initiatedCollectorsMtx.Lock() + defer initiatedCollectorsMtx.Unlock() for key, enabled := range config.Collectors { if !enabled || (len(f) > 0 && !f[key]) { continue } - collector, err := factories[key](config, log.With(logger, "collector", key)) - if err != nil { - return nil, err + if collector, ok := initiatedCollectors[key]; ok && config.AllowCachingOfCollectors { + collectors[key] = collector + } else { + collector, err := factories[key](config, log.With(logger, "collector", key)) + if err != nil { + return nil, err + } + collectors[key] = collector + initiatedCollectors[key] = collector } - collectors[key] = collector } return &NodeCollector{Collectors: collectors, logger: logger}, nil } diff --git a/collector/config.go b/collector/config.go index 3cb907fe..32cbba8d 100644 --- a/collector/config.go +++ b/collector/config.go @@ -43,7 +43,8 @@ type NodeCollectorConfig struct { VmStat VmStatConfig Wifi WifiConfig - Collectors map[string]bool + Collectors map[string]bool + AllowCachingOfCollectors bool } type WifiConfig struct { diff --git a/node_exporter.go b/node_exporter.go index 2d5d11e6..ec7b4256 100644 --- a/node_exporter.go +++ b/node_exporter.go @@ -189,6 +189,7 @@ func main() { runtime.GOMAXPROCS(*maxProcs) level.Debug(logger).Log("msg", "Go MAXPROCS", "procs", runtime.GOMAXPROCS(0)) collectorConfig.Collectors = collector.GetFlagDefaults() + collectorConfig.AllowCachingOfCollectors = true http.Handle(*metricsPath, newHandler(!*disableExporterMetrics, *maxRequests, collectorConfig, logger)) if *metricsPath != "/" { landingConfig := web.LandingConfig{