From b166c58e30713f889e70524efc8b1caf8570a695 Mon Sep 17 00:00:00 2001 From: Alex Boten Date: Wed, 11 Oct 2023 09:52:33 -0700 Subject: [PATCH 1/5] [config] add NewSDK func For now it's returning a noop tracer/meter provider if no configuration is found. Otherwise it returns an unconfigured SDK meter/tracer provider. This PR is mostly to start putting the pieces together for the interface. Signed-off-by: Alex Boten --- config/config.go | 74 +++++++++++++++++++++++++++++++++++++++++++ config/config_test.go | 50 +++++++++++++++++++++++++++++ config/go.mod | 18 +++++++++++ config/go.sum | 28 ++++++++++++++++ config/metric.go | 17 ++++++++++ config/metric_test.go | 29 +++++++++++++++++ config/trace.go | 16 ++++++++++ config/trace_test.go | 28 ++++++++++++++++ 8 files changed, 260 insertions(+) create mode 100644 config/config.go create mode 100644 config/config_test.go create mode 100644 config/go.sum create mode 100644 config/metric.go create mode 100644 config/metric_test.go create mode 100644 config/trace.go create mode 100644 config/trace_test.go diff --git a/config/config.go b/config/config.go new file mode 100644 index 00000000000..3633694ea62 --- /dev/null +++ b/config/config.go @@ -0,0 +1,74 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package config // import go.opentelemetry.io/contrib/config + +import ( + "context" + + "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/trace" +) + +type configOptions struct { + ctx context.Context + opentelemetryConfig OpenTelemetryConfiguration +} + +// SDK is a struct that contains all the providers +// configured via the configuration model. +type SDK struct { + meterProvider metric.MeterProvider + tracerProvider trace.TracerProvider +} + +// TracerProvider returns a configured trace.TracerProvider. +func (s *SDK) TracerProvider() trace.TracerProvider { + return s.tracerProvider +} + +// MeterProvider returns a configured metric.MeterProvider. +func (s *SDK) MeterProvider() metric.MeterProvider { + return s.meterProvider +} + +// NewSDK creates SDK providers based on the configuration model. +func NewSDK(opts ...ConfigurationOption) (SDK, error) { + o := configOptions{} + for _, opt := range opts { + o = opt.apply(o) + } + + return SDK{ + meterProvider: initMeterProvider(o), + tracerProvider: initTracerProvider(o), + }, nil +} + +// ConfigurationOption configures options for providers. +type ConfigurationOption interface { + apply(configOptions) configOptions +} + +type configurationOptionFunc func(configOptions) configOptions + +func (fn configurationOptionFunc) apply(cfg configOptions) configOptions { + return fn(cfg) +} + +// WithContext sets the context.Context for the SDK. +func WithContext(ctx context.Context) ConfigurationOption { + return configurationOptionFunc(func(c configOptions) configOptions { + c.ctx = ctx + return c + }) +} + +// WithOpenTelemetryConfiguration sets the OpenTelemetryConfiguration used +// to produce the SDK. +func WithOpenTelemetryConfiguration(cfg OpenTelemetryConfiguration) ConfigurationOption { + return configurationOptionFunc(func(c configOptions) configOptions { + c.opentelemetryConfig = cfg + return c + }) +} diff --git a/config/config_test.go b/config/config_test.go new file mode 100644 index 00000000000..0f3d4143fbd --- /dev/null +++ b/config/config_test.go @@ -0,0 +1,50 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package config + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + + "go.opentelemetry.io/otel/metric/noop" + sdkmetric "go.opentelemetry.io/otel/sdk/metric" + sdktrace "go.opentelemetry.io/otel/sdk/trace" + "go.opentelemetry.io/otel/trace" +) + +func TestNewSDK(t *testing.T) { + tests := []struct { + name string + cfg []ConfigurationOption + tracerProvider any + meterProvider any + err error + }{ + { + name: "no-configuration", + tracerProvider: trace.NewNoopTracerProvider(), + meterProvider: noop.NewMeterProvider(), + }, + { + name: "with-configuration", + cfg: []ConfigurationOption{ + WithContext(context.Background()), + WithOpenTelemetryConfiguration(OpenTelemetryConfiguration{ + TracerProvider: &TracerProvider{}, + MeterProvider: &MeterProvider{}, + }), + }, + tracerProvider: &sdktrace.TracerProvider{}, + meterProvider: &sdkmetric.MeterProvider{}, + }, + } + for _, tt := range tests { + sdk, err := NewSDK(tt.cfg...) + require.Equal(t, tt.err, err) + require.IsType(t, tt.tracerProvider, sdk.TracerProvider()) + require.IsType(t, tt.meterProvider, sdk.MeterProvider()) + } +} diff --git a/config/go.mod b/config/go.mod index fbc5eba1f3f..4a586473258 100644 --- a/config/go.mod +++ b/config/go.mod @@ -1,3 +1,21 @@ module go.opentelemetry.io/contrib/config go 1.20 + +require ( + github.com/stretchr/testify v1.8.4 + go.opentelemetry.io/otel/metric v1.19.0 + go.opentelemetry.io/otel/sdk v1.19.0 + go.opentelemetry.io/otel/sdk/metric v1.19.0 + go.opentelemetry.io/otel/trace v1.19.0 +) + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/go-logr/logr v1.2.4 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + go.opentelemetry.io/otel v1.19.0 // indirect + golang.org/x/sys v0.12.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/config/go.sum b/config/go.sum new file mode 100644 index 00000000000..fccb7e1e383 --- /dev/null +++ b/config/go.sum @@ -0,0 +1,28 @@ +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= +github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +go.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs= +go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= +go.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE= +go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8= +go.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o= +go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A= +go.opentelemetry.io/otel/sdk/metric v1.19.0 h1:EJoTO5qysMsYCa+w4UghwFV/ptQgqSL/8Ni+hx+8i1k= +go.opentelemetry.io/otel/sdk/metric v1.19.0/go.mod h1:XjG0jQyFJrv2PbMvwND7LwCEhsJzCzV5210euduKcKY= +go.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg= +go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= +golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/config/metric.go b/config/metric.go new file mode 100644 index 00000000000..3802f518594 --- /dev/null +++ b/config/metric.go @@ -0,0 +1,17 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package config // import go.opentelemetry.io/contrib/config + +import ( + "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/metric/noop" + sdkmetric "go.opentelemetry.io/otel/sdk/metric" +) + +func initMeterProvider(cfg configOptions) metric.MeterProvider { + if cfg.opentelemetryConfig.MeterProvider == nil { + return noop.NewMeterProvider() + } + return sdkmetric.NewMeterProvider() +} diff --git a/config/metric_test.go b/config/metric_test.go new file mode 100644 index 00000000000..2eefd1aba58 --- /dev/null +++ b/config/metric_test.go @@ -0,0 +1,29 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package config + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/metric/noop" +) + +func TestInitMeterProvider(t *testing.T) { + tests := []struct { + name string + cfg configOptions + provider metric.MeterProvider + }{ + { + name: "no-meter-provider-configured", + provider: noop.NewMeterProvider(), + }, + } + for _, tt := range tests { + require.Equal(t, tt.provider, initMeterProvider(tt.cfg)) + } +} diff --git a/config/trace.go b/config/trace.go new file mode 100644 index 00000000000..68a2d549e54 --- /dev/null +++ b/config/trace.go @@ -0,0 +1,16 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package config // import go.opentelemetry.io/contrib/config + +import ( + sdktrace "go.opentelemetry.io/otel/sdk/trace" + "go.opentelemetry.io/otel/trace" +) + +func initTracerProvider(cfg configOptions) trace.TracerProvider { + if cfg.opentelemetryConfig.TracerProvider == nil { + return trace.NewNoopTracerProvider() + } + return sdktrace.NewTracerProvider() +} diff --git a/config/trace_test.go b/config/trace_test.go new file mode 100644 index 00000000000..5400d175119 --- /dev/null +++ b/config/trace_test.go @@ -0,0 +1,28 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package config + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "go.opentelemetry.io/otel/trace" +) + +func TestInitTracerPovider(t *testing.T) { + tests := []struct { + name string + cfg configOptions + provider trace.TracerProvider + }{ + { + name: "no-tracer-provider-configured", + provider: trace.NewNoopTracerProvider(), + }, + } + for _, tt := range tests { + require.Equal(t, tt.provider, initTracerProvider(tt.cfg)) + } +} From f24cfcc9ea145e724a853812ab0c719f23495d36 Mon Sep 17 00:00:00 2001 From: Alex Boten Date: Wed, 11 Oct 2023 10:32:35 -0700 Subject: [PATCH 2/5] Update config/config_test.go MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Robert PajÄ…k --- config/config_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/config_test.go b/config/config_test.go index 0f3d4143fbd..0ab95e1fe94 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -44,7 +44,7 @@ func TestNewSDK(t *testing.T) { for _, tt := range tests { sdk, err := NewSDK(tt.cfg...) require.Equal(t, tt.err, err) - require.IsType(t, tt.tracerProvider, sdk.TracerProvider()) - require.IsType(t, tt.meterProvider, sdk.MeterProvider()) + assert.IsType(t, tt.tracerProvider, sdk.TracerProvider()) + assert.IsType(t, tt.meterProvider, sdk.MeterProvider()) } } From 575334347895acb4a5843d1427ec547583c24c50 Mon Sep 17 00:00:00 2001 From: Alex Boten Date: Wed, 11 Oct 2023 11:03:13 -0700 Subject: [PATCH 3/5] rename test vars as per feedback Signed-off-by: Alex Boten --- CHANGELOG.md | 3 ++- config/config_test.go | 27 ++++++++++++++------------- config/metric_test.go | 12 ++++++------ config/trace_test.go | 12 ++++++------ 4 files changed, 28 insertions(+), 26 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1af4e337007..015a6383a3a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,8 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm - Add the new `go.opentelemetry.io/contrib/instrgen` package to provide auto-generated source code instrumentation. (#3068, #3108) - Add `"go.opentelemetry.io/contrib/samplers/jaegerremote".WithSamplingStrategyFetcher` which sets custom fetcher implementation. (#4045) -- Add `"go.opentelemetry.io/contrib/config"` package that includes configuration models generated via go-jsonschema (#4376) +- Add `"go.opentelemetry.io/contrib/config"` package that includes configuration models generated via go-jsonschema. (#4376) +- Add `NewSDK` method to `"go.opentelemetry.io/contrib/config"`. The initial implementation only returns noop providers. (#4414) ### Changed diff --git a/config/config_test.go b/config/config_test.go index 0ab95e1fe94..f54efd87221 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -7,6 +7,7 @@ import ( "context" "testing" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.opentelemetry.io/otel/metric/noop" @@ -17,16 +18,16 @@ import ( func TestNewSDK(t *testing.T) { tests := []struct { - name string - cfg []ConfigurationOption - tracerProvider any - meterProvider any - err error + name string + cfg []ConfigurationOption + wantTracerProvider any + wantMeterProvider any + wantErr error }{ { - name: "no-configuration", - tracerProvider: trace.NewNoopTracerProvider(), - meterProvider: noop.NewMeterProvider(), + name: "no-configuration", + wantTracerProvider: trace.NewNoopTracerProvider(), + wantMeterProvider: noop.NewMeterProvider(), }, { name: "with-configuration", @@ -37,14 +38,14 @@ func TestNewSDK(t *testing.T) { MeterProvider: &MeterProvider{}, }), }, - tracerProvider: &sdktrace.TracerProvider{}, - meterProvider: &sdkmetric.MeterProvider{}, + wantTracerProvider: &sdktrace.TracerProvider{}, + wantMeterProvider: &sdkmetric.MeterProvider{}, }, } for _, tt := range tests { sdk, err := NewSDK(tt.cfg...) - require.Equal(t, tt.err, err) - assert.IsType(t, tt.tracerProvider, sdk.TracerProvider()) - assert.IsType(t, tt.meterProvider, sdk.MeterProvider()) + require.Equal(t, tt.wantErr, err) + assert.IsType(t, tt.wantTracerProvider, sdk.TracerProvider()) + assert.IsType(t, tt.wantMeterProvider, sdk.MeterProvider()) } } diff --git a/config/metric_test.go b/config/metric_test.go index 2eefd1aba58..1d72612c55a 100644 --- a/config/metric_test.go +++ b/config/metric_test.go @@ -14,16 +14,16 @@ import ( func TestInitMeterProvider(t *testing.T) { tests := []struct { - name string - cfg configOptions - provider metric.MeterProvider + name string + cfg configOptions + wantProvider metric.MeterProvider }{ { - name: "no-meter-provider-configured", - provider: noop.NewMeterProvider(), + name: "no-meter-provider-configured", + wantProvider: noop.NewMeterProvider(), }, } for _, tt := range tests { - require.Equal(t, tt.provider, initMeterProvider(tt.cfg)) + require.Equal(t, tt.wantProvider, initMeterProvider(tt.cfg)) } } diff --git a/config/trace_test.go b/config/trace_test.go index 5400d175119..52a9717cd7b 100644 --- a/config/trace_test.go +++ b/config/trace_test.go @@ -13,16 +13,16 @@ import ( func TestInitTracerPovider(t *testing.T) { tests := []struct { - name string - cfg configOptions - provider trace.TracerProvider + name string + cfg configOptions + wantProvider trace.TracerProvider }{ { - name: "no-tracer-provider-configured", - provider: trace.NewNoopTracerProvider(), + name: "no-tracer-provider-configured", + wantProvider: trace.NewNoopTracerProvider(), }, } for _, tt := range tests { - require.Equal(t, tt.provider, initTracerProvider(tt.cfg)) + require.Equal(t, tt.wantProvider, initTracerProvider(tt.cfg)) } } From 8178684d4b17b1fa11ba47b0b69b01f013113280 Mon Sep 17 00:00:00 2001 From: Alex Boten Date: Wed, 11 Oct 2023 11:26:01 -0700 Subject: [PATCH 4/5] precommit Signed-off-by: Alex Boten --- config/config.go | 2 +- config/metric.go | 2 +- config/trace.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/config/config.go b/config/config.go index 3633694ea62..8d77a783369 100644 --- a/config/config.go +++ b/config/config.go @@ -1,7 +1,7 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -package config // import go.opentelemetry.io/contrib/config +package config // import "go.opentelemetry.io/contrib/config" import ( "context" diff --git a/config/metric.go b/config/metric.go index 3802f518594..998b946e2bb 100644 --- a/config/metric.go +++ b/config/metric.go @@ -1,7 +1,7 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -package config // import go.opentelemetry.io/contrib/config +package config // import "go.opentelemetry.io/contrib/config" import ( "go.opentelemetry.io/otel/metric" diff --git a/config/trace.go b/config/trace.go index 68a2d549e54..6d2c78854d1 100644 --- a/config/trace.go +++ b/config/trace.go @@ -1,7 +1,7 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -package config // import go.opentelemetry.io/contrib/config +package config // import "go.opentelemetry.io/contrib/config" import ( sdktrace "go.opentelemetry.io/otel/sdk/trace" From be372c426aad46bc648727a67a87022e29e59561 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20Paj=C4=85k?= Date: Wed, 11 Oct 2023 21:18:18 +0200 Subject: [PATCH 5/5] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 015a6383a3a..a6c3680cdd5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,7 +13,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm - Add the new `go.opentelemetry.io/contrib/instrgen` package to provide auto-generated source code instrumentation. (#3068, #3108) - Add `"go.opentelemetry.io/contrib/samplers/jaegerremote".WithSamplingStrategyFetcher` which sets custom fetcher implementation. (#4045) - Add `"go.opentelemetry.io/contrib/config"` package that includes configuration models generated via go-jsonschema. (#4376) -- Add `NewSDK` method to `"go.opentelemetry.io/contrib/config"`. The initial implementation only returns noop providers. (#4414) +- Add `NewSDK` function to `"go.opentelemetry.io/contrib/config"`. The initial implementation only returns noop providers. (#4414) ### Changed