move to collector interface to avoid ugly switch

This commit is contained in:
Alex Marangone 2023-02-14 12:24:34 -08:00
parent 2235817fc4
commit 52ad633440
10 changed files with 22 additions and 55 deletions

View File

@ -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)

View File

@ -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)

View File

@ -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)
}
}

View File

@ -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),
}

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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),
}