From ca9498f407fce1d217ba969a826c0d4a423a347f Mon Sep 17 00:00:00 2001 From: Israel Blancas Date: Tue, 10 Mar 2026 11:36:23 +0100 Subject: [PATCH 1/5] Add SDK.Resource() to otelconf/v0.3.0 Signed-off-by: Israel Blancas --- CHANGELOG.md | 1 + otelconf/v0.3.0/config.go | 9 ++++++ otelconf/v0.3.0/config_resource_test.go | 41 +++++++++++++++++++++++++ 3 files changed, 51 insertions(+) create mode 100644 otelconf/v0.3.0/config_resource_test.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 492476d1282..b844da931c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm ### Added - Add environment variables propagation carrier in `go.opentelemetry.io/contrib/propagators/envcar`. (#8442) +- Add `Resource` method to `SDK` in `go.opentelemetry.io/contrib/otelconf/v0.3.0` to expose the resolved SDK resource from declarative configuration. (#8659) ### Changed diff --git a/otelconf/v0.3.0/config.go b/otelconf/v0.3.0/config.go index f4bbe39f8e3..a42d90eba9d 100644 --- a/otelconf/v0.3.0/config.go +++ b/otelconf/v0.3.0/config.go @@ -16,6 +16,7 @@ import ( noopmetric "go.opentelemetry.io/otel/metric/noop" sdklog "go.opentelemetry.io/otel/sdk/log" sdkmetric "go.opentelemetry.io/otel/sdk/metric" + sdkresource "go.opentelemetry.io/otel/sdk/resource" sdktrace "go.opentelemetry.io/otel/sdk/trace" "go.opentelemetry.io/otel/trace" nooptrace "go.opentelemetry.io/otel/trace/noop" @@ -52,6 +53,7 @@ type SDK struct { meterProvider metric.MeterProvider tracerProvider trace.TracerProvider loggerProvider log.LoggerProvider + resource *sdkresource.Resource shutdown shutdownFunc } @@ -70,6 +72,11 @@ func (s *SDK) LoggerProvider() log.LoggerProvider { return s.loggerProvider } +// Resource returns the resolved SDK resource configured in this SDK. +func (s *SDK) Resource() *sdkresource.Resource { + return s.resource +} + // Shutdown calls shutdown on all configured providers. func (s *SDK) Shutdown(ctx context.Context) error { return s.shutdown(ctx) @@ -79,6 +86,7 @@ var noopSDK = SDK{ loggerProvider: nooplog.LoggerProvider{}, meterProvider: noopmetric.MeterProvider{}, tracerProvider: nooptrace.TracerProvider{}, + resource: sdkresource.Empty(), shutdown: func(context.Context) error { return nil }, } @@ -115,6 +123,7 @@ func NewSDK(opts ...ConfigurationOption) (SDK, error) { meterProvider: mp, tracerProvider: tp, loggerProvider: lp, + resource: r, shutdown: func(ctx context.Context) error { return errors.Join(mpShutdown(ctx), tpShutdown(ctx), lpShutdown(ctx)) }, diff --git a/otelconf/v0.3.0/config_resource_test.go b/otelconf/v0.3.0/config_resource_test.go new file mode 100644 index 00000000000..3f1280e91db --- /dev/null +++ b/otelconf/v0.3.0/config_resource_test.go @@ -0,0 +1,41 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package otelconf + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "go.opentelemetry.io/otel/attribute" +) + +func TestSDKResource(t *testing.T) { + t.Run("returns resource even when providers are not configured", func(t *testing.T) { + sdk, err := NewSDK( + WithOpenTelemetryConfiguration(OpenTelemetryConfiguration{ + Resource: &Resource{ + Attributes: []AttributeNameValue{ + {Name: "service.name", Value: "collector"}, + }, + }, + }), + ) + assert.NoError(t, err) + + res := sdk.Resource() + assert.NotNil(t, res) + assert.Contains(t, res.Attributes(), attribute.String("service.name", "collector")) + }) + + t.Run("returns empty resource for disabled sdk", func(t *testing.T) { + sdk, err := NewSDK( + WithOpenTelemetryConfiguration(OpenTelemetryConfiguration{ + Disabled: ptr(true), + }), + ) + assert.NoError(t, err) + assert.NotNil(t, sdk.Resource()) + assert.Empty(t, sdk.Resource().Attributes()) + }) +} From a937d5f285329100ce3f10236e3247f69b912998 Mon Sep 17 00:00:00 2001 From: Israel Blancas Date: Tue, 10 Mar 2026 15:24:42 +0100 Subject: [PATCH 2/5] Fix changelog Signed-off-by: Israel Blancas --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 26a075839ce..7f0c045e709 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,10 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm ## [Unreleased] +### Added + +- Add `Resource` method to `SDK` in `go.opentelemetry.io/contrib/otelconf/v0.3.0` to expose the resolved SDK resource from declarative configuration. (#8659) + ### Fixed - Limit the request body size at 1MB in `go.opentelemetry.io/contrib/zpages`. (#8656) @@ -20,7 +24,6 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm ### Added - Add environment variables propagation carrier in `go.opentelemetry.io/contrib/propagators/envcar`. (#8442) -- Add `Resource` method to `SDK` in `go.opentelemetry.io/contrib/otelconf/v0.3.0` to expose the resolved SDK resource from declarative configuration. (#8659) ### Changed From e0c59666498dde1b93acfa4a7d005fae253949ab Mon Sep 17 00:00:00 2001 From: Israel Blancas Date: Mon, 16 Mar 2026 17:18:19 +0100 Subject: [PATCH 3/5] Ensure field is not mutable Signed-off-by: Israel Blancas --- otelconf/v0.3.0/config.go | 8 ++++++-- otelconf/v0.3.0/config_resource_test.go | 24 ++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/otelconf/v0.3.0/config.go b/otelconf/v0.3.0/config.go index a42d90eba9d..7a2b8820d40 100644 --- a/otelconf/v0.3.0/config.go +++ b/otelconf/v0.3.0/config.go @@ -72,9 +72,13 @@ func (s *SDK) LoggerProvider() log.LoggerProvider { return s.loggerProvider } -// Resource returns the resolved SDK resource configured in this SDK. +// Resource returns a copy of the resolved SDK resource configured in this SDK. func (s *SDK) Resource() *sdkresource.Resource { - return s.resource + if s.resource == nil { + return nil + } + res := *s.resource + return &res } // Shutdown calls shutdown on all configured providers. diff --git a/otelconf/v0.3.0/config_resource_test.go b/otelconf/v0.3.0/config_resource_test.go index 3f1280e91db..ec8776a6ffe 100644 --- a/otelconf/v0.3.0/config_resource_test.go +++ b/otelconf/v0.3.0/config_resource_test.go @@ -8,6 +8,7 @@ import ( "github.com/stretchr/testify/assert" "go.opentelemetry.io/otel/attribute" + sdkresource "go.opentelemetry.io/otel/sdk/resource" ) func TestSDKResource(t *testing.T) { @@ -38,4 +39,27 @@ func TestSDKResource(t *testing.T) { assert.NotNil(t, sdk.Resource()) assert.Empty(t, sdk.Resource().Attributes()) }) + + t.Run("returns a defensive copy", func(t *testing.T) { + sdk, err := NewSDK( + WithOpenTelemetryConfiguration(OpenTelemetryConfiguration{ + Resource: &Resource{ + Attributes: []AttributeNameValue{ + {Name: "service.name", Value: "collector"}, + }, + }, + }), + ) + assert.NoError(t, err) + + res := sdk.Resource() + assert.NotNil(t, res) + + newRes := sdkresource.NewSchemaless(attribute.String("service.name", "mutated")) + *res = *newRes + + assert.Contains(t, res.Attributes(), attribute.String("service.name", "mutated")) + assert.Contains(t, sdk.Resource().Attributes(), attribute.String("service.name", "collector")) + assert.NotContains(t, sdk.Resource().Attributes(), attribute.String("service.name", "mutated")) + }) } From 21293fef7ebc4f94913734923faf622b445ea1ce Mon Sep 17 00:00:00 2001 From: Damien Mathieu <42@dmathieu.com> Date: Tue, 17 Mar 2026 09:06:28 +0100 Subject: [PATCH 4/5] Update CHANGELOG.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Flcă‚› --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index df61c11c189..f8e24acf29f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm ### Added -- Add `Resource` method to `SDK` in `go.opentelemetry.io/contrib/otelconf/v0.3.0` to expose the resolved SDK resource from declarative configuration. (#8659) +- Add `Resource` method to `SDK` in `go.opentelemetry.io/contrib/otelconf/v0.3.0` to expose the resolved SDK resource from declarative configuration. (#8660) - Configuration file can now be set via `OTEL_CONFIG_FILE` in `go.opentelemetry.io/contrib/otelconf`. (#8639) ### Fixed From 46c34e899f86d2f8e085cb8259f5544d465f6ff0 Mon Sep 17 00:00:00 2001 From: Israel Blancas Date: Tue, 17 Mar 2026 13:08:20 +0100 Subject: [PATCH 5/5] Address changes from code review Signed-off-by: Israel Blancas --- otelconf/v0.3.0/config.go | 1 + otelconf/v0.3.0/config_resource_test.go | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/otelconf/v0.3.0/config.go b/otelconf/v0.3.0/config.go index 7a2b8820d40..a7ae24ed090 100644 --- a/otelconf/v0.3.0/config.go +++ b/otelconf/v0.3.0/config.go @@ -73,6 +73,7 @@ func (s *SDK) LoggerProvider() log.LoggerProvider { } // Resource returns a copy of the resolved SDK resource configured in this SDK. +// The copy preserves the immutability of the SDK-owned resource. func (s *SDK) Resource() *sdkresource.Resource { if s.resource == nil { return nil diff --git a/otelconf/v0.3.0/config_resource_test.go b/otelconf/v0.3.0/config_resource_test.go index ec8776a6ffe..35b9dd0aece 100644 --- a/otelconf/v0.3.0/config_resource_test.go +++ b/otelconf/v0.3.0/config_resource_test.go @@ -12,6 +12,11 @@ import ( ) func TestSDKResource(t *testing.T) { + t.Run("returns nil for zero value sdk", func(t *testing.T) { + var sdk SDK + assert.Nil(t, sdk.Resource()) + }) + t.Run("returns resource even when providers are not configured", func(t *testing.T) { sdk, err := NewSDK( WithOpenTelemetryConfiguration(OpenTelemetryConfiguration{