Skip to content

Commit 8bbd4ef

Browse files
committed
fix(otelgrpc): prevent panic when nil TracerProvider or MeterProvider is passed
Commit 07504e4 removed nil checks from WithTracerProvider and WithMeterProvider, causing a panic when callers pass nil. This restores the checks so nil values are ignored and the global provider is used. Signed-off-by: Davanum Srinivas <[email protected]>
1 parent 1e370bc commit 8bbd4ef

File tree

3 files changed

+41
-2
lines changed

3 files changed

+41
-2
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
1212

1313
- Change `Version()` function in `go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp` to a `const Version` string. (#8142)
1414

15+
### Fixed
16+
17+
- Fix panic when passing nil `TracerProvider` or `MeterProvider` to `WithTracerProvider` or `WithMeterProvider` in `go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc`. (#8323)
18+
1519
### Removed
1620

1721
- The deprecated `DefaultClient`, `Get`, `Head`, `Post`, and `PostForm` in `go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp`.

instrumentation/google.golang.org/grpc/otelgrpc/config.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,15 +125,19 @@ func WithFilter(f Filter) Option {
125125
// creating a Tracer.
126126
func WithTracerProvider(tp trace.TracerProvider) Option {
127127
return optionFunc(func(c *config) {
128-
c.TracerProvider = tp
128+
if tp != nil {
129+
c.TracerProvider = tp
130+
}
129131
})
130132
}
131133

132134
// WithMeterProvider returns an Option to use the MeterProvider when
133135
// creating a Meter. If this option is not provide the global MeterProvider will be used.
134136
func WithMeterProvider(mp metric.MeterProvider) Option {
135137
return optionFunc(func(c *config) {
136-
c.MeterProvider = mp
138+
if mp != nil {
139+
c.MeterProvider = mp
140+
}
137141
})
138142
}
139143

instrumentation/google.golang.org/grpc/otelgrpc/stats_handler_test.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,37 @@ func TestWithPublicEndpointFn(t *testing.T) {
165165
}
166166
}
167167

168+
func TestNilProviderOption(t *testing.T) {
169+
// Passing a nil TracerProvider or MeterProvider should not panic and
170+
// should use the global provider instead.
171+
t.Run("nil TracerProvider", func(t *testing.T) {
172+
assert.NotPanics(t, func() {
173+
_ = NewClientHandler(WithTracerProvider(nil))
174+
})
175+
assert.NotPanics(t, func() {
176+
_ = NewServerHandler(WithTracerProvider(nil))
177+
})
178+
})
179+
180+
t.Run("nil MeterProvider", func(t *testing.T) {
181+
assert.NotPanics(t, func() {
182+
_ = NewClientHandler(WithMeterProvider(nil))
183+
})
184+
assert.NotPanics(t, func() {
185+
_ = NewServerHandler(WithMeterProvider(nil))
186+
})
187+
})
188+
189+
t.Run("both nil", func(t *testing.T) {
190+
assert.NotPanics(t, func() {
191+
_ = NewClientHandler(WithTracerProvider(nil), WithMeterProvider(nil))
192+
})
193+
assert.NotPanics(t, func() {
194+
_ = NewServerHandler(WithTracerProvider(nil), WithMeterProvider(nil))
195+
})
196+
})
197+
}
198+
168199
func TestNilInstruments(t *testing.T) {
169200
mp := meterProvider{}
170201
opts := []Option{WithMeterProvider(mp)}

0 commit comments

Comments
 (0)