diff --git a/agent/consul/server.go b/agent/consul/server.go index 3d083658554f..08677a6b17a4 100644 --- a/agent/consul/server.go +++ b/agent/consul/server.go @@ -569,15 +569,15 @@ func NewServer(config *Config, flat Deps) (*Server, error) { WithStateProvider(s.fsm). WithLogger(s.logger). WithDatacenter(s.config.Datacenter). - WithReportingInterval(s.config.MetricsReportingInterval), - func() []serf.Member { - members, err := s.LANMembersAllSegments() - if err != nil { - return []serf.Member{} - } + WithReportingInterval(s.config.MetricsReportingInterval). + WithGetMembersFunc(func() []serf.Member { + members, err := s.LANMembersAllSegments() + if err != nil { + return []serf.Member{} + } - return members - }, + return members + }), ) if err != nil { s.Shutdown() diff --git a/agent/consul/usagemetrics/usagemetrics.go b/agent/consul/usagemetrics/usagemetrics.go index 6d826cc1de98..353e9a45df61 100644 --- a/agent/consul/usagemetrics/usagemetrics.go +++ b/agent/consul/usagemetrics/usagemetrics.go @@ -37,6 +37,8 @@ var Gauges = []prometheus.GaugeDefinition{ }, } +type getMembersFunc func() []serf.Member + // Config holds the settings for various parameters for the // UsageMetricsReporter type Config struct { @@ -44,6 +46,7 @@ type Config struct { metricLabels []metrics.Label stateProvider StateProvider tickerInterval time.Duration + getMembersFunc getMembersFunc } // WithDatacenter adds the datacenter as a label to all metrics emitted by the @@ -72,14 +75,18 @@ func (c *Config) WithStateProvider(sp StateProvider) *Config { return c } +// WithGetMembersFunc specifies the function used to identify cluster members +func (c *Config) WithGetMembersFunc(fn getMembersFunc) *Config { + c.getMembersFunc = fn + return c +} + // StateProvider defines an inteface for retrieving a state.Store handle. In // non-test code, this is satisfied by the fsm.FSM struct. type StateProvider interface { State() *state.Store } -type getMembersFunc func() []serf.Member - // UsageMetricsReporter provides functionality for emitting usage metrics into // the metrics stream. This makes it essentially a translation layer // between the state store and metrics stream. @@ -91,11 +98,15 @@ type UsageMetricsReporter struct { getMembersFunc getMembersFunc } -func NewUsageMetricsReporter(cfg *Config, getMembersFunc getMembersFunc) (*UsageMetricsReporter, error) { +func NewUsageMetricsReporter(cfg *Config) (*UsageMetricsReporter, error) { if cfg.stateProvider == nil { return nil, errors.New("must provide a StateProvider to usage reporter") } + if cfg.getMembersFunc == nil { + return nil, errors.New("must provide a getMembersFunc to usage reporter") + } + if cfg.logger == nil { cfg.logger = hclog.NewNullLogger() } @@ -110,7 +121,7 @@ func NewUsageMetricsReporter(cfg *Config, getMembersFunc getMembersFunc) (*Usage stateProvider: cfg.stateProvider, metricLabels: cfg.metricLabels, tickerInterval: cfg.tickerInterval, - getMembersFunc: getMembersFunc, + getMembersFunc: cfg.getMembersFunc, } return u, nil diff --git a/agent/consul/usagemetrics/usagemetrics_oss_test.go b/agent/consul/usagemetrics/usagemetrics_oss_test.go index 0c104ce8a920..8a6a2a1b764b 100644 --- a/agent/consul/usagemetrics/usagemetrics_oss_test.go +++ b/agent/consul/usagemetrics/usagemetrics_oss_test.go @@ -62,6 +62,7 @@ func TestUsageReporter_emitServiceUsage_OSS(t *testing.T) { }, }, }, + getMembersFunc: func() []serf.Member { return []serf.Member{} }, }, "nodes-and-services": { modfiyStateStore: func(t *testing.T, s *state.Store) { @@ -159,8 +160,8 @@ func TestUsageReporter_emitServiceUsage_OSS(t *testing.T) { new(Config). WithStateProvider(mockStateProvider). WithLogger(testutil.Logger(t)). - WithDatacenter("dc1"), - tcase.getMembersFunc, + WithDatacenter("dc1"). + WithGetMembersFunc(tcase.getMembersFunc), ) require.NoError(t, err) diff --git a/agent/consul/usagemetrics/usagemetrics_test.go b/agent/consul/usagemetrics/usagemetrics_test.go index 26f7e89b0fcf..1c4be1d5b177 100644 --- a/agent/consul/usagemetrics/usagemetrics_test.go +++ b/agent/consul/usagemetrics/usagemetrics_test.go @@ -38,6 +38,7 @@ func TestUsageReporter_Run_Nodes(t *testing.T) { Labels: []metrics.Label{{Name: "datacenter", Value: "dc1"}}, }, }, + getMembersFunc: func() []serf.Member { return []serf.Member{} }, }, "nodes": { modfiyStateStore: func(t *testing.T, s *state.Store) { @@ -104,8 +105,8 @@ func TestUsageReporter_Run_Nodes(t *testing.T) { new(Config). WithStateProvider(mockStateProvider). WithLogger(testutil.Logger(t)). - WithDatacenter("dc1"), - tcase.getMembersFunc, + WithDatacenter("dc1"). + WithGetMembersFunc(tcase.getMembersFunc), ) require.NoError(t, err)