diff --git a/telemetry/telemetry.go b/telemetry/telemetry.go index b82b802..bb03488 100644 --- a/telemetry/telemetry.go +++ b/telemetry/telemetry.go @@ -2,6 +2,7 @@ package telemetry import ( "context" + "sync" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/metric" @@ -42,6 +43,9 @@ type QueryDurationMetricParameters struct { type TelemetryContextKey struct{} var ( + telemetryInstancesLock sync.Mutex + // Warning: do not use directly, it may cause data race. + // Deprecated: this map will be renamed to telemetryInstances. TelemetryInstances map[*Configuration]*Telemetry TelemetryContext TelemetryContextKey ) @@ -65,6 +69,9 @@ func Get(factory TelemetryFactoryParameters) *Telemetry { configuration = DefaultTelemetryConfiguration() } + telemetryInstancesLock.Lock() + defer telemetryInstancesLock.Unlock() + if TelemetryInstances == nil { TelemetryInstances = make(map[*Configuration]*Telemetry) } diff --git a/telemetry/telemetry_test.go b/telemetry/telemetry_test.go index 50446e3..ff6f649 100644 --- a/telemetry/telemetry_test.go +++ b/telemetry/telemetry_test.go @@ -3,6 +3,7 @@ package telemetry import ( "context" "net/http" + "sync" "testing" "time" @@ -225,3 +226,24 @@ func TestBuildTelemetryAttributesMethod(t *testing.T) { t.Fatalf("Expected requestDuration to be 100, but got %v", requestDuration) } } + +// Run this test with the "-race" flag. +// +// go test -race -run ^TestGetRace$ github.com/openfga/go-sdk/telemetry +func TestGetRace(t *testing.T) { + t.Parallel() + + var wg sync.WaitGroup + + for i := 0; i < 10; i++ { + wg.Add(1) + + go func() { + defer wg.Done() + + Get(TelemetryFactoryParameters{}) + }() + } + + wg.Wait() +}