From f975a15dfde8fc37b42dd2d99b8048c3f01bd4a6 Mon Sep 17 00:00:00 2001 From: Brendan Roy Date: Thu, 11 Nov 2021 17:08:10 +1100 Subject: [PATCH 1/3] change resource.Default to be evaluated on first call, rather than on import --- sdk/resource/resource.go | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/sdk/resource/resource.go b/sdk/resource/resource.go index 6bb2a2805aa..3aedc85fa2d 100644 --- a/sdk/resource/resource.go +++ b/sdk/resource/resource.go @@ -36,26 +36,11 @@ type Resource struct { } var ( - emptyResource Resource - - defaultResource = func(r *Resource, err error) *Resource { - if err != nil { - otel.Handle(err) - } - return r - }( - Detect( - context.Background(), - defaultServiceNameDetector{}, - fromEnv{}, - telemetrySDK{}, - ), - ) + emptyResource Resource + defaultResource *Resource ) -var ( - errMergeConflictSchemaURL = errors.New("cannot merge resource due to conflicting Schema URL") -) +var errMergeConflictSchemaURL = errors.New("cannot merge resource due to conflicting Schema URL") // New returns a Resource combined from the user-provided detectors. func New(ctx context.Context, opts ...Option) (*Resource, error) { @@ -211,6 +196,18 @@ func Empty() *Resource { // Default returns an instance of Resource with a default // "service.name" and OpenTelemetrySDK attributes. func Default() *Resource { + if defaultResource == nil { + var err error + defaultResource, err = Detect( + context.Background(), + defaultServiceNameDetector{}, + fromEnv{}, + telemetrySDK{}, + ) + if err != nil { + otel.Handle(err) + } + } return defaultResource } From a62df0c7d9f87f57ceadbbd647da7075635fabb2 Mon Sep 17 00:00:00 2001 From: Brendan Roy Date: Fri, 12 Nov 2021 10:17:03 +1100 Subject: [PATCH 2/3] guard defaultResource creation with sync.Once, fallback to emtpyResource --- sdk/resource/resource.go | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/sdk/resource/resource.go b/sdk/resource/resource.go index 3aedc85fa2d..eb0ecd2cf91 100644 --- a/sdk/resource/resource.go +++ b/sdk/resource/resource.go @@ -18,6 +18,7 @@ import ( "context" "errors" "fmt" + "sync" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" @@ -36,8 +37,9 @@ type Resource struct { } var ( - emptyResource Resource - defaultResource *Resource + emptyResource Resource + defaultResource *Resource + defaultResourceOnce sync.Once ) var errMergeConflictSchemaURL = errors.New("cannot merge resource due to conflicting Schema URL") @@ -196,7 +198,7 @@ func Empty() *Resource { // Default returns an instance of Resource with a default // "service.name" and OpenTelemetrySDK attributes. func Default() *Resource { - if defaultResource == nil { + defaultResourceOnce.Do(func() { var err error defaultResource, err = Detect( context.Background(), @@ -207,7 +209,11 @@ func Default() *Resource { if err != nil { otel.Handle(err) } - } + // If Detect did not return a valid resource, fall back to emptyResource. + if defaultResource == nil { + defaultResource = &emptyResource + } + }) return defaultResource } From 0bee299dc7acaa4a7c62c1dba62a48d91dab7191 Mon Sep 17 00:00:00 2001 From: Brendan Roy Date: Sat, 13 Nov 2021 11:17:00 +1100 Subject: [PATCH 3/3] update CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b8164147ac..03a37cbabc0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm - The following struct types moved and are replaced with type aliases, since they are exposed to the user: `Observation`, `Measurement`. - The No-op implementations of sync and async instruments are no longer exported, new functions `sdkapi.NewNoopAsyncInstrument()` and `sdkapi.NewNoopSyncInstrument()` are provided instead. (#2271) - Update the SDK `BatchSpanProcessor` to export all queued spans when `ForceFlush` is called. (#2080, #2335) +- Change `resource.Default` to be evaluated the first time it is called, rather than on import. This allows the caller the option to update `OTEL_RESOURCE_ATTRIBUTES` first, such as with `os.Setenv`. (#2371) ### Added