From 3341a4b7671e46cf6c7183ec1b9c6d2b760bfe38 Mon Sep 17 00:00:00 2001 From: Jim McDonald Date: Tue, 5 Mar 2024 23:57:16 +0000 Subject: [PATCH] Add name to multi to differentiate multiple instances. --- multi/client.go | 8 ++++---- multi/metrics.go | 20 ++++++++++---------- multi/parameters.go | 8 ++++++++ multi/service.go | 17 ++++++++++++----- 4 files changed, 34 insertions(+), 19 deletions(-) diff --git a/multi/client.go b/multi/client.go index 17e1c0c6..86c3a135 100644 --- a/multi/client.go +++ b/multi/client.go @@ -81,7 +81,7 @@ func (s *Service) deactivateClient(ctx context.Context, client consensusclient.S for _, activeClient := range s.activeClients { if activeClient == client { inactiveClients = append(inactiveClients, activeClient) - setProviderStateMetric(ctx, client.Address(), "inactive") + s.setProviderStateMetric(ctx, client.Address(), "inactive") } else { activeClients = append(activeClients, activeClient) } @@ -95,7 +95,7 @@ func (s *Service) deactivateClient(ctx context.Context, client consensusclient.S s.activeClients = activeClients s.inactiveClients = inactiveClients - setConnectionsMetric(ctx, len(s.activeClients), len(s.inactiveClients)) + s.setConnectionsMetric(ctx, len(s.activeClients), len(s.inactiveClients)) } // activateClient activates a client, moving it to the active list if not currently on it. @@ -110,7 +110,7 @@ func (s *Service) activateClient(ctx context.Context, client consensusclient.Ser for _, inactiveClient := range s.inactiveClients { if inactiveClient == client { activeClients = append(activeClients, inactiveClient) - setProviderStateMetric(ctx, client.Address(), "active") + s.setProviderStateMetric(ctx, client.Address(), "active") } else { inactiveClients = append(inactiveClients, inactiveClient) } @@ -124,7 +124,7 @@ func (s *Service) activateClient(ctx context.Context, client consensusclient.Ser s.activeClients = activeClients s.inactiveClients = inactiveClients - setConnectionsMetric(ctx, len(s.activeClients), len(s.inactiveClients)) + s.setConnectionsMetric(ctx, len(s.activeClients), len(s.inactiveClients)) } // callFunc is the definition for a call function. It provides a generic return interface diff --git a/multi/metrics.go b/multi/metrics.go index bc19043b..4a832e71 100644 --- a/multi/metrics.go +++ b/multi/metrics.go @@ -48,7 +48,7 @@ func registerPrometheusMetrics(_ context.Context) error { Subsystem: "multi", Name: "connections", Help: "Number of connections", - }, []string{"state"}) + }, []string{"name", "state"}) if err := prometheus.Register(connectionsMetric); err != nil { return errors.Wrap(err, "failed to register connections") } @@ -57,7 +57,7 @@ func registerPrometheusMetrics(_ context.Context) error { Subsystem: "multi", Name: "connection_state", Help: "The state of the client connection (active/inactive)", - }, []string{"server", "state"}) + }, []string{"name", "server", "state"}) if err := prometheus.Register(stateMetric); err != nil { return errors.Wrap(err, "failed to register connection_state") } @@ -65,26 +65,26 @@ func registerPrometheusMetrics(_ context.Context) error { return nil } -func setProviderStateMetric(_ context.Context, server string, state string) { +func (s *Service) setProviderStateMetric(_ context.Context, server string, state string) { if stateMetric == nil { return } switch state { case "active": - stateMetric.WithLabelValues(server, "active").Set(1) - stateMetric.WithLabelValues(server, "inactive").Set(0) + stateMetric.WithLabelValues(s.name, server, "active").Set(1) + stateMetric.WithLabelValues(s.name, server, "inactive").Set(0) case "inactive": - stateMetric.WithLabelValues(server, "active").Set(0) - stateMetric.WithLabelValues(server, "inactive").Set(1) + stateMetric.WithLabelValues(s.name, server, "active").Set(0) + stateMetric.WithLabelValues(s.name, server, "inactive").Set(1) } } -func setConnectionsMetric(_ context.Context, active int, inactive int) { +func (s *Service) setConnectionsMetric(_ context.Context, active int, inactive int) { if connectionsMetric == nil { return } - connectionsMetric.WithLabelValues("active").Set(float64(active)) - connectionsMetric.WithLabelValues("inactive").Set(float64(inactive)) + connectionsMetric.WithLabelValues(s.name, "active").Set(float64(active)) + connectionsMetric.WithLabelValues(s.name, "inactive").Set(float64(inactive)) } diff --git a/multi/parameters.go b/multi/parameters.go index 0a64c386..d994d115 100644 --- a/multi/parameters.go +++ b/multi/parameters.go @@ -31,6 +31,7 @@ type parameters struct { extraHeaders map[string]string enforceJSON bool allowDelayedStart bool + name string } // Parameter is the interface for service parameters. @@ -100,6 +101,13 @@ func WithExtraHeaders(headers map[string]string) Parameter { }) } +// WithName sets the name for the multiclient. +func WithName(name string) Parameter { + return parameterFunc(func(p *parameters) { + p.name = name + }) +} + // parseAndCheckParameters parses and checks parameters to ensure that mandatory parameters are present and correct. func parseAndCheckParameters(params ...Parameter) (*parameters, error) { parameters := parameters{ diff --git a/multi/service.go b/multi/service.go index 566f278a..5e9460ef 100644 --- a/multi/service.go +++ b/multi/service.go @@ -28,6 +28,8 @@ import ( type Service struct { log zerolog.Logger + name string + clientsMu sync.RWMutex activeClients []consensusclient.Service inactiveClients []consensusclient.Service @@ -63,10 +65,8 @@ func New(ctx context.Context, params ...Parameter) (consensusclient.Service, err switch { case client.IsSynced(): activeClients = append(activeClients, client) - setProviderStateMetric(ctx, client.Address(), "active") default: inactiveClients = append(inactiveClients, client) - setProviderStateMetric(ctx, client.Address(), "inactive") } } for _, address := range parameters.addresses { @@ -86,24 +86,31 @@ func New(ctx context.Context, params ...Parameter) (consensusclient.Service, err switch { case client.IsSynced(): activeClients = append(activeClients, client) - setProviderStateMetric(ctx, client.Address(), "active") default: inactiveClients = append(inactiveClients, client) - setProviderStateMetric(ctx, client.Address(), "inactive") } } if len(activeClients) == 0 && !parameters.allowDelayedStart { return nil, consensusclient.ErrNotActive } log.Trace().Int("active", len(activeClients)).Int("inactive", len(inactiveClients)).Msg("Initial providers") - setConnectionsMetric(ctx, len(activeClients), len(inactiveClients)) s := &Service{ log: log, + name: parameters.name, activeClients: activeClients, inactiveClients: inactiveClients, } + // Set initial metrics. + for _, client := range s.activeClients { + s.setProviderStateMetric(ctx, client.Address(), "active") + } + for _, client := range s.inactiveClients { + s.setProviderStateMetric(ctx, client.Address(), "inactive") + } + s.setConnectionsMetric(ctx, len(activeClients), len(inactiveClients)) + // Kick off monitor. go s.monitor(ctx)