From 69edc55596e6fe68345e42dbc64a11019f150bdc Mon Sep 17 00:00:00 2001 From: Alex Marangone Date: Thu, 9 Feb 2023 11:02:43 -0800 Subject: [PATCH] exporter: do not reinitialize collectors on every collect We store all the collectors in a map of string in order to dynamically load/unload the rbd mirror collector --- ceph/exporter.go | 50 ++++++++++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 19 deletions(-) diff --git a/ceph/exporter.go b/ceph/exporter.go index b5998a3..78a406e 100644 --- a/ceph/exporter.go +++ b/ceph/exporter.go @@ -39,12 +39,13 @@ type Exporter struct { RbdMirror bool Logger *logrus.Logger Version *Version + cc map[string]interface{} } // NewExporter returns an initialized *Exporter // We can choose to enable a collector to extract stats out of by adding it to the list of collectors. func NewExporter(conn Conn, cluster string, config string, user string, rgwMode int, logger *logrus.Logger) *Exporter { - return &Exporter{ + e := &Exporter{ Conn: conn, Cluster: cluster, Config: config, @@ -52,28 +53,32 @@ func NewExporter(conn Conn, cluster string, config string, user string, rgwMode RgwMode: rgwMode, Logger: logger, } + err := e.setCephVersion() + if err != nil { + e.Logger.WithError(err).Error("failed to set ceph version") + return nil + } + e.cc = e.initCollectors() + + return e } -func (exporter *Exporter) getCollectors() []prometheus.Collector { - standardCollectors := []prometheus.Collector{ - NewClusterUsageCollector(exporter), - NewPoolUsageCollector(exporter), - NewPoolInfoCollector(exporter), - NewClusterHealthCollector(exporter), - NewMonitorCollector(exporter), - NewOSDCollector(exporter), - NewCrashesCollector(exporter), - } - - if exporter.RbdMirror { - standardCollectors = append(standardCollectors, NewRbdMirrorStatusCollector(exporter)) +func (exporter *Exporter) initCollectors() map[string]interface{} { + standardCollectors := map[string]interface{}{ + "clusterUage": NewClusterUsageCollector(exporter), + "poolUsage": NewPoolUsageCollector(exporter), + "poolInfo": NewPoolInfoCollector(exporter), + "clusterHealth": NewClusterHealthCollector(exporter), + "mon": NewMonitorCollector(exporter), + "osd": NewOSDCollector(exporter), + "crashes": NewCrashesCollector(exporter), } switch exporter.RgwMode { case RGWModeForeground: - standardCollectors = append(standardCollectors, NewRGWCollector(exporter, false)) + standardCollectors["rgw"] = NewRGWCollector(exporter, false) case RGWModeBackground: - standardCollectors = append(standardCollectors, NewRGWCollector(exporter, true)) + standardCollectors["rgw"] = NewRGWCollector(exporter, true) case RGWModeDisabled: // nothing to do default: @@ -165,7 +170,14 @@ func (exporter *Exporter) setRbdMirror() error { // check to see if rbd-mirror is in ceph version output and not empty if _, exists := versions["rbd-mirror"]; exists { if len(versions["rbd-mirror"]) > 0 { - exporter.RbdMirror = true + if _, ok := exporter.cc["rbdMirror"]; !ok { + exporter.cc["rbdMirror"] = NewRbdMirrorStatusCollector(exporter) + } + } + } else { + // remove the rbdMirror collector if present + if _, ok := exporter.cc["rbdMirror"]; ok { + delete(exporter.cc, "rbdMirror") } } @@ -213,7 +225,7 @@ func (exporter *Exporter) Describe(ch chan<- *prometheus.Desc) { return } - for _, cc := range exporter.getCollectors() { + for _, cc := range exporter.cc { cc.Describe(ch) } } @@ -237,7 +249,7 @@ func (exporter *Exporter) Collect(ch chan<- prometheus.Metric) { return } - for _, cc := range exporter.getCollectors() { + for _, cc := range exporter.cc { cc.Collect(ch) } }