diff --git a/CHANGELOG.md b/CHANGELOG.md index 30050e22649..adc7ed2bcaa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,10 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm - Change `Version()` function in `go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp` to a `const Version` string. (#8142) +### Fixed + +- Fix panic when passing nil `TracerProvider` or `MeterProvider` to `WithTracerProvider` or `WithMeterProvider` in `go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc`. (#8323) + ### Removed - The deprecated `DefaultClient`, `Get`, `Head`, `Post`, and `PostForm` in `go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp`. diff --git a/instrumentation/google.golang.org/grpc/otelgrpc/config.go b/instrumentation/google.golang.org/grpc/otelgrpc/config.go index 2dc8eaea93a..25f67a57411 100644 --- a/instrumentation/google.golang.org/grpc/otelgrpc/config.go +++ b/instrumentation/google.golang.org/grpc/otelgrpc/config.go @@ -125,7 +125,9 @@ func WithFilter(f Filter) Option { // creating a Tracer. func WithTracerProvider(tp trace.TracerProvider) Option { return optionFunc(func(c *config) { - c.TracerProvider = tp + if tp != nil { + c.TracerProvider = tp + } }) } @@ -133,7 +135,9 @@ func WithTracerProvider(tp trace.TracerProvider) Option { // creating a Meter. If this option is not provide the global MeterProvider will be used. func WithMeterProvider(mp metric.MeterProvider) Option { return optionFunc(func(c *config) { - c.MeterProvider = mp + if mp != nil { + c.MeterProvider = mp + } }) } diff --git a/instrumentation/google.golang.org/grpc/otelgrpc/stats_handler_test.go b/instrumentation/google.golang.org/grpc/otelgrpc/stats_handler_test.go index 3424247b796..bf34c29d62f 100644 --- a/instrumentation/google.golang.org/grpc/otelgrpc/stats_handler_test.go +++ b/instrumentation/google.golang.org/grpc/otelgrpc/stats_handler_test.go @@ -165,6 +165,37 @@ func TestWithPublicEndpointFn(t *testing.T) { } } +func TestNilProviderOption(t *testing.T) { + // Passing a nil TracerProvider or MeterProvider should not panic and + // should use the global provider instead. + t.Run("nil TracerProvider", func(t *testing.T) { + assert.NotPanics(t, func() { + _ = NewClientHandler(WithTracerProvider(nil)) + }) + assert.NotPanics(t, func() { + _ = NewServerHandler(WithTracerProvider(nil)) + }) + }) + + t.Run("nil MeterProvider", func(t *testing.T) { + assert.NotPanics(t, func() { + _ = NewClientHandler(WithMeterProvider(nil)) + }) + assert.NotPanics(t, func() { + _ = NewServerHandler(WithMeterProvider(nil)) + }) + }) + + t.Run("both nil", func(t *testing.T) { + assert.NotPanics(t, func() { + _ = NewClientHandler(WithTracerProvider(nil), WithMeterProvider(nil)) + }) + assert.NotPanics(t, func() { + _ = NewServerHandler(WithTracerProvider(nil), WithMeterProvider(nil)) + }) + }) +} + func TestNilInstruments(t *testing.T) { mp := meterProvider{} opts := []Option{WithMeterProvider(mp)}