From bfb2d834bb0adcc4626b36b2ac9a5d3aed1a9dc5 Mon Sep 17 00:00:00 2001 From: Dan Fuhry Date: Tue, 27 Feb 2024 16:22:15 -0500 Subject: [PATCH] metricbus/mbclient: services are singletons --- metrics/metricbus/mbclient/client.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/metrics/metricbus/mbclient/client.go b/metrics/metricbus/mbclient/client.go index d2a1145..fd62fef 100644 --- a/metrics/metricbus/mbclient/client.go +++ b/metrics/metricbus/mbclient/client.go @@ -39,6 +39,9 @@ type MetricBusService struct { var defaultMetricBusServiceName string var defaultMetricBusServiceDiscriminator string +var store map[string]*MetricBusService +var storeLock sync.Mutex + func init() { taskName := strings.ReplaceAll(path.Base(os.Args[0]), "-", "_") flag.StringVar(&defaultMetricBusServiceName, "metricbus.client.service-name", taskName, "service name to use for publishing metrics") @@ -50,6 +53,24 @@ func NewService(ctx context.Context) *MetricBusService { } func NewServiceWithDiscriminator(ctx context.Context, instanceDiscriminator string) *MetricBusService { + storeLock.Lock() + defer storeLock.Unlock() + + if store == nil { + store = make(map[string]*MetricBusService) + } + + if instance, ok := store[instanceDiscriminator]; ok { + return instance + } + + instance := newServiceWithDiscriminator(ctx, instanceDiscriminator) + store[instanceDiscriminator] = instance + + return instance +} + +func newServiceWithDiscriminator(ctx context.Context, instanceDiscriminator string) *MetricBusService { childCtx, cancel := context.WithCancel(context.Background()) svc := &MetricBusService{ name: defaultMetricBusServiceName, -- 2.50.1