diff --git a/metrics/registry.go b/metrics/registry.go index 24b9ab579d5..885cb5f2b61 100644 --- a/metrics/registry.go +++ b/metrics/registry.go @@ -77,20 +77,7 @@ func (r *Registry) newMetric(name string, mt MetricType, vt ...ValueType) *Metri valueType = vt[0] } - var sink Sink - switch mt { - case Counter: - sink = &CounterSink{} - case Gauge: - sink = &GaugeSink{} - case Trend: - sink = &TrendSink{} - case Rate: - sink = &RateSink{} - default: - return nil - } - + sink := NewSink(mt) return &Metric{ registry: r, Name: name, diff --git a/metrics/sink.go b/metrics/sink.go index ed65b6a289b..e238dae7850 100644 --- a/metrics/sink.go +++ b/metrics/sink.go @@ -2,6 +2,7 @@ package metrics import ( "errors" + "fmt" "math" "sort" "time" @@ -21,6 +22,28 @@ type Sink interface { IsEmpty() bool // Check if the Sink is empty. } +// NewSink creates the related Sink for +// the provided MetricType. +func NewSink(mt MetricType) Sink { + var sink Sink + switch mt { + case Counter: + sink = &CounterSink{} + case Gauge: + sink = &GaugeSink{} + case Trend: + sink = &TrendSink{} + case Rate: + sink = &RateSink{} + default: + // Should not be possible to create + // an invalid metric type except for specific + // and controlled tests + panic(fmt.Sprintf("MetricType %q is not supported", mt)) + } + return sink +} + type CounterSink struct { Value float64 First time.Time diff --git a/metrics/sink_test.go b/metrics/sink_test.go index b5c1b5c6ab8..ddf7081267d 100644 --- a/metrics/sink_test.go +++ b/metrics/sink_test.go @@ -9,6 +9,28 @@ import ( "github.com/stretchr/testify/require" ) +func TestNewSink(t *testing.T) { + t.Parallel() + + tests := []struct { + sink interface{} + mt MetricType + }{ + {mt: Counter, sink: &CounterSink{}}, + {mt: Gauge, sink: &GaugeSink{}}, + {mt: Rate, sink: &RateSink{}}, + {mt: Trend, sink: &TrendSink{}}, + } + for _, tc := range tests { + assert.Equal(t, tc.sink, NewSink(tc.mt)) + } +} + +func TestNewSinkInvalidMetricType(t *testing.T) { + t.Parallel() + assert.Panics(t, func() { NewSink(MetricType(6)) }) +} + func TestCounterSink(t *testing.T) { samples10 := []float64{1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 100.0} now := time.Now()