Skip to content

Commit

Permalink
config: add SDK.Shutdown method (#4583)
Browse files Browse the repository at this point in the history
  • Loading branch information
Alex Boten committed Nov 24, 2023
1 parent 9f26914 commit ab49dc8
Show file tree
Hide file tree
Showing 7 changed files with 41 additions and 10 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
### Added

- Add the new `go.opentelemetry.io/contrib/instrgen` package to provide auto-generated source code instrumentation. (#3068, #3108)
- Add `SDK.Shutdown` method in `"go.opentelemetry.io/contrib/config"`. (#4583)

### Fixed

Expand Down
24 changes: 22 additions & 2 deletions config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ package config // import "go.opentelemetry.io/contrib/config"

import (
"context"
"errors"

"go.opentelemetry.io/otel/metric"
"go.opentelemetry.io/otel/trace"
Expand All @@ -15,11 +16,18 @@ type configOptions struct {
opentelemetryConfig OpenTelemetryConfiguration
}

type shutdownFunc func(context.Context) error

func noopShutdown(context.Context) error {
return nil
}

// SDK is a struct that contains all the providers
// configured via the configuration model.
type SDK struct {
meterProvider metric.MeterProvider
tracerProvider trace.TracerProvider
shutdown shutdownFunc
}

// TracerProvider returns a configured trace.TracerProvider.
Expand All @@ -32,6 +40,11 @@ func (s *SDK) MeterProvider() metric.MeterProvider {
return s.meterProvider
}

// Shutdown calls shutdown on all configured providers.
func (s *SDK) Shutdown(ctx context.Context) error {
return s.shutdown(ctx)
}

// NewSDK creates SDK providers based on the configuration model.
//
// Caution: The implementation only returns noop providers.
Expand All @@ -41,9 +54,16 @@ func NewSDK(opts ...ConfigurationOption) (SDK, error) {
o = opt.apply(o)
}

mp, mpShutdown := initMeterProvider(o)
tp, tpShutdown := initTracerProvider(o)

return SDK{
meterProvider: initMeterProvider(o),
tracerProvider: initTracerProvider(o),
meterProvider: mp,
tracerProvider: tp,
shutdown: func(ctx context.Context) error {
err := mpShutdown(ctx)
return errors.Join(err, tpShutdown(ctx))
},
}, nil
}

Expand Down
2 changes: 2 additions & 0 deletions config/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ func TestNewSDK(t *testing.T) {
wantTracerProvider any
wantMeterProvider any
wantErr error
wantShutdownErr error
}{
{
name: "no-configuration",
Expand All @@ -47,5 +48,6 @@ func TestNewSDK(t *testing.T) {
require.Equal(t, tt.wantErr, err)
assert.IsType(t, tt.wantTracerProvider, sdk.TracerProvider())
assert.IsType(t, tt.wantMeterProvider, sdk.MeterProvider())
require.Equal(t, tt.wantShutdownErr, sdk.Shutdown(context.Background()))
}
}
7 changes: 4 additions & 3 deletions config/metric.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,10 @@ import (
sdkmetric "go.opentelemetry.io/otel/sdk/metric"
)

func initMeterProvider(cfg configOptions) metric.MeterProvider {
func initMeterProvider(cfg configOptions) (metric.MeterProvider, shutdownFunc) {
if cfg.opentelemetryConfig.MeterProvider == nil {
return noop.NewMeterProvider()
return noop.NewMeterProvider(), noopShutdown
}
return sdkmetric.NewMeterProvider()
mp := sdkmetric.NewMeterProvider()
return mp, mp.Shutdown
}
5 changes: 4 additions & 1 deletion config/metric_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,16 @@ func TestInitMeterProvider(t *testing.T) {
name string
cfg configOptions
wantProvider metric.MeterProvider
wantErr error
}{
{
name: "no-meter-provider-configured",
wantProvider: noop.NewMeterProvider(),
},
}
for _, tt := range tests {
require.Equal(t, tt.wantProvider, initMeterProvider(tt.cfg))
mp, err := initMeterProvider(tt.cfg)
require.Equal(t, tt.wantProvider, mp)
require.NoError(t, tt.wantErr, err)
}
}
7 changes: 4 additions & 3 deletions config/trace.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,10 @@ import (
"go.opentelemetry.io/otel/trace/noop"
)

func initTracerProvider(cfg configOptions) trace.TracerProvider {
func initTracerProvider(cfg configOptions) (trace.TracerProvider, shutdownFunc) {
if cfg.opentelemetryConfig.TracerProvider == nil {
return noop.NewTracerProvider()
return noop.NewTracerProvider(), noopShutdown
}
return sdktrace.NewTracerProvider()
tp := sdktrace.NewTracerProvider()
return tp, tp.Shutdown
}
5 changes: 4 additions & 1 deletion config/trace_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,16 @@ func TestInitTracerPovider(t *testing.T) {
name string
cfg configOptions
wantProvider trace.TracerProvider
wantErr error
}{
{
name: "no-tracer-provider-configured",
wantProvider: noop.NewTracerProvider(),
},
}
for _, tt := range tests {
require.Equal(t, tt.wantProvider, initTracerProvider(tt.cfg))
tp, err := initTracerProvider(tt.cfg)
require.Equal(t, tt.wantProvider, tp)
require.NoError(t, tt.wantErr, err)
}
}

0 comments on commit ab49dc8

Please sign in to comment.