Skip to content

Commit cb256d4

Browse files
make DefaultClient immutable
1 parent 79904a3 commit cb256d4

File tree

2 files changed

+25
-20
lines changed

2 files changed

+25
-20
lines changed

instrumentation/net/http/otelhttp/client.go

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,27 @@ import (
99
"net/http"
1010
"net/url"
1111
"strings"
12+
"sync"
1213
)
1314

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

1926
// Get is a convenient replacement for http.Get that adds a span around the request.
2027
func Get(ctx context.Context, targetURL string) (resp *http.Response, err error) {
2128
req, err := http.NewRequestWithContext(ctx, http.MethodGet, targetURL, http.NoBody)
2229
if err != nil {
2330
return nil, err
2431
}
25-
return DefaultClient.Do(req)
32+
return GetDefaultClient().Do(req)
2633
}
2734

2835
// Head is a convenient replacement for http.Head that adds a span around the request.
@@ -31,7 +38,7 @@ func Head(ctx context.Context, targetURL string) (resp *http.Response, err error
3138
if err != nil {
3239
return nil, err
3340
}
34-
return DefaultClient.Do(req)
41+
return GetDefaultClient().Do(req)
3542
}
3643

3744
// Post is a convenient replacement for http.Post that adds a span around the request.
@@ -41,7 +48,7 @@ func Post(ctx context.Context, targetURL, contentType string, body io.Reader) (r
4148
return nil, err
4249
}
4350
req.Header.Set("Content-Type", contentType)
44-
return DefaultClient.Do(req)
51+
return GetDefaultClient().Do(req)
4552
}
4653

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

instrumentation/net/http/otelhttp/client_test.go

Lines changed: 11 additions & 13 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,27 +38,27 @@ 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
}
4745
res.Body.Close()
4846

49-
res, err = otelhttp.Head(ctx, ts.URL)
47+
res, err = Head(ctx, ts.URL)
5048
if err != nil {
5149
t.Fatal(err)
5250
}
5351
res.Body.Close()
5452

55-
res, err = otelhttp.Post(ctx, ts.URL, "text/plain", strings.NewReader("test"))
53+
res, err = Post(ctx, ts.URL, "text/plain", strings.NewReader("test"))
5654
if err != nil {
5755
t.Fatal(err)
5856
}
5957
res.Body.Close()
6058

6159
form := make(url.Values)
6260
form.Set("foo", "bar")
63-
res, err = otelhttp.PostForm(ctx, ts.URL, form)
61+
res, err = PostForm(ctx, ts.URL, form)
6462
if err != nil {
6563
t.Fatal(err)
6664
}
@@ -90,7 +88,7 @@ func TestClientWithTraceContext(t *testing.T) {
9088
}))
9189
defer ts.Close()
9290

93-
res, err := otelhttp.Get(ctx, ts.URL)
91+
res, err := Get(ctx, ts.URL)
9492
if err != nil {
9593
t.Fatal(err)
9694
}

0 commit comments

Comments
 (0)