]> go.fuhry.dev Git - runtime.git/commitdiff
metricbus/mbclient: services are singletons
authorDan Fuhry <dan@fuhry.com>
Tue, 27 Feb 2024 21:22:15 +0000 (16:22 -0500)
committerDan Fuhry <dan@fuhry.com>
Tue, 27 Feb 2024 21:22:15 +0000 (16:22 -0500)
metrics/metricbus/mbclient/client.go

index d2a114532709f58ad3590592c60afcf612bb1fee..fd62fef71890c05c34e879c21ca46d14cba2f1b1 100644 (file)
@@ -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,