Skip to content

Commit 8918009

Browse files
author
Alex Boten
authored
[config] add NewSDK func (#4414)
1 parent 488b204 commit 8918009

File tree

9 files changed

+263
-1
lines changed

9 files changed

+263
-1
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
1212

1313
- Add the new `go.opentelemetry.io/contrib/instrgen` package to provide auto-generated source code instrumentation. (#3068, #3108)
1414
- Add `"go.opentelemetry.io/contrib/samplers/jaegerremote".WithSamplingStrategyFetcher` which sets custom fetcher implementation. (#4045)
15-
- Add `"go.opentelemetry.io/contrib/config"` package that includes configuration models generated via go-jsonschema (#4376)
15+
- Add `"go.opentelemetry.io/contrib/config"` package that includes configuration models generated via go-jsonschema. (#4376)
16+
- Add `NewSDK` function to `"go.opentelemetry.io/contrib/config"`. The initial implementation only returns noop providers. (#4414)
1617

1718
### Changed
1819

config/config.go

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package config // import "go.opentelemetry.io/contrib/config"
5+
6+
import (
7+
"context"
8+
9+
"go.opentelemetry.io/otel/metric"
10+
"go.opentelemetry.io/otel/trace"
11+
)
12+
13+
type configOptions struct {
14+
ctx context.Context
15+
opentelemetryConfig OpenTelemetryConfiguration
16+
}
17+
18+
// SDK is a struct that contains all the providers
19+
// configured via the configuration model.
20+
type SDK struct {
21+
meterProvider metric.MeterProvider
22+
tracerProvider trace.TracerProvider
23+
}
24+
25+
// TracerProvider returns a configured trace.TracerProvider.
26+
func (s *SDK) TracerProvider() trace.TracerProvider {
27+
return s.tracerProvider
28+
}
29+
30+
// MeterProvider returns a configured metric.MeterProvider.
31+
func (s *SDK) MeterProvider() metric.MeterProvider {
32+
return s.meterProvider
33+
}
34+
35+
// NewSDK creates SDK providers based on the configuration model.
36+
func NewSDK(opts ...ConfigurationOption) (SDK, error) {
37+
o := configOptions{}
38+
for _, opt := range opts {
39+
o = opt.apply(o)
40+
}
41+
42+
return SDK{
43+
meterProvider: initMeterProvider(o),
44+
tracerProvider: initTracerProvider(o),
45+
}, nil
46+
}
47+
48+
// ConfigurationOption configures options for providers.
49+
type ConfigurationOption interface {
50+
apply(configOptions) configOptions
51+
}
52+
53+
type configurationOptionFunc func(configOptions) configOptions
54+
55+
func (fn configurationOptionFunc) apply(cfg configOptions) configOptions {
56+
return fn(cfg)
57+
}
58+
59+
// WithContext sets the context.Context for the SDK.
60+
func WithContext(ctx context.Context) ConfigurationOption {
61+
return configurationOptionFunc(func(c configOptions) configOptions {
62+
c.ctx = ctx
63+
return c
64+
})
65+
}
66+
67+
// WithOpenTelemetryConfiguration sets the OpenTelemetryConfiguration used
68+
// to produce the SDK.
69+
func WithOpenTelemetryConfiguration(cfg OpenTelemetryConfiguration) ConfigurationOption {
70+
return configurationOptionFunc(func(c configOptions) configOptions {
71+
c.opentelemetryConfig = cfg
72+
return c
73+
})
74+
}

config/config_test.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package config
5+
6+
import (
7+
"context"
8+
"testing"
9+
10+
"github.com/stretchr/testify/assert"
11+
"github.com/stretchr/testify/require"
12+
13+
"go.opentelemetry.io/otel/metric/noop"
14+
sdkmetric "go.opentelemetry.io/otel/sdk/metric"
15+
sdktrace "go.opentelemetry.io/otel/sdk/trace"
16+
"go.opentelemetry.io/otel/trace"
17+
)
18+
19+
func TestNewSDK(t *testing.T) {
20+
tests := []struct {
21+
name string
22+
cfg []ConfigurationOption
23+
wantTracerProvider any
24+
wantMeterProvider any
25+
wantErr error
26+
}{
27+
{
28+
name: "no-configuration",
29+
wantTracerProvider: trace.NewNoopTracerProvider(),
30+
wantMeterProvider: noop.NewMeterProvider(),
31+
},
32+
{
33+
name: "with-configuration",
34+
cfg: []ConfigurationOption{
35+
WithContext(context.Background()),
36+
WithOpenTelemetryConfiguration(OpenTelemetryConfiguration{
37+
TracerProvider: &TracerProvider{},
38+
MeterProvider: &MeterProvider{},
39+
}),
40+
},
41+
wantTracerProvider: &sdktrace.TracerProvider{},
42+
wantMeterProvider: &sdkmetric.MeterProvider{},
43+
},
44+
}
45+
for _, tt := range tests {
46+
sdk, err := NewSDK(tt.cfg...)
47+
require.Equal(t, tt.wantErr, err)
48+
assert.IsType(t, tt.wantTracerProvider, sdk.TracerProvider())
49+
assert.IsType(t, tt.wantMeterProvider, sdk.MeterProvider())
50+
}
51+
}

config/go.mod

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,21 @@
11
module go.opentelemetry.io/contrib/config
22

33
go 1.20
4+
5+
require (
6+
github.com/stretchr/testify v1.8.4
7+
go.opentelemetry.io/otel/metric v1.19.0
8+
go.opentelemetry.io/otel/sdk v1.19.0
9+
go.opentelemetry.io/otel/sdk/metric v1.19.0
10+
go.opentelemetry.io/otel/trace v1.19.0
11+
)
12+
13+
require (
14+
github.com/davecgh/go-spew v1.1.1 // indirect
15+
github.com/go-logr/logr v1.2.4 // indirect
16+
github.com/go-logr/stdr v1.2.2 // indirect
17+
github.com/pmezard/go-difflib v1.0.0 // indirect
18+
go.opentelemetry.io/otel v1.19.0 // indirect
19+
golang.org/x/sys v0.12.0 // indirect
20+
gopkg.in/yaml.v3 v3.0.1 // indirect
21+
)

config/go.sum

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
2+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3+
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
4+
github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ=
5+
github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
6+
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
7+
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
8+
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
9+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
10+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
11+
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
12+
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
13+
go.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs=
14+
go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY=
15+
go.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE=
16+
go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8=
17+
go.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o=
18+
go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A=
19+
go.opentelemetry.io/otel/sdk/metric v1.19.0 h1:EJoTO5qysMsYCa+w4UghwFV/ptQgqSL/8Ni+hx+8i1k=
20+
go.opentelemetry.io/otel/sdk/metric v1.19.0/go.mod h1:XjG0jQyFJrv2PbMvwND7LwCEhsJzCzV5210euduKcKY=
21+
go.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg=
22+
go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo=
23+
golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o=
24+
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
25+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
26+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
27+
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
28+
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

config/metric.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package config // import "go.opentelemetry.io/contrib/config"
5+
6+
import (
7+
"go.opentelemetry.io/otel/metric"
8+
"go.opentelemetry.io/otel/metric/noop"
9+
sdkmetric "go.opentelemetry.io/otel/sdk/metric"
10+
)
11+
12+
func initMeterProvider(cfg configOptions) metric.MeterProvider {
13+
if cfg.opentelemetryConfig.MeterProvider == nil {
14+
return noop.NewMeterProvider()
15+
}
16+
return sdkmetric.NewMeterProvider()
17+
}

config/metric_test.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package config
5+
6+
import (
7+
"testing"
8+
9+
"github.com/stretchr/testify/require"
10+
11+
"go.opentelemetry.io/otel/metric"
12+
"go.opentelemetry.io/otel/metric/noop"
13+
)
14+
15+
func TestInitMeterProvider(t *testing.T) {
16+
tests := []struct {
17+
name string
18+
cfg configOptions
19+
wantProvider metric.MeterProvider
20+
}{
21+
{
22+
name: "no-meter-provider-configured",
23+
wantProvider: noop.NewMeterProvider(),
24+
},
25+
}
26+
for _, tt := range tests {
27+
require.Equal(t, tt.wantProvider, initMeterProvider(tt.cfg))
28+
}
29+
}

config/trace.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package config // import "go.opentelemetry.io/contrib/config"
5+
6+
import (
7+
sdktrace "go.opentelemetry.io/otel/sdk/trace"
8+
"go.opentelemetry.io/otel/trace"
9+
)
10+
11+
func initTracerProvider(cfg configOptions) trace.TracerProvider {
12+
if cfg.opentelemetryConfig.TracerProvider == nil {
13+
return trace.NewNoopTracerProvider()
14+
}
15+
return sdktrace.NewTracerProvider()
16+
}

config/trace_test.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package config
5+
6+
import (
7+
"testing"
8+
9+
"github.com/stretchr/testify/require"
10+
11+
"go.opentelemetry.io/otel/trace"
12+
)
13+
14+
func TestInitTracerPovider(t *testing.T) {
15+
tests := []struct {
16+
name string
17+
cfg configOptions
18+
wantProvider trace.TracerProvider
19+
}{
20+
{
21+
name: "no-tracer-provider-configured",
22+
wantProvider: trace.NewNoopTracerProvider(),
23+
},
24+
}
25+
for _, tt := range tests {
26+
require.Equal(t, tt.wantProvider, initTracerProvider(tt.cfg))
27+
}
28+
}

0 commit comments

Comments
 (0)