Skip to content

Commit 0c5a22d

Browse files
make DefaultClient immutable
1 parent 79904a3 commit 0c5a22d

File tree

2 files changed

+27
-23
lines changed

2 files changed

+27
-23
lines changed

instrumentation/net/http/otelhttp/client.go

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,23 @@ import (
1111
"strings"
1212
)
1313

14-
// DefaultClient is the default Client and is used by Get, Head, Post and PostForm.
14+
// defaultClient is the default Client and is used by Get, Head, Post and PostForm.
1515
// Please be careful of initialization order - for example, if you change
1616
// the global propagator, the DefaultClient might still be using the old one.
17-
var DefaultClient = &http.Client{Transport: NewTransport(http.DefaultTransport)}
17+
var defaultClient = &http.Client{Transport: NewTransport(http.DefaultTransport)}
18+
19+
// GetDefaultClient provides the default Client that is used by Get, Head, Post and PostForm.
20+
func GetDefaultClient() *http.Client {
21+
return defaultClient
22+
}
1823

1924
// Get is a convenient replacement for http.Get that adds a span around the request.
2025
func Get(ctx context.Context, targetURL string) (resp *http.Response, err error) {
2126
req, err := http.NewRequestWithContext(ctx, http.MethodGet, targetURL, http.NoBody)
2227
if err != nil {
2328
return nil, err
2429
}
25-
return DefaultClient.Do(req)
30+
return GetDefaultClient().Do(req)
2631
}
2732

2833
// Head is a convenient replacement for http.Head that adds a span around the request.
@@ -31,7 +36,7 @@ func Head(ctx context.Context, targetURL string) (resp *http.Response, err error
3136
if err != nil {
3237
return nil, err
3338
}
34-
return DefaultClient.Do(req)
39+
return GetDefaultClient().Do(req)
3540
}
3641

3742
// Post is a convenient replacement for http.Post that adds a span around the request.
@@ -41,7 +46,7 @@ func Post(ctx context.Context, targetURL, contentType string, body io.Reader) (r
4146
return nil, err
4247
}
4348
req.Header.Set("Content-Type", contentType)
44-
return DefaultClient.Do(req)
49+
return GetDefaultClient().Do(req)
4550
}
4651

4752
// PostForm is a convenient replacement for http.PostForm that adds a span around the request.

instrumentation/net/http/otelhttp/client_test.go

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// Copyright The OpenTelemetry Authors
22
// SPDX-License-Identifier: Apache-2.0
33

4-
package otelhttp_test
4+
package otelhttp
55

66
import (
77
"net/http"
@@ -14,21 +14,19 @@ import (
1414
"github.com/stretchr/testify/require"
1515
"go.opentelemetry.io/otel/sdk/trace"
1616
"go.opentelemetry.io/otel/sdk/trace/tracetest"
17-
18-
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
1917
)
2018

2119
func TestConvenienceWrappers(t *testing.T) {
2220
sr := tracetest.NewSpanRecorder()
2321
provider := trace.NewTracerProvider(trace.WithSpanProcessor(sr))
24-
orig := otelhttp.DefaultClient
25-
otelhttp.DefaultClient = &http.Client{
26-
Transport: otelhttp.NewTransport(
22+
orig := GetDefaultClient()
23+
defaultClient = &http.Client{
24+
Transport: NewTransport(
2725
http.DefaultTransport,
28-
otelhttp.WithTracerProvider(provider),
26+
WithTracerProvider(provider),
2927
),
3028
}
31-
defer func() { otelhttp.DefaultClient = orig }()
29+
defer func() { defaultClient = orig }()
3230

3331
content := []byte("Hello, world!")
3432

@@ -40,31 +38,32 @@ func TestConvenienceWrappers(t *testing.T) {
4038
defer ts.Close()
4139

4240
ctx := t.Context()
43-
res, err := otelhttp.Get(ctx, ts.URL)
41+
res, err := Get(ctx, ts.URL)
4442
if err != nil {
4543
t.Fatal(err)
4644
}
47-
res.Body.Close()
4845

49-
res, err = otelhttp.Head(ctx, ts.URL)
46+
require.NoError(t, res.Body.Close())
47+
48+
res, err = Head(ctx, ts.URL)
5049
if err != nil {
5150
t.Fatal(err)
5251
}
53-
res.Body.Close()
52+
require.NoError(t, res.Body.Close())
5453

55-
res, err = otelhttp.Post(ctx, ts.URL, "text/plain", strings.NewReader("test"))
54+
res, err = Post(ctx, ts.URL, "text/plain", strings.NewReader("test"))
5655
if err != nil {
5756
t.Fatal(err)
5857
}
59-
res.Body.Close()
58+
require.NoError(t, res.Body.Close())
6059

6160
form := make(url.Values)
6261
form.Set("foo", "bar")
63-
res, err = otelhttp.PostForm(ctx, ts.URL, form)
62+
res, err = PostForm(ctx, ts.URL, form)
6463
if err != nil {
6564
t.Fatal(err)
6665
}
67-
res.Body.Close()
66+
require.NoError(t, res.Body.Close())
6867

6968
spans := sr.Ended()
7069
require.Len(t, spans, 4)
@@ -90,11 +89,11 @@ func TestClientWithTraceContext(t *testing.T) {
9089
}))
9190
defer ts.Close()
9291

93-
res, err := otelhttp.Get(ctx, ts.URL)
92+
res, err := Get(ctx, ts.URL)
9493
if err != nil {
9594
t.Fatal(err)
9695
}
97-
res.Body.Close()
96+
require.NoError(t, res.Body.Close())
9897

9998
span.End()
10099

0 commit comments

Comments
 (0)