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
This commit is contained in:
Alex Marangone 2023-02-09 11:02:43 -08:00
parent 49e6345cb6
commit 69edc55596

View File

@ -39,12 +39,13 @@ type Exporter struct {
RbdMirror bool RbdMirror bool
Logger *logrus.Logger Logger *logrus.Logger
Version *Version Version *Version
cc map[string]interface{}
} }
// NewExporter returns an initialized *Exporter // 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. // 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 { func NewExporter(conn Conn, cluster string, config string, user string, rgwMode int, logger *logrus.Logger) *Exporter {
return &Exporter{ e := &Exporter{
Conn: conn, Conn: conn,
Cluster: cluster, Cluster: cluster,
Config: config, Config: config,
@ -52,28 +53,32 @@ func NewExporter(conn Conn, cluster string, config string, user string, rgwMode
RgwMode: rgwMode, RgwMode: rgwMode,
Logger: logger, 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 { func (exporter *Exporter) initCollectors() map[string]interface{} {
standardCollectors := []prometheus.Collector{ standardCollectors := map[string]interface{}{
NewClusterUsageCollector(exporter), "clusterUage": NewClusterUsageCollector(exporter),
NewPoolUsageCollector(exporter), "poolUsage": NewPoolUsageCollector(exporter),
NewPoolInfoCollector(exporter), "poolInfo": NewPoolInfoCollector(exporter),
NewClusterHealthCollector(exporter), "clusterHealth": NewClusterHealthCollector(exporter),
NewMonitorCollector(exporter), "mon": NewMonitorCollector(exporter),
NewOSDCollector(exporter), "osd": NewOSDCollector(exporter),
NewCrashesCollector(exporter), "crashes": NewCrashesCollector(exporter),
}
if exporter.RbdMirror {
standardCollectors = append(standardCollectors, NewRbdMirrorStatusCollector(exporter))
} }
switch exporter.RgwMode { switch exporter.RgwMode {
case RGWModeForeground: case RGWModeForeground:
standardCollectors = append(standardCollectors, NewRGWCollector(exporter, false)) standardCollectors["rgw"] = NewRGWCollector(exporter, false)
case RGWModeBackground: case RGWModeBackground:
standardCollectors = append(standardCollectors, NewRGWCollector(exporter, true)) standardCollectors["rgw"] = NewRGWCollector(exporter, true)
case RGWModeDisabled: case RGWModeDisabled:
// nothing to do // nothing to do
default: default:
@ -165,7 +170,14 @@ func (exporter *Exporter) setRbdMirror() error {
// check to see if rbd-mirror is in ceph version output and not empty // check to see if rbd-mirror is in ceph version output and not empty
if _, exists := versions["rbd-mirror"]; exists { if _, exists := versions["rbd-mirror"]; exists {
if len(versions["rbd-mirror"]) > 0 { 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 return
} }
for _, cc := range exporter.getCollectors() { for _, cc := range exporter.cc {
cc.Describe(ch) cc.Describe(ch)
} }
} }
@ -237,7 +249,7 @@ func (exporter *Exporter) Collect(ch chan<- prometheus.Metric) {
return return
} }
for _, cc := range exporter.getCollectors() { for _, cc := range exporter.cc {
cc.Collect(ch) cc.Collect(ch)
} }
} }