diff --git a/ceph/cluster_usage_test.go b/ceph/cluster_usage_test.go index c0e4f91..0b217e9 100644 --- a/ceph/cluster_usage_test.go +++ b/ceph/cluster_usage_test.go @@ -141,7 +141,7 @@ func TestClusterUsage(t *testing.T) { ) e := &Exporter{Conn: conn, Cluster: "ceph", Logger: logrus.New()} - e.cc = map[string]interface{}{ + e.cc = map[string]versionedCollector{ "clusterUsage": NewClusterUsageCollector(e), } err := prometheus.Register(e) diff --git a/ceph/crashes_test.go b/ceph/crashes_test.go index ebc1f47..814d02f 100644 --- a/ceph/crashes_test.go +++ b/ceph/crashes_test.go @@ -195,7 +195,7 @@ func TestCrashesCollector(t *testing.T) { ) e := &Exporter{Conn: conn, Cluster: "ceph", Logger: logrus.New()} - e.cc = map[string]interface{}{ + e.cc = map[string]versionedCollector{ "crashes": NewCrashesCollector(e), } err := prometheus.Register(e) diff --git a/ceph/exporter.go b/ceph/exporter.go index f052e8a..f9e57bc 100644 --- a/ceph/exporter.go +++ b/ceph/exporter.go @@ -24,6 +24,11 @@ import ( "github.com/sirupsen/logrus" ) +type versionedCollector interface { + Collect(chan<- prometheus.Metric, *Version) + Describe(chan<- *prometheus.Desc) +} + // Exporter wraps all the ceph collectors and provides a single global // exporter to extracts metrics out of. It also ensures that the collection // is done in a thread-safe manner, the necessary requirement stated by @@ -39,7 +44,7 @@ type Exporter struct { RbdMirror bool Logger *logrus.Logger Version *Version - cc map[string]interface{} + cc map[string]versionedCollector } // NewExporter returns an initialized *Exporter @@ -63,8 +68,8 @@ func NewExporter(conn Conn, cluster string, config string, user string, rgwMode return e } -func (exporter *Exporter) initCollectors() map[string]interface{} { - standardCollectors := map[string]interface{}{ +func (exporter *Exporter) initCollectors() map[string]versionedCollector { + standardCollectors := map[string]versionedCollector{ "clusterUage": NewClusterUsageCollector(exporter), "poolUsage": NewPoolUsageCollector(exporter), "poolInfo": NewPoolInfoCollector(exporter), @@ -226,26 +231,7 @@ func (exporter *Exporter) Describe(ch chan<- *prometheus.Desc) { } for _, cc := range exporter.cc { - switch cc.(type) { - case *ClusterUsageCollector: - cc.(*ClusterUsageCollector).Describe(ch) - case *PoolUsageCollector: - cc.(*PoolUsageCollector).Describe(ch) - case *PoolInfoCollector: - cc.(*PoolInfoCollector).Describe(ch) - case *ClusterHealthCollector: - cc.(*ClusterHealthCollector).Describe(ch) - case *MonitorCollector: - cc.(*MonitorCollector).Describe(ch) - case *OSDCollector: - cc.(*OSDCollector).Describe(ch) - case *CrashesCollector: - cc.(*CrashesCollector).Describe(ch) - case *RbdMirrorStatusCollector: - cc.(*RbdMirrorStatusCollector).Describe(ch) - case *RGWCollector: - cc.(*RGWCollector).Describe(ch) - } + cc.Describe(ch) } } @@ -269,25 +255,6 @@ func (exporter *Exporter) Collect(ch chan<- prometheus.Metric) { } for _, cc := range exporter.cc { - switch cc.(type) { - case *ClusterUsageCollector: - cc.(*ClusterUsageCollector).Collect(ch, exporter.Version) - case *PoolUsageCollector: - cc.(*PoolUsageCollector).Collect(ch, exporter.Version) - case *PoolInfoCollector: - cc.(*PoolInfoCollector).Collect(ch, exporter.Version) - case *ClusterHealthCollector: - cc.(*ClusterHealthCollector).Collect(ch, exporter.Version) - case *MonitorCollector: - cc.(*MonitorCollector).Collect(ch, exporter.Version) - case *OSDCollector: - cc.(*OSDCollector).Collect(ch, exporter.Version) - case *CrashesCollector: - cc.(*CrashesCollector).Collect(ch, exporter.Version) - case *RbdMirrorStatusCollector: - cc.(*RbdMirrorStatusCollector).Collect(ch, exporter.Version) - case *RGWCollector: - cc.(*RGWCollector).Collect(ch, exporter.Version) - } + cc.Collect(ch, exporter.Version) } } diff --git a/ceph/health_test.go b/ceph/health_test.go index 1518492..077affd 100644 --- a/ceph/health_test.go +++ b/ceph/health_test.go @@ -820,7 +820,7 @@ $ sudo ceph -s []byte(tt.input), "", nil, ) e := &Exporter{Conn: conn, Cluster: "ceph", Logger: logrus.New()} - e.cc = map[string]interface{}{ + e.cc = map[string]versionedCollector{ "clusterHealth": NewClusterHealthCollector(e), } diff --git a/ceph/monitors_test.go b/ceph/monitors_test.go index fbc178b..2d52409 100644 --- a/ceph/monitors_test.go +++ b/ceph/monitors_test.go @@ -274,7 +274,7 @@ func TestMonitorCollector(t *testing.T) { ) e := &Exporter{Conn: conn, Cluster: "ceph", Logger: logrus.New()} - e.cc = map[string]interface{}{ + e.cc = map[string]versionedCollector{ "mon": NewMonitorCollector(e), } err := prometheus.Register(e) @@ -405,7 +405,7 @@ func TestMonitorTimeSyncStats(t *testing.T) { ) e := &Exporter{Conn: conn, Cluster: "ceph", Logger: logrus.New()} - e.cc = map[string]interface{}{ + e.cc = map[string]versionedCollector{ "mon": NewMonitorCollector(e), } err := prometheus.Register(e) @@ -472,7 +472,7 @@ func TestMonitorCephVersions(t *testing.T) { ) e := &Exporter{Conn: conn, Cluster: "ceph", Logger: logrus.New()} - e.cc = map[string]interface{}{ + e.cc = map[string]versionedCollector{ "mon": NewMonitorCollector(e), } err := prometheus.Register(e) @@ -558,7 +558,7 @@ func TestMonitorCephFeatures(t *testing.T) { ) e := &Exporter{Conn: conn, Cluster: "ceph", Logger: logrus.New()} - e.cc = map[string]interface{}{ + e.cc = map[string]versionedCollector{ "mon": NewMonitorCollector(e), } err := prometheus.Register(e) diff --git a/ceph/osd_test.go b/ceph/osd_test.go index a152d90..7c70f03 100644 --- a/ceph/osd_test.go +++ b/ceph/osd_test.go @@ -973,7 +973,7 @@ func TestOSDCollector(t *testing.T) { }`), "", nil) e := &Exporter{Conn: conn, Cluster: "ceph", Logger: logrus.New()} - e.cc = map[string]interface{}{ + e.cc = map[string]versionedCollector{ "osd": NewOSDCollector(e), } err := prometheus.Register(e) diff --git a/ceph/pool_test.go b/ceph/pool_test.go index cc2832b..35b4d48 100644 --- a/ceph/pool_test.go +++ b/ceph/pool_test.go @@ -184,7 +184,7 @@ func TestPoolInfoCollector(t *testing.T) { })).Return([]byte(""), "", fmt.Errorf("unknown erasure code profile")) e := &Exporter{Conn: conn, Cluster: "ceph", Logger: logrus.New()} - e.cc = map[string]interface{}{ + e.cc = map[string]versionedCollector{ "poolInfo": NewPoolInfoCollector(e), } err := prometheus.Register(e) diff --git a/ceph/pool_usage_test.go b/ceph/pool_usage_test.go index b355ab9..1aa3383 100644 --- a/ceph/pool_usage_test.go +++ b/ceph/pool_usage_test.go @@ -199,7 +199,7 @@ func TestPoolUsageCollector(t *testing.T) { ) e := &Exporter{Conn: conn, Cluster: "ceph", Logger: logrus.New()} - e.cc = map[string]interface{}{ + e.cc = map[string]versionedCollector{ "poolUsage": NewPoolUsageCollector(e), } err := prometheus.Register(e) diff --git a/ceph/rbd_mirror_status_test.go b/ceph/rbd_mirror_status_test.go index 6dcfbbe..9f9937d 100644 --- a/ceph/rbd_mirror_status_test.go +++ b/ceph/rbd_mirror_status_test.go @@ -138,7 +138,7 @@ func TestRbdMirrorStatusCollector(t *testing.T) { // We do not create the rbdCollector since it will // be automatically initiated from the output of `ceph versions` // if the rbd-mirror key is present - e.cc = map[string]interface{}{} + e.cc = map[string]versionedCollector{} err := prometheus.Register(e) require.NoError(t, err) diff --git a/ceph/rgw_test.go b/ceph/rgw_test.go index af14614..31062e7 100644 --- a/ceph/rgw_test.go +++ b/ceph/rgw_test.go @@ -139,7 +139,7 @@ func TestRGWCollector(t *testing.T) { conn := setupVersionMocks(tt.version, "{}") e := &Exporter{Conn: conn, Cluster: "ceph", Logger: logrus.New()} - e.cc = map[string]interface{}{ + e.cc = map[string]versionedCollector{ "rgw": NewRGWCollector(e, false), }